我正在运行 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 调用,表示本地到桶操作
**注意:**此解决方法假设 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/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
相关信息
桶拥有者授予跨账户桶权限
桶策略和用户策略