【问题标题】:How to fix AccessDenied calling CopyObject如何修复 AccessDenied 调用 CopyObject
【发布时间】:2019-07-19 08:59:15
【问题描述】:

我正在尝试将文件从 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

【问题讨论】:

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


    【解决方案1】:

    在您的 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"
             ]
          }
    

    【讨论】:

    • 如果您的存储桶不是跨账户的,您只需确保该角色有权访问您正在写入的存储桶。如果他们是跨账户,您需要在存储桶策略端允许 Iamrole 权限。
    • 存储桶位于不同的 aws 帐户中。我做了以下事情:medium.com/tensult/…。我有权访问列表,但是当我想从一个存储桶复制到另一个存储桶时,权限被拒绝,就像我在问题中所说的那样:/!
    • 我很抱歉,请尝试关注这个,docs.aws.amazon.com/AmazonS3/latest/dev/…
    • 你好乌龟!没问题:) 我解决了这个问题。显然我错过的权限是账户 A 的策略桶中的 B 用户。让我清理代码并检查,我将再次以最终解决方案回复!
    • 就我而言,我添加了IAMFullAccess,所以没有错误。感谢@user8128927
    【解决方案2】:

    您需要使用 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>
    

    【讨论】:

      【解决方案3】:

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

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

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

      希望这对你也有帮助!

      【讨论】:

        【解决方案4】:

        您缺少s3:GetObjectTaggings3:PutObjectTagging 权限,如下所述:https://medium.com/collaborne-engineering/s3-copyobject-access-denied-5f7a6fe0393e

        【讨论】:

          【解决方案5】:

          就我而言,它有效。

          {
              "Version": "2012-10-17",
              "Statement": [
                  {
                      "Sid": "VisualEditor0",
                      "Effect": "Allow",
                      "Action": [
                          "s3:ListBucket",
                          "s3:PutObject",
                          "s3:GetObjectAcl",
                          "s3:GetObject",
                          "s3:PutObjectVersionAcl",
                          "s3:GetObjectTagging",
                          "s3:DeleteObject",
                          "s3:GetBucketLocation",
                          "s3:PutObjectAcl"
                      ],
                      "Resource": [
                          "arn:aws:s3:::source-bucket/*",
                          "arn:aws:s3:::destination-bucket/*",
                          "arn:aws:s3:::source-bucket",
                          "arn:aws:s3:::destination-bucket"
                      ]
                  },
                  {
                      "Sid": "VisualEditor1",
                      "Effect": "Allow",
                      "Action": "s3:ListAllMyBuckets",
                      "Resource": "*"
                  }
              ]
          }
          

          【讨论】:

          • 您好 Nikhil,使用其他信息改进您的答案。比如解释你的代码以便更好地理解。
          【解决方案6】:

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

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

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

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

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

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

          【讨论】:

            【解决方案7】:

            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"
                            }
                        }
                    }
                ]
            }
            

            【讨论】:

              猜你喜欢
              • 2021-04-13
              • 1970-01-01
              • 2019-11-28
              • 2021-12-08
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-12-01
              相关资源
              最近更新 更多