【问题标题】:AWS S3 Transfer Between Accounts Not Working账户之间的 AWS S3 传输不起作用
【发布时间】:2017-10-13 05:13:18
【问题描述】:

我正在尝试将一个帐户中的存储桶中的数据复制到另一个帐户中的存储桶中,在该帐户中我可以访问 IAM 但没有管理员权限,但我是该帐户中的管理员,但失败了。我什至不能ls 源存储桶。

我已按照 AWS 和各种在线来源的指示授予自己对源存储桶的列表/读取/获取权限,但没有成功。我可以提供详细信息(例如,存储桶策略 json),但它是 AWS 文档和其他地方的内容。我所做的工作在我拥有管理员访问权限的两个帐户之间有效。

这是“多区域”,因为我在美国(主要是 us-west-2),但存储桶在 eu-central-1。我在 aws cli 中指定区域,并在 eu-central-1 中设置目标存储桶,但无论如何都无法列出。

【问题讨论】:

    标签: amazon-web-services amazon-s3


    【解决方案1】:

    我已经用我的 AWS 账户做了几次。我猜您已经设置了对您的 S3 存储桶的跨账户访问权限,但请仔细检查一下,这是我为授予 S3 存储桶跨账户访问权限所做的工作。

    帐户 (A): S3 存储桶(testbucket)

    帐户 (B): IAM 用户(testuser)需要访问账户(A)中的 S3 存储桶 testbucket

    以下是需要发生的事情:

    在 testbucket (A) 上创建存储桶策略,以授予对您的测试存储桶的读取/列表等访问权限。 示例:

    {
    "Version": "2012-10-17",
    "Id": "BUCKETPOLICY",
    "Statement": [
        {
            "Sid": "AllowS3ReadObject28",
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::900000000:user/testuser"
                ]
            },
            "Action": "s3:GetObject",
            "Resource": [
                "arn:aws:s3:::testbucket",
                "arn:aws:s3:::testbucket/*"
            ]
        }
    ]
    

    }

    1. 在 testuser 上创建一个 IAM 策略,该策略还授予对存储桶的读取、写入、列出等访问权限。

    【讨论】:

    • 账户 A 中的存储桶策略足以授予访问权限。无需为账户 B 中的用户创建策略——事实上,账户 B 无论如何都无法授予账户 A 中的任何内容的权限!
    【解决方案2】:

    看来你的情况是:

    • 帐户 A: 存储桶 A 和用户 A(访问权限有限)
    • 帐户 B: 存储桶 B 和用户 B(具有管理员权限)

    您可以将账户 A 中的数据推送到存储桶 B,也可以使用账户 B 从存储桶 A拉取数据。

    从账户 A 推送到存储桶 B

    假设用户 A 可以访问存储桶 A。只需授予用户 A 写入存储桶 B 的权限。这可以通过存储桶 B 上的存储桶策略来完成:

    {
      "Id": "PolicyB",
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "GrantAccessToUserA",
          "Action": "s3:*",
          "Effect": "Allow",
          "Resource": [
            "arn:aws:s3:::BUCKET-B",
            "arn:aws:s3:::BUCKET-B/*"
          ],
          "Principal": "arn:aws:iam::ACCOUNT-A:user/USER-A"
        }
      ]
    }
    

    这会授予用户 A 在存储桶 B 上的所有 s3 权限。这太过分了,但大概这只是暂时的。

    然后用户 A 会将文件从存储桶 A 复制到存储桶 B。例如:

    aws s3 sync s3://BUCKET-A s3://BUCKET-B \
      --acl bucket-owner-full-control \
      --source-region SOURCE-REGION \
      --region DESTINATION-REGION
    

    重要提示:复制文件时,请务必使用授予bucket-owner-full-control 的访问控制列表。这意味着文件将由 Bucket B 的所有者拥有。如果您不这样做,文件仍归用户 A 拥有,并且用户 B 无法删除,即使使用 admin权利!

    使用账户 B 从存储桶 A 中拉取

    为此,必须向用户 B 授予对存储桶 A 的访问权限。您需要在账户 A 中拥有足够的访问权限才能在存储桶 A 上添加存储桶策略

    {
      "Id": "PolicyA",
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "GrantAccessToUserB",
          "Action": [
            "s3:GetObject",
            "s3:ListBucket"
          ],
          "Effect": "Allow",
          "Resource": [
            "arn:aws:s3:::BUCKET-A",
            "arn:aws:s3:::BUCKET-A/*"
          ],
          "Principal": "arn:aws:iam::ACCOUNT-B:user/USER-B"
        }
      ]
    }
    

    然后,用户 B 可以复制文件:

    aws s3 sync s3://BUCKET-A s3://BUCKET-B \
      --source-region SOURCE-REGION \
      --region DESTINATION-REGION
    

    (您可能需要授予更多访问权限,我没有测试上述策略。)

    存储桶位于不同区域这一事实不会影响权限,但会影响您发送命令的位置。命令被发送到目标区域,然后从源区域拉取。

    见:AWS CLI s3 sync command

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-01
      • 1970-01-01
      相关资源
      最近更新 更多