使用 AWS CLI 将数据从 S3 存储桶复制到其他账户和区域 - AWS Prescriptive Guidance

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 AWS CLI 将数据从 S3 存储桶复制到其他账户和区域

由 Appasaheb Bagali (AWS) 和 Purushotham G K (AWS) 编写

摘要

此示例介绍了以下操作:将数据从 AWS 源账户的 Amazon Simple Storage Service (Amazon S3) 存储桶迁移至其他 Amazon Web Services account(相同或不同 AWS 区域中)中的目标 S3 存储桶。

源 S3 存储桶通过使用附加资源策略,可允许 AWS Identity and Access Management (IAM) 访问。目标账户中的用户必须代入拥有源存储桶 PutObjectGetObject 权限的角色。最后,运行 copysync 命令,将数据从源 S3 存储桶传输至目标 S3 存储桶。

账户拥有他们上传至 S3 存储桶的对象。如果您跨账户和地区复制对象,则将复制对象的权限授予目标账户。若要更改对象所有权,您可将其访问控制列表(ACL)更改为 bucket-owner-full-control。但是,我们建议您向目标账户授予编程跨账户权限,因为 ACLs 可能很难管理多个对象。

警告

这种情况需要具有编程访问权限和长期证书的 IAM 用户,这会带来安全风险。为帮助减轻这种风险,我们建议仅向这些用户提供执行任务所需的权限,并在不再需要这些用户时将其移除。必要时可以更新访问密钥。有关更多信息,请参阅《IAM 用户指南》中的 更新访问密钥

此模式涵盖一次性迁移。对于需要将新对象从源存储桶持续自动迁移到目标存储桶的场景,您可以改用 S3 Batch Replication,如使用 S3 Batch Replic ation 将数据从 S3 存储桶复制到另一个账户和区域模式中所述。

先决条件和限制

  • 位于相同或跨不同 AWS 区域中的两个活跃 Amazon Web Services account。

  • 源账户中的现有 S3 存储桶。 

  • 如果您的源存储桶或目标 Amazon S3 存储桶启用了默认加密,则必须修改 AWS Key Management Service (AWS KMS) 密钥权限。有关更多信息,请参阅有关此主题的AWS re:Post 文章

  • 熟悉跨账户权限。

架构

将 Amazon S3 数据复制至其他账户或地区

工具

最佳实践

操作说明

Task描述所需技能

创建 IAM 用户并获取访问密钥。

  1. 登录 AWS 管理控制台,创建具有编程访问权限的 IAM 用户。有关详细步骤,请参阅 IAM 文档中的创建 IAM 用户。无需为此用户附加任何策略。

  2. 为该用户生成访问密钥与私有密钥。有关说明,请参阅 AWS 文档中的 Amazon Web Services account 和访问密钥

AWS DevOps

创建基于 IAM 身份的策略。

使用以下权限,创建名为 S3MigrationPolicy 的基于 IAM 身份的策略。有关详细步骤,请参阅 IAM 文档中的创建 IAM policy

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:ListBucket", "s3:GetObject", "s3:GetObjectTagging", "s3:GetObjectVersion", "s3:GetObjectVersionTagging" ], "Resource": [ "arn:aws:s3:::amazon-s3-demo-source-bucket", "arn:aws:s3:::amazon-s3-demo-source-bucket/*" ] }, { "Effect": "Allow", "Action": [ "s3:ListBucket", "s3:PutObject", "s3:PutObjectAcl", "s3:PutObjectTagging", "s3:GetObjectTagging", "s3:GetObjectVersion", "s3:GetObjectVersionTagging" ], "Resource": [ "arn:aws:s3:::amazon-s3-demo-destination-bucket", "arn:aws:s3:::amazon-s3-demo-destination-bucket/*" ] } ] }
注意

根据您的用例修改源存储桶和目标存储桶名称。

这种基于身份的策略允许此角色用户访问源存储桶和目标存储桶。

AWS DevOps

创建一个 IAM 角色。

使用以下信任策略,创建名为 S3MigrationRole 的IAM 角色,然后附加之前创建的 S3MigrationPolicy。有关详细步骤,请参阅 IAM 中的创建向 IAM 用户委派权限的角色

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::<destination_account>:user/<user_name>" }, "Action": "sts:AssumeRole", "Condition": {} } ] }
注意

根据您的用例,修改信任策略中目标 IAM 角色或用户名的亚马逊资源名称 (ARN)。

此信任策略允许新创建 IAM 用户代入 S3MigrationRole

AWS DevOps
Task描述所需技能

创建并附加 S3 存储桶策略。

登录源账户的 AWS 管理控制台 并打开 Amazon S3 控制台。选择源 S3 存储桶,然后选择权限。在存储桶策略下,选择编辑,然后粘贴以下存储桶策略。选择保存

{ "Version": "2012-10-17", "Statement": [ { "Sid": "DelegateS3Access", "Effect": "Allow", "Principal": {"AWS": "arn:aws:iam::<destination_account>:role/<RoleName>"}, "Action": ["s3:ListBucket", "s3:GetObject", "s3:GetObjectTagging", "s3:GetObjectVersion", "s3:GetObjectVersionTagging" ], "Resource": [ "arn:aws:s3:::amazon-s3-demo-source-bucket/*", "arn:aws:s3:::amazon-s3-demo-source-bucket" ] } ] }
注意

请确保包含目标账户的 AWS 账户 ID,并根据您的要求配置存储桶策略模板。

此基于资源的策略允许目标角色 S3MigrationRole 访问源账户中的 S3 对象。

云管理员
Task描述所需技能

创建目标 S3 存储桶。

登录您的目标账户的 AWS 管理控制台,打开 Amazon S3 控制台,然后选择创建存储桶。根据您的要求创建 S3 存储桶。有关更多信息,请参阅 Amazon S3 文档中的创建存储桶。 

云管理员
Task描述所需技能

使用新创建的用户凭证配置 AWS CLI。

  1. 安装最新版本 AWS CLI。有关说明,请参阅 AWS CLI 文档中安装或更新最新版本的 AWS CLI

  2. 使用您创建的用户的 AWS 访问密钥运行 $ aws configure 并更新 CLI。有关更多信息,请参阅 AWS CLI 文档中的《 用户指南》中的配置和凭证文件设置

AWS DevOps

代入 S3 迁移角色。

  1. 使用 AWS CLI 代入 S3MigrationRole

    aws sts assume-role \ --role-arn "arn:aws:iam::<destination_account>:role/S3MigrationRole" \ --role-session-name AWSCLI-Session

    此命令输出多条信息。在凭证数据块中,您需要 AccessKeyIdSecretAccessKeySessionToken。此示例使用环境变量 RoleAccessKeyIDRoleSecretKeyRoleSessionToken。请注意,过期字段的时间戳参见 UTC 时区。时间戳指示 IAM 角色的临时凭证的过期时间。如果临时凭证过期,则必须再次调用 sts:AssumeRole API。

  2. 创建三个环境变量以代入 IAM 角色。这些环境变量通过以下输出填充:

    # Linux export AWS_ACCESS_KEY_ID=RoleAccessKeyID export AWS_SECRET_ACCESS_KEY=RoleSecretKey export AWS_SESSION_TOKEN=RoleSessionToken # Windows set AWS_ACCESS_KEY_ID=RoleAccessKeyID set AWS_SECRET_ACCESS_KEY=RoleSecretKey set AWS_SESSION_TOKEN=RoleSessionToken
  3. 通过运行以下命令,验证自己是否代入了 IAM 角色:

    aws sts get-caller-identity

有关更多信息,请参阅 AWS Knowledge Center

AWS 管理员

将数据从源 S3 存储桶复制并同步至目标 S3 存储桶。

当您代入 S3MigrationRole 角色后,您可使用复制 (cp) 或同步 (sync) 命令复制数据。

复制(详情请参阅 AWS CLI 命令参考):

aws s3 cp s3://amazon-s3-demo-source-bucket/ \ s3://amazon-s3-demo-destination-bucket/ \ --recursive --source-region SOURCE-REGION-NAME --region DESTINATION-REGION-NAME

同步(详情请参阅 AWS CLI 命令参考):

aws s3 sync s3://amazon-s3-demo-source-bucket/ \ s3://amazon-s3-demo-destination-bucket/ \ --source-region SOURCE-REGION-NAME --region DESTINATION-REGION-NAME
云管理员

故障排除

事务解决方案

调用 ListObjects操作时发生错误 (AccessDenied) :访问被拒绝

  • 确保您已担任该角色S3MigrationRole

  • 运行 aws sts get-caller-identity 以检查使用的角色。如果输出未显示 S3MigrationRole 的 ARN,请再次代入该角色并重试。

相关资源