当我运行 sync 命令时,为什么会收到 ListObjectsV2 访问被拒绝错误?

上次更新时间:2021 年 3 月 25 日

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

简短描述

当您运行 aws s3 sync 命令时,Amazon S3 会发出以下 API 调用:ListObjectsV2、CopyObject、GetObject 和 PutObject。

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

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

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

执行存储桶到存储桶操作的 CopyObject 调用

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

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

注意:本文假设已向 AWS Identity Access Management (IAM) 用户或角色授予了 GetObject 和 PutObject 调用权限。本文介绍的是如何解决因 ListBuckets 权限不当导致的访问被拒绝错误。

解决方法

验证您对向其复制或从中复制对象的 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:ListBucket 操作的 IAM 策略示例:

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

这篇文章对您有帮助吗?


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