mcpField
A
aws-cloudformation-cloudfront

aws-cloudformation-cloudfront

github.com/giuseppe-trisciuoglio云与 DevOps36566 次安装7 周前更新
代码仓库

关于 aws-cloudformation-cloudfront

此技能指导使用 AWS CloudFormation 创建 CloudFront CDN 基础设施,面向云工程师,涵盖分发、源站、缓存、安全、监控和模板组织。

主要功能

  1. 01CloudFront 分发与多源配置
  2. 02缓存策略与路径行为
  3. 03安全标头与 WAF 集成
  4. 04CloudFront Functions 配置
  5. 05日志、监控与跨栈输出

适用场景

  1. 01用 CloudFormation 创建 CDN
  2. 02为不同路径设置缓存规则
  3. 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.md
caching.md
constraints.md
examples.md
origins.md
reference.md
security.md
template-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 成本)

相关资源

评论

支持 Markdown