当我在 Amazon S3 存储桶上运行 sync 命令时,为什么会收到 ListObjectsV2 访问被拒绝错误?
描述
当您运行 aws s3 sync 命令时,Amazon S3 会发出以下 API 调用:
ListObjectsV2、
CopyObject、
GetObject 、
PutObject。
更具体地说,会发生以下情况:
-
Amazon S3 会列出源和目标以检查对象是否存在。
-
然后,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: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
本文来自博客园, 作者:Star-Hitian, 转载请注明原文链接:https://www.cnblogs.com/Star-Haitian/p/16354697.html