如何从另一个 AWS 账户中复制 S3 对象?

上次更新时间:2020 年 3 月 27 日

我想要从另一个 AWS 账户中的存储桶中复制 Amazon Simple Storage Service (Amazon S3) 对象。然后,我希望确保我的账户(目标账户)拥有复制的对象。该如何操作?

简短描述

要确保目标账户拥有从另一个账户复制的 S3 对象,请授予目标账户执行跨账户复制的权限。按照以下步骤配置跨账户权限,将对象从账户 A 中的源存储桶复制到账户 B 中的目标存储桶:

1.    将存储桶策略附加到账户 A 中的源存储桶。

2.    将 AWS Identity and Access Management (IAM) 策略附加到账户 B 中的用户或角色。

3.    使用账户 B 中的 IAM 用户或角色执行跨账户复制。

重要提示:如果源存储库或目标存储库具有启用了 AWS Key Management Service (AWS KMS) 的默认加密,您还必须修改与 AWS KMS 密钥相关的权限。有关说明,请参阅我的 Amazon S3 存储桶具有使用自定义 AWS KMS 密钥的默认加密。我如何允许用户从存储桶下载和上传到存储桶? 

默认情况下,S3 对象归上传此对象的账户所有。这就是向目标账户授予执行跨账户复制的权限的原因,这可确保目标账户拥有复制的对象。您还可以通过将访问控制列表 (ACL) 更改为存储桶拥有者完全控制来更改对象的所有权。但是,如果存在多个对象,则对象 ACL 可能很难管理,因此最佳做法是向目标账户授予编程性跨账户权限。

对象所有权对于使用存储桶策略管理权限非常重要。要将存储桶策略应用于存储桶中的对象,对象必须归拥有该存储桶的账户所有。您还可以使用对象的 ACL 管理对象权限。但是,如果存在多个对象,则对象 ACL 可能很难管理,因此最佳做法是将存储桶策略用作设置权限的集中式方法。

解决方法

将存储桶策略附加到账户 A 中的源存储桶

1.    获取账户 B(目标账户)中 IAM 身份(用户或角色)的 Amazon 资源名称 (ARN)。

2.    在账户 A 中,将存储桶策略附加到源存储桶,以允许账户 B 中的 IAM 身份获取类似以下内容的对象: 

重要提示:对于委托人的值,请将 arn:aws:iam::222222222222:user/Jane 替换为账户 B 中 IAM 身份的 ARN。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "DelegateS3Access",
            "Effect": "Allow",
            "Principal": {"AWS": "arn:aws:iam::222222222222:user/Jane"},
            "Action": ["s3:ListBucket","s3:GetObject"],
            "Resource": [
                "arn:aws:s3:::awsexamplesourcebucket/*",
                "arn:aws:s3:::awsexamplesourcebucket"
            ]
        }
    ]
}

将 IAM 策略附加到账户 B 中的用户或角色

1.    在账户 B 中,创建 IAM 客户托管策略,它允许 IAM 用户或角色将对象从账户 A 中的源存储桶复制到账户 B 中的目标存储桶。该策略可以类似于以下示例:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::awsexamplesourcebucket",
                "arn:aws:s3:::awsexamplesourcebucket/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": [
                "arn:aws:s3:::awsexampledestinationbucket",
                "arn:aws:s3:::awsexampledestinationbucket/*"
            ]
        }
    ]
}

2.    将客户托管策略附加到您要用于在账户之间复制对象的 IAM 用户或角色

使用账户 B 中的 IAM 用户或角色执行跨账户复制

设置存储桶策略和 IAM 策略后,账户 B 中的 IAM 用户或角色可以执行从账户 A 到账户 B 的复制操作。然后,账户 B 将拥有复制的对象。

要将账户 A 中源存储桶的所有内容同步到账户 B 中的目标存储桶,账户 B 中的 IAM 用户或角色可以使用 AWS 命令行界面 (AWS CLI) 运行 sync 命令:

aws s3 sync s3://awsexamplesourcebucket s3://awsexampledestinationbucket