如果'AmazonS3FullAccess'策略有效,那么肯定会有一些对应用程序工作至关重要的操作 .
除了 ListBucket , PutObject , GetObject 和 DeleteObject 动作的存在似乎合乎逻辑之外,我发现 PutObjectAcl 也是必要的 .
“Amazon S3访问控制列表(ACL)使您能够管理对存储桶和对象的访问 . 每个存储桶和对象都有一个ACL作为子资源附加到它 . 它定义了哪些AWS账户或组被授予访问权限和访问类型 . 收到针对资源的请求后,Amazon S3会检查相应的ACL以验证请求者是否具有必要的访问权限 . 当您创建存储桶或对象时,Amazon S3会创建一个默认ACL,授予资源所有者对资源的完全控制权“
“此PUT操作的实现使用acl子资源为存在于存储桶中的对象设置访问控制列表(ACL)权限...对象的ACL设置为对象版本级别 . 默认情况下,PUT设置对象当前版本的ACL . “
我无法在亚马逊论坛的my request of support找到有关为什么需要 PutObjectAcl 的解释,但根据我的理解,可能是第一次将对象上传到存储桶中时创建对象的ACL的操作,并且应该由进行上传的应用程序(或IAM用户) . 您可以在上面的亚马逊论坛讨论及以下内容中找到我的政策副本:
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"s3:ListBucket"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::"
},
{
"Action": [
"s3:DeleteObject",
"s3:GetObject",
"s3:PutObject",
"s3:PutObjectAcl"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::/*"
}
]
}
还要考虑Heroku's suggestions关于您的桶名称的选择:避免例如标点符号 .