跨区域复制功能可将一个存储空间(Bucket)内的数据对象,自动、异步地复制到另一个阿里云账号下、位于不同地域的目标 Bucket 中,以实现异地容灾、创建跨账号的隔离备份,或满足数据驻留的合规性要求。
配置跨账号复制需要源账号和目标账号共同操作,分为三个步骤:
源账号操作:创建专用于数据复制的RAM角色,并授予其读取源Bucket数据的的最小权限。
目标账号操作:修改目标 Bucket 的授权策略,允许源账号创建的 RAM 角色向其中写入数据。
返回源账号操作:创建跨区域复制规则,将源 Bucket 和目标 Bucket 关联起来,正式启动复制任务。
步骤一:源账号创建RAM角色并授权
创建RAM角色:进入创建RAM角色页面,信任主体类型选择云服务,信任主体名称选择对象存储。
为RAM角色授予访问源Bucket的权限:创建一个仅包含复制所需权限的自定义策略用于读取源Bucket数据以启动复制任务:
在创建权限策略页面,单击脚本编辑页签。将以下策略内容粘贴到策略编辑器中,并将
src-bucket替换为实际的源Bucket名称。{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:ReplicateList", "oss:ReplicateGet" ], "Resource": [ "acs:oss:*:*:src-bucket", "acs:oss:*:*:src-bucket/*" ] } ] }创建策略后,在角色页面,列表中找到刚创建的角色,单击新增授权。在新增授权面板中,授权主体已自动填充,权限策略选择上一步创建的自定义策略,然后单击确认新增授权。
(可选)为RAM角色授予访问KMS的权限:如果复制到目标Bucket的数据会使用KMS加密,则需要为该RAM角色授予KMS访问权限。
在角色页面,列表中找到刚创建的角色,单击新增授权。在新增授权面板中,授权主体已自动填充,权限策略选择
AliyunKMSCryptoUserAccess,然后单击确认新增授权。记录角色ARN:在角色页面找到创建RAM角色,进入基本信息页面,复制角色的ARN备用。格式为
acs:ram::{源账号UID}:role/{角色名}。
步骤二:目标账号授权RAM角色并准备资源
授权RAM角色写入目标Bucket:在目标账号侧,修改目标Bucket的授权策略,允许源账号的RAM角色向其中写入数据。
使用目标账号进入Bucket列表页面,单击目标Bucket。
在左侧导航栏,选择权限控制 > Bucket 授权策略。
单击按图形策略添加页签,然后单击接收复制对象。
在弹出的面板中,按如下说明配置:
UID及RAM角色获取方式: 选择从源端复制RAM角色ARN获取。
源端复制RAM角色ARN: 输入步骤一记录的源账号的RAM角色ARN。
授权用途: 选择跨账号区域复制。
单击生成Policy,然后单击保存。
(可选) 配置目标端KMS密钥:若要复制 KMS 加密的对象,或目标 Bucket 启用了 KMS 加密,需在目标账号中预先配置 KMS 密钥,为密钥设置密钥策略,授予源账号RAM角色使用该密钥的权限。设置密钥策略时,将源账号创建的RAM角色ARN添加为其他账号使用者。
此操作默认会授予该角色解密(
kms:Decrypt)和生成数据密钥(kms:GenerateDataKey)的权限等必要权限,允许其使用此密钥在目标Bucket中创建加密对象。通过控制台向导配置通常会默认包含所需权限,但若通过OpenAPI设置自定义密钥策略,请务必手动确认这些权限已正确添加。
步骤三:源账号创建跨区域复制规则
完成授权后,返回源账号控制台创建复制规则,正式启动任务。
使用源账号进入Bucket列表页面,单击源Bucket。
在左侧导航栏,选择数据管理 > 跨区域复制。
单击跨区域复制,在弹出的对话框中配置以下参数:
设置目标Bucket:选择在另一个账号中指定一个Bucket,选择目标Bucket所在地域并输入其名称。
设置复制策略:
数据复制对象:选择全部文件进行同步或指定文件名前缀进行同步。在源 Bucket内指定前缀的Object复制到目标Bucket,默认最多可以添加10个前缀。如需增加前缀数量,请联系技术支持申请调整,最多可提升至30个。
数据复制策略:选择数据同步的方式。在数据容灾场景下,选择增/改 同步可防止源Bucket的意外删除操作同步到备份Bucket,增强数据安全性。
增/改 同步:仅同步新建和修改的对象。删除源Bucket中的对象不会影响目标Bucket。通过这种方式,可以有效防止因源Bucket手动删除、通过生命周期自动删除的行为导致目标Bucket数据丢失的问题。
增/删/改 同步:同步新建、修改和删除操作,使目标Bucket与源Bucket保持一致。通过这种方式,确保了数据的一致性,适用于需要共享和访问同一数据集的多用户或应用程序环境。但是配置该策略后,当手动删除或者通过生命周期自动删除源Bucket内的Object时,目标Bucket也会删除对应的Object,且Object删除后无法恢复。
复制历史数据:选择是否复制规则生效前源Bucket中已有的数据。此操作会覆盖目标 Bucket 中的同名对象。为避免数据丢失,建议为源和目标Bucket都开启版本控制功能。
(可选)复制 KMS 加密目标对象:如果源端对象已使用KMS加密,并且希望在目标端也保持加密状态,请勾选此项,并提供在步骤二中准备的目标端KMS密钥ARN。
说明可以通过HeadObject和GetBucketEncryption分别查询源Object和目标Bucket的加密状态。
授权角色:从下拉列表中选择步骤一中源账号创建的RAM角色。
(可选)设置复制加速:
传输加速: 当复制任务涉及中国内地与非中国内地地域时,可开启此功能以提升数据传输速度,此功能会产生额外传输加速费用。
数据复制时间控制(RTC): 将绝大多数增量数据的复制延迟控制在10分钟内。此功能仅在部分地域间支持且会产生额外跨区域复制RTC费用。详情请参见RTC功能说明。
说明跨区域复制规则一旦创建,将无法修改或删除。请在单击“确定”前仔细检查所有配置项。如需终止复制,可通过关闭复制任务的方式停止数据同步。
确认所有配置无误后,单击确定并确认开启。
复制任务将在规则创建成功后的几分钟内启动。数据复制为异步过程,具体耗时取决于对象大小、数量以及跨地域网络延迟,可能从几分钟到几小时不等。可在源Bucket的跨区域复制页签查看复制进度,包括历史数据和增量数据的同步状态。
常见问题
为什么源Bucket中对象的存储类型或最后访问时间变更后,没有同步到目标Bucket?
数据复制操作仅由对象内容的变更(如增/删/改)触发。通过生命周期规则或 CopyObject 操作更改存储类型,以及最后访问时间(LastAccessTime)的更新不涉及对象内容的写入,因此不会触发新的复制任务,目标 Bucket 中的对象副本不会更新。
解决方案:
同步存储类型:建议在目标 Bucket 上配置与源Bucket一致的生命周期规则,以实现相同的存储类型转换。
更新
LastAccessTime:若需更新目标对象的最后访问时间,请直接在目标 Bucket 中访问该对象(例如执行GetObject请求),以触发其LastAccessTime的刷新。
分片上传的对象会被复制吗?
当通过分片上传方式上传的Object,每个分片的上传操作都会复制至目标Bucket。且在源Bucket中完成合并(CompleteMultipartUpload)后生成的完整对象也会被作为一个整体复制到目标Bucket。
为源账号的 RAM 角色授权时,有比自定义策略更简单的授权方式吗?
有。如果您希望快速授权,可以直接为创建的 RAM 角色授予阿里云官方提供的系统策略 AliyunOSSFullAccess。但该策略包含您账号下所有 OSS 资源的所有权限,权限范围过大,不推荐在生产环境中使用。
为目标 Bucket 授权时,除了图形化界面,是否支持通过 JSON 策略进行配置?
支持。您可以在目标 Bucket 的Bucket 授权策略页面选择按语法策略添加来进行更灵活的配置。使用 JSON 策略时需注意以下几点:
新添加的策略会覆盖已有的 Bucket 策略,因此请确保新策略包含了所有需要的授权规则。
策略中的
Principal字段需要填写源账号中 RAM 角色的 ARN。如果角色名称中包含大写字母,在策略中需要转换为小写。例如,角色
AliyunOssDrsRole在策略中应写为aliyunossdrsrole。需要准确填写源账号的 UID 和目标 Bucket 的名称及目标账号的UID。
一个策略示例如下:
{
    "Version":"1",
    "Statement":[
        {
            "Effect":"Allow",
            "Action":[
                "oss:ReplicateList",
                "oss:ReplicateGet",
                "oss:ReplicatePut",
                "oss:ReplicateDelete"
            ],
            "Principal": [
                "arn:sts::{源账号UID}:assumed-role/{角色名}/*"
            ],
            "Resource":[
                "acs:oss:*:{目标账号UID}:{目标Bucket名}",
                "acs:oss:*:{目标账号UID}:{目标Bucket名}/*"
            ]
        }
    ]
}