我想使用Datasync将数据从一个帐户中的单个S3存储桶复制到另一个帐户的单个S3储存桶。我关注这个官方的AWS数据同步博客:https://aws.amazon.com/blogs/storage/how-to-use-aws-datasync-to-migrate-data-between-amazon-s3-buckets/在第二部分中;跨帐户复制对象";。
我已经设置了源和目标存储桶,以及
- 完成了";创建一个新的IAM角色并附加一个用于源S3桶位置的新IAM策略";以及
- "将以下信任关系添加到IAM角色";(通过搜索引号中的字符串,你可以在博客中看到我的意思)但是
- 我现在不知道该用哪个账户";打开源S3存储桶策略并应用以下策略来授予IAM角色访问对象"的权限;以及
- 使用哪个帐户来运行AWS CLI命令";aws-sts获取呼叫者身份";以及
- 则";aws数据同步创建位置-s3";命令之后。我是在源帐户还是目标帐户上执行这些操作
博客对这些具体步骤有点困惑和不清楚,我在任何地方都找不到更简单的指南。
源S3存储桶策略附加到源S3存储盒,因此您需要登录到源帐户进行编辑。
接下来的步骤必须通过CLI完成。措辞有点含糊,但关键短语是";确保您使用的IAM标识与您在前一步骤中创建的源S3存储桶策略中指定的IAM标识相同"示例S3存储桶策略中引用的IAM标识为arn:aws:iam::DEST-ACCOUNT-ID:role/DEST-ACCOUNT-USER
,因此需要对CLI步骤的目标帐户进行身份验证。aws sts get-caller-identity
命令只返回用于执行该命令的标识,因此它用于确认您使用的是预期的标识,而不是设置数据同步位置所严格要求的标识。
教程中没有明确提到,但目标帐户中的用户当然需要适当的IAM权限来创建数据同步位置和任务。
这样想可能会有所帮助:您需要允许目标帐户中的角色访问源帐户中的存储桶,然后在目标帐户中设置数据同步位置和任务。因此,与数据同步配置相关的任何操作都需要在目标帐户中进行。
对我来说,这成功了,但后来我又得到了一个错误
An error occurred (InvalidRequestException) when calling the CreateLocationS3 operation: DataSync location access test failed: could not perform s3:GetObject in bucket some-bucket. Access denied. Ensure bucket access role has s3:GetObject permission.
即使对bucket/角色正确设置了权限。问题是bucket也用KMS密钥加密,我很容易就用这里的解决方案解决了这个问题
我希望我能在这里看到我的答案,因为我至少可以少花1个小时调试
不工作!-https://aws.amazon.com/blogs/storage/how-to-use-aws-datasync-to-migrate-data-between-amazon-s3-buckets/
1)目的地角色
- 在目标S3存储桶所在的帐户中创建必要的IAM角色
- 登录目标帐户并为AWS DataSync创建IAM角色
DESTINATION-ROLE:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Action:
- sts:AssumeRole
Effect: Allow
Principal:
Service:
- datasync.amazonaws.com
Path: '/'
RoleName: DESTINATION-ROLE
DESTINATION-POLICY:
Type: AWS::IAM::Policy
Properties:
PolicyName: DESTINATION-POLICY
PolicyDocument:
Version: '2012-10-17'
Statement:
- Action:
- s3:GetBucketLocation
- s3:ListBucket
- s3:ListBucketMultipartUploads
Effect: Allow
Resource: arn:aws:s3:::SOURCEBUCKET
- Action:
- s3:AbortMultipartUpload
- s3:DeleteObject
- s3:GetObject
- s3:ListMultipartUploadParts
- s3:PutObjectTagging
- s3:GetObjectTagging
- s3:PutObject
Effect: Allow
Resource: arn:aws:s3:::SOURCEBUCKET/*
Roles:
- Ref: DESTINATION-ROLE
2)来源S3政策
- "复制您为源S3存储桶位置创建的IAM角色的ARN
- 现在,登录源帐户
- 打开源S3存储桶策略,并应用以下策略为IAM角色授予权限
Version: '2012-10-17'
Statement:
- Sid: BucketPolicyForDataSync
Effect: Allow
Principal:
AWS:
- arn:aws:iam::DEST-ACCOUNT-ID:role/DESTINATION-ROLE
Action:
- s3:GetBucketLocation
- s3:ListBucket
- s3:ListBucketMultipartUploads
- s3:AbortMultipartUpload
- s3:DeleteObject
- s3:GetObject
- s3:ListMultipartUploadParts
- s3:PutObject
- s3:GetObjectTagging
- s3:PutObjectTagging
Resource:
- arn:aws:s3:::SOURCEBUCKET
- arn:aws:s3:::SOURCEBUCKET/*
3)CLI发票
- 现在,启动AWS CLI(从源帐户)
aws datasync create-location-s3
--s3-bucket-arn 'arn:aws:s3:::SOURCEBUCKET'
--region 'us-east-1'
--s3-config '
{
"BucketAccessRoleArn":
"arn:aws:iam::DEST-ACCOUNT-ID:role/DESTINATION-ROLE"
}
'
3.1)错误源帐户
An error occurred (AccessDeniedException) when calling the CreateLocationS3 operation: Cross-account pass role is not allowed.
3.2)错误目标帐户
An error occurred (InvalidRequestException) when calling the CreateLocationS3 operation: Please provide a bucket in the us-east-1 region where DataSync is currently used.
我遇到了同样的问题,并在收到相同的错误消息时得到了修复
"调用CreateLocationS3操作时发生错误(InvalidRequestException):请在当前使用DataSync的us-east-2区域中提供bucket;。
您需要传递--region标志和并放置源桶所在的区域。因此,查看源bucket视图并获取区域。
我看到的效果是:
- 在目标帐户中运行CLI命令
- 当您运行CLI命令时,您应该确保与您一起运行CLI命令的用户/botocore会话的ARN可以访问源bucket,正如@gph所说,至少具有s3:ListBucket。我发现很棘手:如果您不是与用户一起运行CLI命令,而是使用某些角色,则需要确保在担任源帐户中的角色后授予botocore会话的权限。当然,权限与botocore会话持续时间一样短暂,但如果您不想使用IAM用户登录,它至少可以帮助您创建位置
如果您使用源帐户的AWS用户凭据通过AWS CLI运行此操作,请确保您的用户在目标存储桶权限中被授予ListBucket权限。(您可能会从目的地帐户中的AWS控制台添加此内容):
{
"Sid": "UserDataSyncCreateS3Location",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::112233445566:user/my-user-name"
},
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::this-destination-bucket"
}