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: BucketName
、Fn::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 函数