aws-cloudformation-cloudfront について
AWS CloudFormation で CloudFront CDN インフラを作成するスキルです。クラウドエンジニア向けに、ディストリビューション、オリジン、キャッシュ、セキュリティ、監視、テンプレート構成を扱います。
主な機能
- 01CloudFront ディストリビューションと複数オリジン設定
- 02キャッシュポリシーとパス別動作
- 03セキュリティヘッダーと WAF の統合
- 04CloudFront Functions の設定
- 05ログ、監視、スタック間出力
活用シーン
- 01CloudFormation で 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 を追加する
リクエスト/レスポンスを操作する 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 の料金)