View a markdown version of this page

使用 Amazon S3 存储桶将数据复制到其他账户和区域 AWS CLI - AWS 规范指引

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

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

Appasaheb Bagali 和 Purushotham G K,Amazon Web Services

Summary

此模式描述了如何将数据从一个账户中的 AWS 源亚马逊简单存储服务 (Amazon S3) 存储桶迁移到位于 AWS 区域 相同或不同区域的 AWS 另一个账户中的目标 Amazon S3 存储桶。

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

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

警告

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

先决条件和限制

先决条件

  • 两个活跃 AWS 账户 在相同或不同的地方 AWS 区域。

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

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

  • 熟悉跨账户权限。

限制

  • 此模式涵盖一次性迁移。对于需要将新对象从源存储桶持续自动迁移到目标存储桶的场景,您可以使用 Amazon S3 Batch Replicati on。

  • 此模式使用临时且非持久的会话证书(AccessKeyIdSecretAccessKey、和SessionToken)。输出中的到期时间戳表示这些证书的过期时间。该角色配置了最长会话持续时间。如果会话到期,复印作业将被取消。

架构

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

工具

最佳实践

操作说明

Task说明所需技能

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

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

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

AWS DevOps

创建基于 IAM 身份的策略。

使用以下权限创建名为S3MigrationPolicy的 IAM 基于身份的策略。根据您的使用案例修改源和目标存储桶名称。这种基于身份的策略允许此角色用户访问源存储桶和目标存储桶。有关详细说明,请参阅 IAM 文档中的创建 IAM 策略

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:ListBucket", "s3:ListObjectsV2", "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:ListObjectsV2", "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 角色。根据您的使用案例,在信任策略中修改目标 IAM 角色的 Amazon 资源名称(ARN)。此信任策略允许新创建 IAM 用户代入 S3MigrationRole。附上先前创建的S3MigrationPolicy。有关详细步骤,请参阅 IAM 中的创建向 IAM 用户委派权限的角色

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::<destination_account>:user/<user_name>" }, "Action": "sts:AssumeRole", "Condition": {} } ] }
AWS DevOps
Task说明所需技能

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

  1. 登录您的源账户并打开 Amazon S3 控制台。 AWS 管理控制台

  2. 选择您的源 Amazon S3 存储桶,然后选择权限

  3. Bucket policy(存储桶策略)下,请选择 Edit(编辑)

  4. 粘贴以下存储桶策略。请确保包含目标账户的 AWS 账户 ID,并根据您的要求配置存储桶策略模板。此基于资源的策略允许目标角色S3MigrationRole访问源账户中的 Amazon 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:ListObjectsV2", "s3:GetObjectTagging", "s3:GetObjectVersion", "s3:GetObjectVersionTagging" ], "Resource": [ "arn:aws:s3:::amazon-s3-demo-source-bucket/*", "arn:aws:s3:::amazon-s3-demo-source-bucket" ] } ] }
  5. 选择保存

云管理员
Task说明所需技能

创建目标 Amazon S3 存储桶。

  1. 登录您的目标账户,然后打开 Amazon S3 控制台。 AWS 管理控制台

  2. 选择 创建存储桶

  3. 根据您的要求创建 Amazon S3 存储桶。有关更多信息,请参阅 Amazon S3 文档中的创建存储桶。 

云管理员
Task说明所需技能

AWS CLI 使用新创建的用户凭据进行配置。

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

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

AWS DevOps

假设 Amazon 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。:会话证书(AccessKeyIdSecretAccessKey、和SessionToken)是临时且非永久性的。输出中的到期时间戳表示这些证书的过期时间。该角色配置了最长会话持续时间。如果证书过期,则必须sts:AssumeRole再次致电以获取新的临时证书。

  2. 创建三个环境变量以代入 IAM 角色。这些环境变量以以下输出完成:

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

    aws sts get-caller-identity

有关更多信息,请参阅如何使用来担任 IAM 角色? AWS CLI

AWS 管理员

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

担任该角色后,S3MigrationRole可以使用 copy (cp) 或 synchronize (sync) 命令复制数据。

复制:

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 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)

  1. 请确认您已代入角色 S3MigrationRole

  2. 运行 aws sts get-caller-identity 以检查使用的角色。如果输出未显示的 ARN,请再次担任 IAM 角色并重试。S3MigrationRole

相关资源