关于 aws-cloudformation-cloudfront
此技能指导使用 AWS CloudFormation 创建 CloudFront CDN 基础设施,面向云工程师,涵盖分发、源站、缓存、安全、监控和模板组织。
主要功能
- 01CloudFront 分发与多源配置
- 02缓存策略与路径行为
- 03安全标头与 WAF 集成
- 04CloudFront Functions 配置
- 05日志、监控与跨栈输出
适用场景
- 01用 CloudFormation 创建 CDN
- 02为不同路径设置缓存规则
- 03配置自定义域名与安全防护
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ giuseppe-trisciuoglio/ developer-kit --skill aws-cloudformation-cloudfront安装后在 Claude Code 中输入/aws-cloudformation-cloudfront确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/advanced-features.mdcaching.mdconstraints.mdexamples.mdorigins.mdreference.mdsecurity.mdtemplate-structure.md详细介绍
AWS CloudFormation CloudFront CDN
概述
使用 AWS CloudFormation 模板创建可用于生产环境的 CDN 基础设施。本技能涵盖 CloudFront 分配、多种源站(ALB、S3、API Gateway、Lambda@Edge、VPC Origins)、CacheBehaviors、Functions、SecurityHeaders,以及参数、输出和跨栈引用的最佳实践。
使用场景
- 使用 CloudFormation 创建 CloudFront 分配
- 使用路径模式配置源站(ALB、S3、Lambda@Edge、VPC Origins)
- 使用 CacheBehaviors 和 Cache Policies 实现缓存
- 使用 ACM 和 SecurityHeaders 配置自定义域名
- 将 WAF 与 CloudFront 分配集成
说明
按照以下步骤使用 CloudFormation 创建 CloudFront 分配:
1. 定义分配参数
部署前进行验证:
aws cloudformation validate-template --template-body file://template.yaml
cfn-lint template.yaml
指定域名、ACM 证书、价格等级和源站设置:
Parameters:
DomainName:
Type: String
Default: cdn.example.com
Description: Custom domain name for CloudFront distribution
CertificateArn:
Type: AWS::ACM::Certificate::Arn
Description: ACM certificate ARN for HTTPS
PriceClass:
Type: String
Default: PriceClass_All
AllowedValues:
- PriceClass_All
- PriceClass_100
- PriceClass_200
Description: CloudFront price class
OriginDomainName:
Type: String
Description: Domain name of the origin (ALB or S3)
2. 配置源站
添加 S3 存储桶、ALB、API Gateway 或自定义源站。对于 S3 源站,请使用 OAI(旧版)或 OAC(推荐):
Resources:
# S3 Bucket
StaticBucket:
Type: AWS::S3::Bucket
Properties:
BucketName: !Sub "static-assets-${AWS::AccountId}-${AWS::Region}"
PublicAccessBlockConfiguration:
BlockPublicAcls: true
BlockPublicPolicy: true
# Origin Access Control (recommended)
OriginAccessControl:
Type: AWS::CloudFront::OriginAccessControl
Properties:
OriginAccessControlConfig:
Name: !Sub "${AWS::StackName}-oac"
OriginAccessControlOriginType: s3
SigningBehavior: always
SigningProtocol: sigv4
3. 设置默认缓存行为
配置查看器请求/响应策略和缓存:
Resources:
CloudFrontDistribution:
Type: AWS::CloudFront::Distribution
Properties:
DistributionConfig:
Origins:
- Id: S3Origin
DomainName: !GetAtt StaticBucket.RegionalDomainName
AccessControlId: !Ref OriginAccessControl
S3OriginConfig:
OriginAccessIdentity: ""
DefaultCacheBehavior:
TargetOriginId: S3Origin
ViewerProtocolPolicy: redirect-to-https
AllowedMethods:
- GET
- HEAD
CachedMethods:
- GET
- HEAD
Compress: true
CachePolicyId: !Ref CachePolicy
4. 添加其他缓存行为
为不同内容类型创建特定路径的缓存规则:
Resources:
ApiCachePolicy:
Type: AWS::CloudFront::CachePolicy
Properties:
CachePolicyConfig:
Name: !Sub "${AWS::StackName}-api-cache"
DefaultTTL: 300
MaxTTL: 600
MinTTL: 60
CloudFrontDistribution:
Type: AWS::CloudFront::Distribution
Properties:
DistributionConfig:
CacheBehaviors:
- PathPattern: "/api/*"
TargetOriginId: ApiOrigin
CachePolicyId: !GetAtt ApiCachePolicy.Id
AllowedMethods:
- GET
- HEAD
- OPTIONS
- PUT
- POST
5. 配置安全设置
实现安全标头并集成 WAF:
Resources:
SecurityHeadersPolicy:
Type: AWS::CloudFront::ResponseHeadersPolicy
Properties:
ResponseHeadersPolicyConfig:
Name: !Sub "${AWS::StackName}-security-headers"
SecurityHeadersConfig:
StrictTransportSecurity:
AccessControlMaxAgeSec: 31536000
IncludeSubdomains: true
Override: true
FrameOptions:
FrameOption: DENY
Override: true
WAFWebACL:
Type: AWS::WAFv2::WebACL
Properties:
Name: !Sub "${AWS::StackName}-waf"
Scope: CLOUDFRONT
DefaultAction:
Allow: {}
6. 添加 CloudFront Functions
配置用于处理请求/响应的函数:
Resources:
RewritePathFunction:
Type: AWS::CloudFront::Function
Properties:
Name: !Sub "${AWS::StackName}-rewrite-path"
FunctionCode: |
function handler(event) {
var request = event.request;
// Function code here
return request;
}
Runtime: cloudfront-js-1.0
AutoPublish: true
7. 配置监控
设置日志记录并将访问日志保存到 S3:
Resources:
AccessLogsBucket:
Type: AWS::S3::Bucket
Properties:
BucketName: !Sub "cloudfront-logs-${AWS::AccountId}"
CloudFrontDistribution:
Type: AWS::CloudFront::Distribution
Properties:
DistributionConfig:
Logging:
Bucket: !Ref AccessLogsBucket
Prefix: cloudfront-logs/
IncludeCookies: false
8. 创建输出
导出分配详情,以供跨栈引用:
Outputs:
DistributionDomainName:
Description: CloudFront distribution domain name
Value: !GetAtt CloudFrontDistribution.DomainName
Export:
Name: !Sub "${AWS::StackName}-DistributionDomainName"
DistributionId:
Description: CloudFront distribution ID
Value: !Ref CloudFrontDistribution
Export:
Name: !Sub "${AWS::StackName}-DistributionId"
最佳实践
安全
- 始终使用 HTTPS,并将最低 TLS 版本设为 1.2
- 使用 HSTS 和 XSS 防护实现 SecurityHeaders
- 使用 WAF 防范常见攻击
- 为 CORS 配置适当的 Access-Control
- 使用 OAI/OAC 限制源站访问
- 使用 Signed URLs 保护私有内容
- 实现速率限制
- 根据需要配置地理限制
性能
- 使用适当的 PriceClass 来优化成本
- 根据内容类型配置缓存 TTL
- 启用压缩(Gzip/Brotli)
- 使用 CloudFront Functions 执行轻量级操作
- 优化标头转发(不要转发不必要的标头)
- 考虑使用 Origin Shield 来降低源站负载
- 使用带路径模式的多个源站
监控
- 启用 CloudWatch 指标和警报
- 配置实时日志以便排查问题
- 监控缓存命中率
- 针对错误率和延迟配置警报
- 使用 CloudFront 报告分析流量
部署
- 部署前使用变更集
- 使用 cfn-lint 测试模板
- 按生命周期和所有权组织栈
- 使用加权别名实现蓝绿部署
- 使用 StackSets 进行多区域部署
模板结构
- 使用 AWS 专用参数类型(AWS::ACM::Certificate::Arn、AWS::S3::Bucket::RegionalDomainName)
- 实现参数约束(MinLength、MaxLength、AllowedValues、AllowedPattern)
- 使用 Conditions 配置特定环境的设置
- 利用 Mappings 配置特定区域的设置
- 使用 Metadata 对参数进行分组和添加标签
- 使用嵌套栈实现模块化
缓存策略
- 为不同内容类型使用 Cache Policies
- 配置 Origin Request Policies,以控制发送到源站的内容
- 设置适当的 TTL 值:
- 静态资源:86400-31536000 秒(1 天到 1 年)
- API 响应:60-600 秒(1-10 分钟)
- 动态内容:0 秒(不缓存)
- 为基于文本的内容启用压缩
- 使用带版本号的路径使缓存失效
限制和警告
- ACM 证书:用于 CloudFront 的证书必须位于
us-east-1(弗吉尼亚北部) - 限制:每个 AWS 账户最多 200 个分配,每个分配最多 25 个源站和 25 个缓存行为
- 部署时间:CloudFront 分配最长需要 30 分钟才能部署;请做好相应规划
- 证书要求:每个分配最多 100 个备用域名;请包含默认域名以启用 SSL
- OAI 弃用:对于 S3 源站,优先使用 Origin Access Control(OAC),而不是 Origin Access Identity(OAI)
- Lambda@Edge 限制:查看器请求/响应的内存为 128MB,超时时间为 30s;源站请求适用单独的限制
- 更改集:部署前始终使用更改集预览资源变更,避免意外删除
- 偏差检测:CloudFormation 不会检测 CloudFront 分配的偏差——请在模板中管理所有设置
示例
最简 S3 静态站点分配
AWSTemplateFormatVersion: "2010-09-09"
Resources:
S3Bucket:
Type: AWS::S3::Bucket
Properties:
BucketName: !Sub "cdn-static-${AWS::AccountId}"
PublicAccessBlockConfiguration:
BlockPublicAcls: true
BlockPublicPolicy: true
OriginAccessControl:
Type: AWS::CloudFront::OriginAccessControl
Properties:
OriginAccessControlConfig:
Name: !Sub "${AWS::StackName}-oac"
OriginAccessControlOriginType: s3
SigningBehavior: always
SigningProtocol: sigv4
CloudFrontDistribution:
Type: AWS::CloudFront::Distribution
Properties:
DistributionConfig:
Enabled: true
DefaultRootObject: index.html
Origins:
- Id: S3Origin
DomainName: !GetAtt S3Bucket.RegionalDomainName
AccessControlId: !Ref OriginAccessControl
DefaultCacheBehavior:
TargetOriginId: S3Origin
ViewerProtocolPolicy: redirect-to-https
Compress: true
CachePolicyId: 658327ea-f89d-4fab-a63d-7e88639e58f6
PriceClass: PriceClass_All
HttpVersion: http2and3
Outputs:
DistributionDomainName:
Value: !GetAtt CloudFrontDistribution.DomainName
具有缓存行为的多源站配置
Resources:
CachePolicyApi:
Type: AWS::CloudFront::CachePolicy
Properties:
CachePolicyConfig:
Name: !Sub "${AWS::StackName}-api"
DefaultTTL: 300
MaxTTL: 600
MinTTL: 60
CloudFrontDistribution:
Type: AWS::CloudFront::Distribution
Properties:
DistributionConfig:
Origins:
- Id: S3Origin
DomainName: !GetAtt StaticBucket.RegionalDomainName
AccessControlId: !Ref OriginAccessControl
- Id: ApiOrigin
DomainName: !GetAtt ApiLoadBalancer.DNSName
CustomOriginConfig:
OriginProtocolPolicy: https-only
HTTPPort: 80
HTTPSPort: 443
CacheBehaviors:
- PathPattern: "/api/*"
TargetOriginId: ApiOrigin
CachePolicyId: !GetAtt CachePolicyApi.Id
ViewerProtocolPolicy: https-only
- PathPattern: "/static/*"
TargetOriginId: S3Origin
CachePolicyId: 658327ea-f89d-4fab-a63d-7e88639e58f6
参考资料
如需详细的实现指南,请参阅:
-
template-structure.md - 完整的模板结构、AWS 专用参数类型、参数约束、SSM 参数引用、用于参数分组的元数据、用于宏的转换、用于环境专属配置的条件、嵌套堆栈,以及采用导出/导入模式的跨堆栈引用
-
origins.md - 源站配置,包括使用 OAI/OAC 的 S3 源站、带安全组的 ALB 源站、API Gateway 源站(REST 和 HTTP API)、Lambda@Edge 源站、使用 Global Accelerator 的 VPC 源站、自定义源站,以及包含路径模式的多源站配置
-
caching.md - 缓存策略(托管、自定义、图像、视频)、源站请求策略、响应标头策略、缓存行为配置、转发值(查询字符串、标头、Cookie)、缓存键配置,以及 TTL 配置最佳实践
-
security.md - 安全标头(CSP、HSTS、XSS 保护)、CORS 配置、与托管和自定义规则的 WAF 集成、源站访问控制(OAI 与 OAC)、签名 URL 和签名 Cookie、地理限制、强制使用 HTTPS、TLS 配置,以及字段级加密
-
advanced-features.md - CloudFront Functions(查看器请求、查看器响应、源站请求)、用于身份验证和 URL 重写的 Lambda@Edge、地理限制、价格类别优化、压缩(Gzip 和 Brotli)、将实时日志传输到 Kinesis 和 S3、自定义错误页面、函数关联,以及 Origin Shield 配置
-
constraints.md - 资源限制(最多 200 个分配、最多 25 个源站、最多 25 个缓存行为)、DNS 和证书约束(ACM 位于 us-east-1、300 个备用域名)、运营约束(最多 15 次失效操作、部署最长 30 分钟)、安全约束(HTTPS、CSP、WAF),以及成本考量(数据传输、区域定价、Lambda@Edge 成本)