我正在运行 aws s3 sync 命令将对象复制到 Amazon Simple Storage Service(Amazon S3)存储桶或从中复制对象。但是当我调用 ListObjectsV2 API 时出现访问被拒绝错误。
简短描述
当您运行 sync 命令时,Amazon S3 会发出 ListObjectsV2 API 调用,以检查相关对象是否存在于源存储桶或目标存储桶中。如果任一存储桶中都没有相关对象,则 Amazon S3 将执行以下 API 调用:
- CopyObject 调用,用于存储桶到存储桶操作
- GetObject 调用,用于存储桶到本地操作
- PutObject 调用,用于本地到存储桶操作
解决方法
**注意:**如果在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI。
配置 IAM 策略
**注意:**此解决方法假设 GetObject 和 PutObject 操作已被授予了 AWS Identity Access Management(IAM)用户或角色。此解决方法介绍如何解决由于不正确的 ListBucket 权限或在请求者付款中使用错误的 sync 命令语法而导致的“访问被拒绝”错误。
验证您在要将对象复制到或从中复制对象的 Amazon S3 存储桶上拥有 s3:ListBucket 权限。您必须拥有该权限才能执行 ListObjectsV2 API 调用操作。
如果您的 IAM 用户或角色属于另一个 AWS 账户,请检查您的 IAM 策略和存储桶策略是否允许 s3:ListBucket 操作。您必须同时拥有 IAM 策略和存储桶策略的 s3:ListBucket 权限。
如果您的用户或角色属于存储桶拥有者的账户,则您无需同时使用 IAM 策略和存储桶策略来允许 s3:ListBucket 操作。您只需要使用其中一个策略来允许 s3:ListBucket 操作即可。
**重要事项:**如果 IAM 策略或存储桶策略已经允许 s3:ListBucket 操作,则检查其他策略是否存在明确拒绝该操作的语句。显式拒绝语句会覆盖允许语句。
以下示例 IAM 策略授予 s3:ListBucket 权限:
{
"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 命令
如果您的存储桶属于另一个账户并启用了请求者付款,请验证您的存储桶策略和 IAM 策略是否都授予了 ListObjectsV2 权限。如果已正确授予 ListObjectsV2 权限,请检查 sync 命令语法。如果您在运行 sync 命令时未包括 --request-payer requester 选项,则会出现“访问被拒绝”错误。
例如,运行以下 sync 命令,但将 requester-pays-bucket 替换为您的存储桶名称:
aws s3 sync ./ s3://requester-pays-bucket/ --request-payer requester
相关信息
示例 2:存储桶拥有者授予跨账户存储桶权限
Amazon S3 基于身份的策略