CloudFormation创建S3桶遇NotStabilized错误,求排查方案
解决CloudFormation创建S3桶时的NotStabilized错误
错误原因
你的S3桶配置中,PublicAccessBlockConfiguration仅设置了BlockPublicAcls: false,但其余三个公共访问阻止参数(BlockPublicPolicy、IgnorePublicAcls、RestrictPublicBuckets)默认值为true。其中BlockPublicPolicy: true会阻止S3应用包含公开访问规则的桶策略(即你模板中Principal: "*"的语句),导致CloudFormation持续等待桶策略生效,最终超时抛出NotStabilized错误。
修复步骤
1. 修正S3桶的公共访问阻止配置
更新S3Bucket资源的PublicAccessBlockConfiguration,将所有四个参数设为false,确保桶策略能正常应用:
S3Bucket: Type: AWS::S3::Bucket Properties: BucketName: !FindInMap [AccountsMap, !Ref "AWS::AccountId", BucketName] PublicAccessBlockConfiguration: BlockPublicAcls: false BlockPublicPolicy: false IgnorePublicAcls: false RestrictPublicBuckets: false # 其余配置保持不变...
2. (推荐)改用CloudFront Origin Access Identity(OAI)提升安全性
当前桶策略允许所有用户访问GetObject,存在安全风险。建议为CloudFront配置专属OAI,仅允许CloudFront访问S3桶:
步骤1:添加CloudFront OAI资源
在模板中新增CloudFrontOAI资源:
CloudFrontOAI: Type: AWS::CloudFront::CloudFrontOriginAccessIdentity Properties: CloudFrontOriginAccessIdentityConfig: Comment: OAI for CloudFront access to my S3 bucket
步骤2:修改桶策略的访问规则
将原桶策略中Principal: "*"的语句替换为允许OAI访问:
BucketPolicy: Type: AWS::S3::BucketPolicy Properties: Bucket: !Ref S3Bucket PolicyDocument: Statement: - Effect: Allow Action: - s3:GetObject - s3:GetObjectAcl Principal: AWS: !Sub 'arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity ${CloudFrontOAI}' Resource: !Join [ '', ['arn:aws:s3::', !Ref S3Bucket, '/*']] # 其余规则保持不变...
步骤3:在CloudFront分发中关联OAI
后续创建CloudFront分发时,在Origin配置中选择该OAI,确保CloudFront通过OAI访问S3桶。
3. 验证桶名唯一性
S3桶名是全局唯一的,确认你映射中配置的BucketName未被其他AWS用户占用,若已被占用需修改为唯一名称。
内容的提问来源于stack exchange,提问作者RedPen
相关产品推荐
相关产品推荐

