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

1 分钟阅读
0

我正在运行 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 调用,表示本地到桶操作

**注意:**此解决方法假设 GetObject 和 PutObject 调用已被授予了 AWS Identity Access Management(IAM)用户或角色。此解决方法介绍如何解决由于不正确的 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 操作,则检查其他策略是否存在明确拒绝该操作的语句。显式拒绝语句会覆盖允许语句。

以下是授予对 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/testusers3: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

相关信息

桶拥有者授予跨账户桶权限

桶策略和用户策略

AWS 官方
AWS 官方已更新 2 年前