AWS Datasync S3 -> S3 跨账户,对目的地感到困惑 role/account

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 role to access the objects”和使用哪个账户 运行 AWS CLI 命令“aws sts get-caller-identity”,然后是“aws datasync create-location-s3”命令。我是在源账户还是目标账户上做这些?该博客在这些具体步骤上有点混乱和不清楚,我在任何地方都找不到更简单的指南。

源 S3 存储桶策略附加到源 S3 存储桶,因此您需要登录源帐户进行编辑。

接下来的步骤必须从 CLI 完成。措辞有点模棱两可,但关键短语是“确保您使用的是您在上一步创建的源 S3 存储桶策略中指定的相同 IAM 身份。”示例 S3 存储桶策略中引用的 IAM 身份是 arn:aws:iam::DEST-ACCOUNT-ID:role/DEST-ACCOUNT-USER,因此您需要通过目标账户的身份验证才能执行 CLI 步骤。 aws sts get-caller-identity 命令只是 returns 用于执行命令的身份,因此它用于确认您使用的是预期的身份,而不是设置数据同步位置所严格要求的身份。

教程中没有明确提及,但目标账户中的用户当然需要适当的 IAM 权限才能创建数据同步位置和任务。

这样想可能会有所帮助:您需要允许目标账户中的角色访问源账户中的存储桶,然后在目标账户中设置 Datasync 位置和任务。因此,与 Datasync 配置相关的任何事情都需要在目标帐户中进行。

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

我遇到了同样的问题并得到了修复,但我收到了同样的错误消息

"An error occurred (InvalidRequestException) when calling the CreateLocationS3 operation: Please provide a bucket in the us-east-2 region where DataSync is currently used".

您需要传递 --region 标志和 并放入源桶所在的区域。所以查看源桶视图并获取区域。

我看到的作品是:

  1. 运行 目标账户中的 CLI 命令
  2. 当您 运行 执行 CLI 命令时,您应该确保 user/botocore 与您 运行 执行 CLI 命令的会话的 ARN 可以访问正如@gph 所说,源存储桶至少 s3:ListBucket。我发现棘手的是:如果您没有 运行 用户的 CLI 命令,而是使用某些角色,您需要确保在承担源帐户中的角色后授予对 botocore 会话的权限。当然,该权限与 botocore 会话持续时间一样短暂,但如果您不想使用 IAM 用户登录,它至少可以帮助您创建位置。