S3 创建 CloudFormation 导致 400 错误请求

Posted

技术标签:

【中文标题】S3 创建 CloudFormation 导致 400 错误请求【英文标题】:S3 Creation CloudFormation results in 400 Bad Request 【发布时间】:2019-06-15 00:31:33 【问题描述】:

我在使用 CloudFormation 创建 S3 存储桶时遇到了这个问题。我收到 400 错误请求。如果有人可以提供帮助,将不胜感激。

aws cloudformation deploy --profile DEV --stack-name testBucket --template-file create_bucket.yml --region us-east-1 --capabilities CAPABILITY_IAM CAPABILITY_NAMED_IAM --parameter-overrides BucketName=myBucket

模板:

    AWSTemplateFormatVersion: 2010-09-09
    Parameters:
      BucketName:
        Description: Provisioned read throughput for each table
        Type: String
    Resources:
      MYBUCKET:
        Type: AWS::S3::Bucket
        Properties:
          BucketName: $BucketName
      MYBUCKETPOLICY:
        Type: AWS::S3::BucketPolicy
        Properties:
          Bucket: !Ref MYBUCKET
          PolicyDocument:
            Id: ReportPolicy
            Version: "2012-10-17"
            Statement:
              - Sid: ReportBucketPolicyDoc
                Effect: Allow
                Action: "s3:*"
                Principal:
                  AWS: !Join ['', ["arn:aws:iam::", !Ref "AWS::AccountId", ":root"]]
                Resource: !Join ['', ['arn:aws:s3:::', !Ref MYBUCKET, '/*']]

错误

错误请求(服务:Amazon S3;状态代码:400;错误代码:400 错误 要求;请求编号:B4AEAA3C454B7868; S3 扩展请求 ID: ATFscTA4dQw8J8AYUfkIARYhiT4/BpVWRcD172WnR75Uzm+i5dlHOTC2HCb9drkO16dzYiELJZc=)

【问题讨论】:

【参考方案1】:

以下线程与尝试更改 S3 存储桶区域的任何人相关他们删除了另一个区域中的存储桶。

在一个区域中删除存储桶与在所有其他区域中可用的名称之间基本上存在延迟。因此,如果您在 ap-southeast-2 中删除了一个存储桶,然后尝试创建一个与 us-east-1 同名的存储桶,您应该会收到这种错误。

https://github.com/aws/aws-cdk/issues/6646#issuecomment-597905903

【讨论】:

你是救星,谢谢!亚马逊认真地需要改进他们关于这个错误的消息。【参考方案2】:

您应该使用!Ref BucketName 而不是$BucketName

  MYBUCKET:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Ref BucketName

【讨论】:

你是怎么得到这个的?我的意思是有没有办法获取有关这种错误情况的信息,例如cloudtrail 或 smthg 之类的? 这个答案帮助我找到了我的一个错误,我在Fn::Sub: "$BucketName" 中缺少美元符号,导致Fn::Sub: "BucketName" 和类似的400 错误。遗憾的是,即使是 cfn-lint 工具也只会将此报告为警告。 这是错误的,BucketName 是一个变量,应该和 !Sub $BucketName 一起使用 @Baris 这没有错。您可以通过以下任何一种方式访问​​参数:!Ref BucketName!Sub "$BucketName"Fn::Ref: BucketNameFn::Sub "$BucketName" 和其他方式,具体取决于您希望使用内部函数和引号获得的详细程度...【参考方案3】:

您没有正确引用BucketName 参数:

MYBUCKET:
  Type: AWS::S3::Bucket
    Properties:
    BucketName: !Sub $BucketName  # Or !Ref BucketName

【讨论】:

以上是关于S3 创建 CloudFormation 导致 400 错误请求的主要内容,如果未能解决你的问题,请参考以下文章

适用于 S3 事件的 Cloudformation SQS 策略

使用 CloudFormation 在 S3 存储桶中创建 Lambda 通知

从 s3 部署包结构问题上传 cloudformation lambda 函数

使用 cloudformation 为 S3 存储桶启用 Lambda 函数

CloudFormation 中如何派生 S3 存储桶名称?

CloudFormation 模板设置 S3 存储桶默认加密 [重复]