我有一个从无服务器YAML文件创建的CloudFormation堆栈。
其中一项资源是:
"S3BucketWebRoot": {
"Type": "AWS::S3::Bucket",
"Properties": {
"BucketName": "samhain.today",
"AccessControl": "PublicRead",
"WebsiteConfiguration": {
"IndexDocument": "index.html",
"ErrorDocument": "404.html"
}
}
}
我在部署堆栈文件时没有任何问题(包括创建一个S3存储桶本身),但是当堆栈开始构建时,我得到了:
14:38:46 UTC-0500 CREATE_FAILED AWS::S3::Bucket S3BucketWebRoot API: s3:CreateBucket Access Denied
问题是,与无服务器服务相关联的用户作为其策略的一部分:
{
"Effect": "Allow",
"Action": [
"s3:CreateBucket",
"s3:PutObject",
"s3:GetObject",
"s3:ListBucket",
"s3:DeleteObject",
"s3:DeleteBucket",
"s3:ListBucketVersions"
],
"Resource": [
"arn:aws:s3::*:*"
]
}
我怎么去调试呢?我的Resource
是错误的,或者其他一些用户正在使用,但这没有任何意义,因为它们已附加到访问密钥ID。
答案 0 :(得分:1)
我想明确指出@Dancrumb在对已投票否决的答案的评论中已经写的内容:对他和我来说似乎有用的是用单个通配符权限代替细粒度的S3权限:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"s3:*",
...
]
}
}
我只能推测原因。在Github上的无服务器项目的问题报告中,我看到有人提到他们使用的用户与启用了MFA的帐户相关联,这在我的情况下也适用(该帐户具有MFA,而不是用户)。如果 s3:* 对您来说太宽容了,您可以“在事后”通过附加的 deny 段来限制它。不幸的是,我没有时间去验证这个理论。
答案 1 :(得分:-3)
将资源更改为:
"Resource": "*"
这将允许任何资源的给定操作。您的操作都与S3相关,因此他们将被允许在任何Amazon S3存储桶上运行。
如果您想允许它仅在一个桶上运行,请使用:
"Resource": "arn:aws:s3:::BUCKET-NAME"