本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用 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)。目标账户中的用户必须代入拥有源存储桶 PutObject 和 GetObject 权限的角色。最后,您运行copysync命令将数据从源 Amazon S3 存储桶传输到目标 Amazon S3 存储桶。
账户拥有他们上传到 Amazon S3 存储桶的对象。如果您跨账户和地区复制对象,则将复制对象的权限授予目标账户。若要更改对象所有权,您可将其访问控制列表(ACL)更改为 bucket-owner-full-control。但是,我们建议您向目标账户授予编程跨账户权限,因为 ACLs 可能很难管理多个对象。
此场景需要 IAM 用户具有编程访问权限和长期凭证,这会带来安全风险。为帮助减轻这种风险,我们建议仅向这些用户提供执行任务所需的权限,并在不再需要这些用户时将其移除。必要时可以更新访问密钥。有关更多信息,请参阅 IAM 文档中的更新访问密钥。
先决条件和限制
先决条件
限制
架构
最佳实践
操作说明
| Task | 说明 | 所需技能 |
|---|
创建 IAM 用户并获取访问密钥。 | | 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 存储桶策略。 | 登录您的源账户并打开 Amazon S3 控制台。 AWS 管理控制台 选择您的源 Amazon S3 存储桶,然后选择权限。 在 Bucket policy(存储桶策略)下,请选择 Edit(编辑)。 粘贴以下存储桶策略。请确保包含目标账户的 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"
]
}
]
}
选择保存。
| 云管理员 |
| Task | 说明 | 所需技能 |
|---|
创建目标 Amazon S3 存储桶。 | 登录您的目标账户,然后打开 Amazon S3 控制台。 AWS 管理控制台 选择 创建存储桶 。 根据您的要求创建 Amazon S3 存储桶。有关更多信息,请参阅 Amazon S3 文档中的创建存储桶。
| 云管理员 |
| Task | 说明 | 所需技能 |
|---|
AWS CLI 使用新创建的用户凭据进行配置。 | 安装最新版本的 AWS CLI。有关说明,请参阅 AWS CLI 文档 AWS CLI中的安装或更新最新版本的。 使用您创建的 AWS CLI IAM 用户的 AWS 访问密钥运行$ aws configure并进行更新。有关更多信息,请参阅 AWS CLI 文档中的配置和凭据文件设置。
| AWS DevOps |
假设 Amazon S3 迁移角色。 | 使用 AWS CLI 来假设S3MigrationRole: aws sts assume-role \
--role-arn "arn:aws:iam::<destination_account>:role/S3MigrationRole" \
--role-session-name AWSCLI-Session
此命令输出多条信息。在凭证数据块中,您需要 AccessKeyId、SecretAccessKey 和 SessionToken。此示例使用环境变量 RoleAccessKeyID、RoleSecretKey 和 RoleSessionToken。:会话证书(AccessKeyIdSecretAccessKey、和SessionToken)是临时且非永久性的。输出中的到期时间戳表示这些证书的过期时间。该角色配置了最长会话持续时间。如果证书过期,则必须sts:AssumeRole再次致电以获取新的临时证书。 创建三个环境变量以代入 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>
通过运行以下命令,验证自己是否代入了 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) | 请确认您已代入角色 S3MigrationRole。 运行 aws sts get-caller-identity 以检查使用的角色。如果输出未显示的 ARN,请再次担任 IAM 角色并重试。S3MigrationRole
|
相关资源