我创建了一个策略:
"Effect": "Allow",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::my-bucket",
"arn:aws:s3:::my-bucket/*"
]
并且策略的用户可以使用 CLI 在指定的存储桶内移动对象。但是,他们无法使用控制台在存储桶内移动(复制/剪切然后粘贴(对象。尝试粘贴对象时,他们总是出现错误"访问被拒绝"。
在一一执行操作后,我发现所有存储桶(arn:aws:s3:::*
(都需要GetBucketLocation
和ListAllMyBuckets
才能在一个存储桶内复制粘贴/剪切粘贴。因此,添加以下操作有效:
"Effect": "Allow",
"Action": [
"s3:GetBucketLocation",
"s3:ListAllMyBuckets"
],
"Resource": "arn:aws:s3:::*"
我的问题是:为什么 CLI 不需要 2 个操作来允许用户在一个存储桶内移动对象,但控制台需要它们?
这是因为 Amazon S3 控制台调用这些特定的 API。
它可能调用GetBucketLocation
因为 AWS API 调用需要发送到包含目标存储桶的区域,因此它需要知道目标存储桶的区域。
它在显示存储桶的完整列表时调用ListAllMyBuckets
。奇怪的是,它在特定存储桶中需要这些权限。它应该只在转到 S3 控制台的"主页"时需要它,而不是在复制对象时特别需要它。
当然,AWS CLI 不会列出存储桶,因此它不会调用ListAllMyBuckets
。
您可以使用 AWS CloudTrail 查看对您的 AWS 账户进行的 API 调用,包括控制台和 AWS CLI 的调用。