【问题标题】:How to sync multiple S3 buckets using multiple AWS accounts?如何使用多个 AWS 账户同步多个 S3 存储桶?
【发布时间】:2021-10-20 01:10:26
【问题描述】:

我无法同步连接到两个单独 AWS 账户的两个 S3 存储桶。

有两个 AWS 账户 - 由第三方管理的账户 A 和我管理的账户 B。我希望将文件从账户 A 中的 S3 存储桶提取到账户 B 中的 S3 存储桶。

帐户 A 向我提供了以下说明:

  • 在账户 B 中,创建一个名为 LogsUser 的新 IAM 用户。将以下策略附加到用户:
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": "sts:AssumeRole",
                "Resource": "arn:aws:iam::ACCOUNTID:role/12345-LogAccess-role"
            }
        ]
    }
  • 配置 AWS CLI 以更新配置和凭证文件。具体来说,~/.aws/config 文件看起来像:

    [profile LogsUser]
    role_arn = arn:aws:iam::ACCOUNTID:role/12345-LogAccess-role
    source_profile = LogsUser
    

    ~/.aws/credentials 文件看起来像

    aws_access_key_id = YOUR_ACCESS_KEY_ID
    aws_secret_access_key = YOUR_SECRET_ACCESS_KEY
    
  • 从这里,我可以使用$ aws s3 ls --profile LogsUser s3://bucket-a成功查询账户A存储桶中的日志文件。

我在帐户 B 中设置了 bucket-b,但是,我无法查询 bucket-b 中的任何文件。例如,$ aws s3 ls --profile LogsUser s3://bucket-b 返回An error occurred (AccessDenied) when calling the AssumeRole operation: Access denied

我是否可以向配置文件或我的 IAM 策略添加其他内容以允许使用 --profile LogsUser 选项访问 bucket-b?我可以使用其他--profile 设置访问bucket-b,但我不想同步到本地文件系统,然后再同步到另一个存储桶。

想要的结果是运行类似aws s3 sync s3://bucket-a s3://bucket-b --profile UserLogs的命令。

【问题讨论】:

    标签: amazon-web-services amazon-s3 amazon-ec2 amazon-iam


    【解决方案1】:

    你的情况是:

    • 您希望从Bucket-A 复制到Account-A
    • 需要将文件复制到Bucket-B中的Account-B
    • Account-A 为您提供了在Account-A 中假设LogAccess-role 的能力,它可以访问Bucket-A

    使用CopyObject() 命令(由AWS CLI sync 命令使用)在存储桶之间复制文件时,需要:

    • 对源存储桶的读取访问权限 (Bucket-A)
    • 目标存储桶的写入权限 (Bucket-B)

    当您使用LogAccess-role 时,您会收到对Bucket-A 具有读取访问权限的凭据。这太棒了!但是,这些凭据无权写入 Bucket-B,因为它位于单独的帐户中。

    要克服这个问题,您应该在 Bucket-A 上创建一个 Bucket Policy,授予从 Account-BLogAccess-role 的写入访问权限。 Bucket Policy 类似于:

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Principal": {
                    "AWS": "arn:aws:iam::ACCOUNT-A:role/12345-LogAccess-role"
                },
                "Action": [
                    "s3:ListBucket",
                    "s3:PutObject"
                ],
                "Resource": [
                    "arn:aws:s3:::bucket-a",
                    "arn:aws:s3:::bucket-a/*"
                ]
            }
        ]
    }
    

    (您可能需要其他权限。检查任何错误消息以获取提示。)

    这样,LogAccess-role 将能够读取 Bucket-A 并写入 Bucket-B

    【讨论】:

      【解决方案2】:

      例如,如果您要将“账户 A”S3 存储桶对象复制到“账户 B”S3 存储桶,请按照以下说明操作。

      为“账户 A”中的 S3 存储桶创建一个策略,如下面的策略。为此,您需要“Account B”号码,要找到 B 帐号,请转到 Support → Support center 并从那里复制帐号。

      设置“账户 A”存储桶策略:

       {
          "Version": "2012-10-17",
          "Statement": [
              {
                  "Sid": "DelegateS3Access",
                  "Effect": "Allow",
                  "Principal": {
                      "AWS": "arn:aws:iam::ACCOUNT_B_NUMBER:root"
                  },
                  "Action": [
                      "s3:ListBucket",
                      "s3:GetObject"
                  ],
                  "Resource": [
                      "arn:aws:s3:::ACCOUNT_A_BUCKET_NAME/*",
                      "arn:aws:s3:::ACCOUNT_A_BUCKET_NAME"
                  ]
              }
          ]
      }
      

      登录“账户 B”并创建一个新的 IAM 用户或为现有用户附加以下策略。

      {
          "Version": "2012-10-17",
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": [
                      "s3:ListBucket",
                      "s3:GetObject"
                  ],
                  "Resource": [
                      "arn:aws:s3:::ACCOUNT_A_BUCKET_NAME",
                      "arn:aws:s3:::ACCOUNT_A_BUCKET_NAME/*"
                  ]
              },
              {
                  "Effect": "Allow",
                  "Action": [
                      "s3:ListBucket",
                      "s3:PutObject",
                      "s3:PutObjectAcl"
                  ],
                  "Resource": [
                      "arn:aws:s3:::ACCOUNT_B_BUCKET_NAME",
                      "arn:aws:s3:::ACCOUNT_B_BUCKET_NAME/*"
                  ]
              }
          ]
      }
      

      使用“账户 B”IAM 用户配置 AWS CLI(您使用上述用户策略创建了 IAM)

      aws s3 sync s3://ACCOUNT_A_BUCKET_NAME s3://ACCOUNT_B_BUCKET_NAME --source-region ACCOUNT_A_REGION-NAME --region ACCOUNT_B_REGION-NAME
      

      这样我们可以将 S3 存储桶对象复制到不同的 AWS 账户。

      如果您有多个 awscli 配置文件,请使用带有配置文件名称的命令末尾的 --profile

      【讨论】:

        【解决方案3】:

        我建议您考虑使用 AWS S3 存储桶复制:

        https://docs.aws.amazon.com/AmazonS3/latest/dev/crr.html

        【讨论】:

          【解决方案4】:

          如果您只想列出 bucket-b 中的对象,请执行此操作。

          首先确保 LogsUser IAM 用户具有访问账户 B 中 bucket-b s3 存储桶的适当权限。如果没有,您可以将此策略添加到用户

          {
              "Version": "2012-10-17",
              "Statement": [
                  {
                      "Effect": "Allow",
                      "Action": [
                          "s3:*"
                      ],
                      "Resource": [
                          "arn:aws:s3:::bucket-b/*"
                      ]
                  }
              ]
          }
          

          如果用户附加了权限,并且存储在~/.aws/credentials 中的Access 密钥和Secret Key 存储为[default] 属于LogsUser IAM 用户,您可以使用以下命令简单地列出bucket-b 中的对象。 aws s3 ls

          如果您想运行命令aws s3 sync s3://bucket-a s3://bucket-b --profile UserLogs,请执行此操作。

          请记住,我们将使用由 STS 创建的临时凭据,在担任具有 LogsUser 永久凭据的角色后。这意味着账户 A 中的角色应有权访问两个存储桶以执行操作,而另一个账户(账户 B)中的存储桶 (bucket-b) 应具有适当的存储桶策略以允许该角色执行 S3 操作。

          要为角色提供访问bucket-b 的权限,请将以下存储桶策略附加到bucket-b

          {
              "Version": "2012-10-17",
              "Statement": [
                  {
                      "Effect": "Allow",
                      "Principal": {
                          "AWS": "arn:aws:iam::ACCOUNTID:role/12345-LogAccess-role"
                      },
                      "Action": [
                          "s3:*"
                      ],
                      "Resource": [
                          "arn:aws:s3:::bucket-b/*"
                      ]
                  }
              ]
          }
          

          同样在账户 A 中,将策略附加到如下所示的角色,以允许访问两个账户中的 S3 存储桶。

          {
              "Version": "2012-10-17",
              "Statement": [
                  {
                      "Effect": "Allow",
                      "Action": [
                          "s3:*"
                      ],
                      "Resource": [
                          "arn:aws:s3:::bucket-b/*",
                          "arn:aws:s3:::bucket-a/*"
                      ]
                  }
              ]
          }
          

          【讨论】:

          • 感谢您的回复!账户 A 由第三方数据供应商管理,我无法在那里附加政策。如果没有,这仍然可能吗?否则我的方法是从bucket-a同步->本地文件系统->同步到bucket-b。
          • 为此,账户 A 的角色 ARN 应有权访问 S3 存储桶。您使用--profile LogsUser 下载。并且您将对象放入账户 B 中具有适当权限的 bucket-b。如果角色无法访问账户 A 中的存储桶并且为账户 B id 提供角色的信任关系,我们将无法执行此操作。
          猜你喜欢
          • 2016-12-14
          • 1970-01-01
          • 2019-06-28
          • 1970-01-01
          • 2019-10-23
          • 1970-01-01
          • 2017-07-21
          • 2019-01-15
          • 1970-01-01
          相关资源
          最近更新 更多