【问题标题】:AWS Datasync S3 -> S3 cross account, confused about destination role/accountAWS Datasync S3 -> S3 跨账户,对目标角色/账户感到困惑
【发布时间】:2021-08-17 17:30:37
【问题描述】:

我想使用 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”命令。我是在源帐户还是目标帐户上执行这些操作?该博客在这些具体步骤上有点混乱和不清楚,我在任何地方都找不到更简单的指南。

【问题讨论】:

  • 同样的问题
  • @AlexKerr 我建议你仔细考虑哪个答案是最好的,接受并投票。

标签: amazon-web-services amazon-s3 aws-datasync


【解决方案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.

【讨论】:

  • 我得到的错误是:“提供的请求无效:请提供当前使用 DataSync 的 us-east-1 区域中的存储桶。”虽然,它部署在目标帐户的 us-east-1 中
【解决方案2】:

源 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 配置相关的任何事情都需要在目标帐户中进行。

【讨论】:

  • 谢谢你,这让我更进一步。通过 CLI 以 dest 帐户用户身份登录到目标帐户,并运行博客中给出的命令:aws datasync create-location-s3 --s3-bucket-arn arn:aws:s3:::SOURCEBUCKET --s3 -config '{"BucketAccessRoleArn":"arn:aws:iam::DEST-ACCOUNT-ID:role/DEST-ACCOUNT-ROLE"}' 我得到的响应是:调用 CreateLocationS3 操作时发生错误(InvalidRequestException):请提供当前使用 DataSync 的 sa-east-1 区域中的存储桶。博客说指定源存储桶,我做到了。请问有什么想法吗?
  • sa-east-1 是您使用的凭据的默认区域吗? S3 存储桶有一个“主”区域。我认为您需要使用 --region 选项为 S3 源存储桶指定区域 aws datasync create-location-s3
  • 对我来说同样的问题没有任何描述实际上有效。
  • @gph 如果我们没有可用的错误消息,我们很难提供帮助,您能否更具体地说明您所看到的内容?您是否收到 Alex 描述的区域错误?
  • 我在下面添加了错误。当描述紧随其后时,上述建议均无效。显然,设置了一些未提及的配置/操作,允许通过目标帐户创建 LocationS3。请不要再建议添加区域标志。
【解决方案3】:

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

“调用 CreateLocationS3 操作时发生错误(InvalidRequestException):请提供当前使用 DataSync 的 us-east-2 区域中的存储桶”。

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

【讨论】:

  • 我添加了--region,它仍然不起作用。使用源存储桶区域和目标访问角色在目标帐户中尝试此操作
  • @bad_coder,显然,添加区域标志并没有削减它
  • @gph 我刚刚编辑了帖子on the review queue 这不是我的专业领域。
  • >> SOLUTION
  • @gph 非常感谢!你上面的评论救了我。来自 AWS 的愚蠢错误令人困惑且无益
【解决方案4】:

我看到的作品是:

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-08
  • 2021-04-25
  • 2021-06-21
  • 2017-03-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多