繁体   English   中英

AWS Datasync S3 -> S3 跨账户,对目标角色/账户感到困惑

[英]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/在第二部分“跨帐户复制对象”。

我已经设置了源和目标存储桶,并且

  • 完成初始步骤“创建新的 IAM 角色并为源 S3 存储桶位置附加新的 IAM 策略”和
  • “将以下信任关系添加到 IAM 角色”(您可以通过搜索引号中的那些字符串来了解我在博客中的意思)但是
  • 我现在对使用哪个帐户“打开源 S3 存储桶策略并应用以下策略来授予 IAM 角色访问对象的权限”感到困惑,并且
  • 使用哪个账户运行 AWS CLI 命令“aws sts get-caller-identity”和
  • 然后是“aws datasync create-location-s3”命令。 我是在源账户还是目标账户上做这些?

该博客在这些具体步骤上有点混乱和不清楚,我在任何地方都找不到更简单的指南。

不工作! - 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.

源 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 标志并放置源存储桶所在的区域。 所以查看源桶视图并获取区域。

我看到的作品是:

  1. 在目标帐户中运行 CLI 命令
  2. 当您运行 CLI 命令时,您应该确保用于运行 CLI 命令的用户/botocore 会话的 ARN 可以访问源存储桶,正如@gph 所说,至少是 s3:ListBucket。 我发现很棘手:如果您不使用用户运行 CLI 命令,而是使用某些角色,则需要确保在承担源帐户中的角色后授予 botocore 会话权限。 当然,该权限与 botocore 会话持续时间一样短暂,但如果您不想使用 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.

即使在存储桶/角色上正确设置了权限。 问题是存储桶也使用KMS密钥加密,我很容易通过此处找到的解决方案解决了这个问题。
我希望我能在这里看到我的答案,因为我至少可以减少 1 小时的调试时间

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM