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

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

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

由 Appasaheb Bagali (AWS) 和 Purushotham G K () 创作 AWS

摘要

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

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

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

警告

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

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

先决条件和限制

  • 位于相同或不同AWS地区的两个活跃AWS账户。

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

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

  • 熟悉跨账户权限。

架构

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

工具

最佳实践

操作说明

任务描述所需技能

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

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

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

AWS DevOps

创建IAM基于身份的策略。

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

{ "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角色的 Amazon 资源名称 (ARN) 或信任策略中的用户名。

此信任策略允许新创建的IAM用户假设S3MigrationRole

AWS DevOps
任务描述所需技能

创建并附加 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 对象。

云管理员
任务描述所需技能

创建目标 S3 存储桶。

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

云管理员
任务描述所需技能

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

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

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

AWS DevOps

代入 S3 迁移角色。

  1. 使用AWSCLI来假设S3MigrationRole

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

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

  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知识中心

AWS 管理员

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

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

复制(有关详细信息,请参阅AWSCLI命令参考):

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

同步(有关详细信息,请参阅AWSCLI命令参考):

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 以检查使用的角色。如果输出未显示 for ARNS3MigrationRole,请再次担任该角色并重试。

相关资源