[英]AWS Datasync S3 -> S3 cross account, confused about destination role/account
我想使用 Datasync 将数据从一个账户中的单个 S3 存储桶复制到另一个账户中的单个 S3 存储桶。 我正在关注这个官方 AWS Datasync 博客: https://aws.amazon.com/blogs/storage/how-to-use-aws-datasync-to-migrate-data-between-amazon-s3-buckets/在第二部分“跨帐户复制对象”。
我已经设置了源和目标存储桶,并且
该博客在这些具体步骤上有点混乱和不清楚,我在任何地方都找不到更简单的指南。
1) 目的地角色
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 策略
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 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.
源 S3 存储桶策略附加到源 S3 存储桶,因此您需要登录源帐户进行编辑。
接下来的步骤必须从 CLI 完成。 措辞有点模棱两可,但关键短语是“确保您使用的是在上一步中创建的源 S3 存储桶策略中指定的相同 IAM 身份”。 示例 S3 存储桶策略中引用的 IAM 身份是arn:aws:iam::DEST-ACCOUNT-ID:role/DEST-ACCOUNT-USER
因此您需要通过目标账户的身份验证才能执行 CLI 步骤。 aws sts get-caller-identity
命令只返回用于执行命令的身份,因此它用于确认您使用的是预期的身份,而不是严格要求设置数据同步位置。
教程中没有明确提及,但目标账户中的用户当然需要适当的 IAM 权限才能创建数据同步位置和任务。
这样想可能会有所帮助:您需要允许目标账户中的角色访问源账户中的存储桶,然后在目标账户中设置 Datasync 位置和任务。 因此,与 Datasync 配置相关的任何事情都需要在目标帐户中进行。
我遇到了同样的问题并得到了修复,但我收到了相同的错误消息
“调用 CreateLocationS3 操作时发生错误 (InvalidRequestException):请在当前使用 DataSync 的 us-east-2 区域中提供一个存储桶”。
您需要传递 --region 标志并放置源存储桶所在的区域。 所以查看源桶视图并获取区域。
我看到的作品是:
对我来说,这成功了,但后来我又遇到了另一个错误
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.
即使在存储桶/角色上正确设置了权限。 问题是存储桶也使用KMS密钥加密,我很容易通过此处找到的解决方案解决了这个问题。
我希望我能在这里看到我的答案,因为我至少可以减少 1 小时的调试时间
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.