如何从CloudFormation调试's3:CreateBucket Access Denied'

时间:2017-03-26 19:51:31

标签: amazon-cloudformation serverless-framework

我有一个从无服务器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。

2 个答案:

答案 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"