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. 01CloudFormation で 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 を追加する

リクエスト/レスポンスを操作する 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 を使用してオリジンへのアクセスを制限します
  • プライベートコンテンツには署名付き URL を使用します
  • レート制限を実装します
  • 必要に応じて地理的制限を設定します
パフォーマンス
  • コストを最適化するため、適切な 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 Identity(OAI)よりも Origin Access Control(OAC)を優先してください
  • 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 API と 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 の料金)

関連リソース

コメント