如何通过CloudFormation YAML配置仅允许CloudFront访问的S3策略
正确的CloudFormation YAML配置:S3桶仅允许指定CloudFront分发访问
直接上可复用的完整配置片段,包含桶的创建和对应的权限策略:
Resources: MyPrivateS3Bucket: Type: AWS::S3::Bucket Properties: BucketName: my-private-bucket-example # 替换成你的桶名 PublicAccessBlockConfiguration: BlockPublicAcls: true BlockPublicPolicy: true IgnorePublicAcls: true RestrictPublicBuckets: true MyBucketPolicy: Type: AWS::S3::BucketPolicy Properties: Bucket: !Ref MyPrivateS3Bucket PolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Principal: Service: cloudfront.amazonaws.com Action: - s3:GetObject Resource: !Sub 'arn:aws:s3:::${MyPrivateS3Bucket}/*' Condition: StringEquals: AWS:SourceArn: !Sub 'arn:aws:cloudfront::${AWS::AccountId}:distribution/${MyCloudFrontDistributionId}' # 替换MyCloudFrontDistributionId为你的分发ID
关键配置说明
- 彻底锁死公共访问:
PublicAccessBlockConfiguration的四个参数全部设为true,从根源上杜绝任何公开访问桶的可能,哪怕不小心设置了公开ACL也不会生效。 - 用!Sub避免硬编码错误:
Resource通过!Sub动态拼接桶的ARN和对象路径,不用手动输入桶名,减少拼写错误。- 条件里的
AWS:SourceArn同样用!Sub生成CloudFront分发的ARN,自动填充当前账户ID,只需替换MyCloudFrontDistributionId为你实际的分发ID即可,确保只有指定的CloudFront分发能访问桶内对象。
- 最小权限原则:只给CloudFront服务授予
s3:GetObject权限,刚好满足分发静态资源的需求,避免过度授权。
之前出现"Policy has invalid"错误,大概率是硬编码ARN时格式不对,或者没正确使用CloudFormation的变量替换函数。用!Sub自动填充动态值后,就能规避这类格式问题。
内容的提问来源于stack exchange,提问作者Stéphane GRILLON
相关产品推荐
相关产品推荐

