如何修复AccessDenied调用CopyObject

时间:2019-02-25 21:30:27

标签: amazon-web-services amazon-s3 terraform aws-cli bucket

我正在尝试将文件从A帐户中的存储桶复制到B帐户中的另一个存储桶。当我尝试使用命令

同步文件时

aws s3 sync s3://BUCKET_A s3://BUCKET_B

它返回以下输出:

copy failed: s3://BUCKET_A to s3://BUCKET_B An error occurred (AccessDenied) when calling the CopyObject operation: Access Denied

这是在B帐户中创建的用户所附加的政策(将从存储区A中复制文件):

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

可能我缺少一些权限?我找不到要添加到我的用户/存储桶策略中的权限CopyObject

7 个答案:

答案 0 :(得分:0)

在IAM角色政策方面,您将需要以下内容:

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

您需要将这些权限添加到BUCKET_B

{
         "Sid": "Example permissions",
         "Effect": "Allow",
         "Principal": {
            "AWS": "arn:aws:iam::your_iam_policy"
         },
         "Action": [
              "s3:ListBucket",
              "s3:GetObject",
              "s3:PutObject",
              "s3:PutObjectAcl"
          ],
         ],
         "Resource": [
            "arn:aws:s3:::BUCKET_B"
         ]
      }

答案 1 :(得分:0)

您需要使用B帐户上的IAM用户在本地计算机上配置AWS CLI。

您可以在本地cli配置上拥有任意数量的配置文件。有关更多详细信息,请参见AWS CLI configuration

现在在复制时,将--profile参数添加到您的同步命令中。例如。

aws s3 sync s3://BUCKET_A s3://BUCKET_B --profile <NEW-AWS-CLI-PROFILE-FOR-ACCOUNT-B>

答案 2 :(得分:0)

就我而言,我对某些对象没有任何问题,但是其中一个对象具有问题中所述的相同 CopyObject 错误。我也在跨账户存储桶之间使用同步命令。

所以我查看了 AWS CloudTrail 中的事件历史记录(因为我设置了 cloudtrail) - 这有助于了解正在调用哪些 API 调用。但是我没有 event logging for S3 buckets and objects enabled,所以我尝试了一些更改,从 put* 开始,它起作用了。然后我迅速缩小到我需要的那个。

最终,这让我可以将此权限添加到我的存储桶策略中:s3:PutObjectTagging

希望这也能帮到你!

答案 3 :(得分:0)

这可能与目标存储桶中对象的加密有关。查看您粘贴的 IAM 角色,似乎授予了所有必需的权限。

要解决此问题,请运行相同的命令并添加 --sse AES256

aws s3 sync s3://BUCKET_A s3://BUCKET_B --sse AES256

要检查目标bucket的加密设置,你必须检查bucket policy,它应该有条件:

...
    "Condition": {
        "StringNotEquals": {
            "s3:x-amz-server-side-encryption": "AES256"
        }
    }
...

进入目标存储桶后,您可以在 S3 GUI 的 Permissions => Bucket policy 选项卡中找到存储桶策略。

答案 4 :(得分:0)

您缺少此处概述的 s3:GetObjectTaggings3:PutObjectTagging 权限:https://medium.com/collaborne-engineering/s3-copyobject-access-denied-5f7a6fe0393e

答案 5 :(得分:-1)

AWSS3MIGRATION

1。运行命令aws_s3_sync_bucketsource_bucketdest的帐户的CREATECREDENTIAL: awsgui,mysecuritycredential,acess_keys,create_new_access_key;

1b。在bash shell中运行命令:aws_configure;

2。 awsgui,s3,bucket_x1,概述,选择所有目录,操作,make_everything_public;

3。 awsgui,s3,bucket_x1,权限,control_list,公共访问权限;

4。 awsgui,s3,bucket_x1,概述,选择所有目录,操作,并将storege类更改为标准。

5。也为bucket_2做第二,第三,第四点。

说明:bucket_x1是源,bucket_x2是目的地。

答案 6 :(得分:-1)

1 - 禁用阻止公共访问 2 - 保持桶未加密 3 - 查找您的公共 IP: 4 - 将以下策略添加到 s3 存储桶

{
    "Version": "2008-10-17",
    "Id": "Policy1357935677554",
    "Statement": [
        {
            "Sid": "Stmt1357935647218",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::YOUR-S3-BUCKET-NAME",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": "YOUR-PUBLIC-IP/32"
                }
            }
        },
        {
            "Sid": "Stmt1357935676138",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::YOUR-S3-BUCKET-NAME/*",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": "YOUR-PUBLIC-IP/32"
                }
            }
        }
    ]
}