当我在 Amazon S3 存储桶上运行 sync 命令时,为什么会收到 ListObjectsV2 访问被拒绝错误?

上次更新日期:2021 年 11 月 1 日

我正在运行 aws s3 sync 命令,以将对象复制到 Amazon Simple Storage Service (Amazon S3) 存储桶或从中复制对象。但在我调用 ListObjectsV2 操作时,我收到访问被拒绝错误。如何解决此问题?

简短描述

当您运行 aws s3 sync 命令时,Amazon S3 会发出以下 API 调用:ListObjectsV2CopyObjectGetObjectPutObject

更具体地说,会发生以下情况:

1.    Amazon S3 会列出源和目标以检查对象是否存在。

2.    然后,Amazon S3 会执行以下 API 调用:

执行存储桶到存储桶操作的 CopyObject 调用
执行存储桶到本地操作的 GetObject 调用
执行本地到存储桶操作的 PutObject 调用

注意:本解决方案假设已向 AWS Identity Access Management (IAM) 用户或角色授予了 GetObject 和 PutObject 调用权限。此解决方案处理如何解决由于不正确的 ListBucket 权限或在申请方付款中使用错误的 sync 命令语法而导致的访问被拒绝错误。

解决方案

配置 IAM 策略

验证您对向其复制或从中复制对象的 Amazon S3 存储桶拥有 s3:ListBucket 权限。您必须拥有此权限,才能执行 ListObjectsV2 操作。

注意s3:ListBucket 是允许用户列出存储桶中对象的权限的名称。ListObjectsV2 是列出存储桶中对象的 API 调用的名称。

如果您的 IAM 用户或角色属于其他 AWS 账户,请检查您的 IAM 和存储桶策略是否允许 s3:ListBucket 操作。您的 IAM 策略和存储桶策略必须同时允许 s3:ListBucket 权限。

如果您的用户或角色属于存储桶拥有者的账户,则不需要 IAM 和存储桶策略同时允许s3:ListBucket 权限。只需要其中一个允许该操作即可。

重要提示:如果 IAM 策略或存储桶策略已允许 s3:ListBucket 操作,请检查其他策略是否有显式拒绝该操作的语句。显式 deny(拒绝)语句会覆盖 allow(允许)语句。

以下是允许访问 s3:ListBucketIAM 策略示例:

{
  "Version": "2012-10-17",
  "Statement": [{
    "Sid": "Stmt1546506260896",
    "Action": "s3:ListBucket",
    "Effect": "Allow",
    "Resource": "arn:aws:s3:::AWSDOC-EXAMPLE-BUCKET"
  }]
}

以下是允许用户 arn:aws:iam::123456789012:user/testuser 访问 s3:ListBucket存储桶策略示例:

{
  "Id": "Policy1546414473940",
  "Version": "2012-10-17",
  "Statement": [{
    "Sid": "Stmt1546414471931",
    "Action": "s3:ListBucket",
    "Effect": "Allow",
    "Resource": "arn:aws:s3:::AWSDOC-EXAMPLE-BUCKET",
    "Principal": {
      "AWS": [
        "arn:aws:iam::123456789012:user/testuser"
      ]
    }
  }]
}

在申请方付款中使用 sync 命令

如果您的存储桶属于另一个 AWS 账户并启用了申请方付款,请验证您的存储桶策略和 IAM 权限是否都授予了 ListObjectsV2 权限。如果已正确授予 ListObjectsV2 权限,请检查 sync 命令语法。使用 sync 命令时,必须包含 --request-payer requester 选项。否则,您就会收到访问被拒绝错误。

例如:

aws s3 sync ./ s3://requester-pays-bucket/ --request-payer requester

这篇文章对您有帮助吗?


您是否需要账单或技术支持?