CloudFront を本番運用する際の設計・セキュリティ・パフォーマンス・コスト・運用の観点ごとのベストプラクティスをまとめたもの。
目次
1. オリジン保護(CloudFront を経由しないアクセスを防ぐ)
| オリジン種別 | 推奨方式 |
|---|
| S3 バケット | OAC(Origin Access Control) を使用。旧方式の OAI は新規利用しない。バケットはパブリックアクセスブロックを有効にし、バケットポリシーで AWS:SourceArn に対象ディストリビューションを指定する |
| ALB / EC2 / NLB | VPC オリジン を使用し、オリジンをプライベートサブネットに置いてインターネットから隠す。クロスアカウント構成・WebSocket・デュアルスタックにも対応 |
| Lambda 関数 URL | OAC を使用して署名付きリクエストのみ受け付ける |
| その他のカスタムオリジン | カスタムヘッダー(シークレット値をローテーション)+ オリジン側 WAF / SG で検証。セキュリティグループには AWS マネージドプレフィックスリスト com.amazonaws.global.cloudfront.origin-facing を使う。より強固にするならオリジン向け mTLS |
- S3 は「静的ウェブサイトホスティングのエンドポイント」ではなく REST エンドポイント+OAC を使う(パブリック公開が不要になる)
- SPA のルーティングはカスタムエラーレスポンス、または CloudFront Functions でのパス書き換えで対応
2. セキュリティ
TLS / HTTPS
- ビューワープロトコルポリシーは Redirect HTTP to HTTPS または HTTPS Only
- セキュリティポリシーは TLSv1.2_2021 以上(要件が許せば TLS 1.3 系)
- オリジンへの通信も HTTPS Only。オリジン証明書は信頼された CA 発行のものを使う
- 証明書は ACM(us-east-1) で発行し自動更新に任せる
- 必要に応じてビューワー mTLS(クライアント証明書認証)を利用
レスポンスヘッダー
- レスポンスヘッダーポリシー で以下を付与(マネージドの
SecurityHeadersPolicy が出発点として便利)
Strict-Transport-Security
Content-Security-Policy
X-Content-Type-Options: nosniff
X-Frame-Options / Referrer-Policy
- CORS はレスポンスヘッダーポリシーで一元管理する
AWS WAF / DDoS
- ディストリビューションに AWS WAF を関連付ける
- AWS マネージドルール(Core rule set, Known bad inputs, IP reputation など)
- レートベースルールで L7 DDoS / 総当たり対策
- 必要に応じて Bot Control、CAPTCHA / Challenge
- AWS Shield Standard は自動適用。重要サービスは Shield Advanced を検討
- 地理的制限が必要なら CloudFront の Geo Restriction または WAF の地域ルール
アクセス制御
- 有料・限定コンテンツは 署名付き URL / 署名付き Cookie
- キーグループ(信頼されたキーグループ)を使用。ルートアカウントの CloudFront キーペアは使わない
- ハッシュアルゴリズムは SHA-256 を選択
- トークン検証などの軽量な認可は CloudFront Functions で実装
3. キャッシュ戦略
ポリシーの使い分け
- キャッシュポリシー(キャッシュキーに含めるもの)と オリジンリクエストポリシー(オリジンに転送するだけのもの)を分離する
- キャッシュキーに含めるヘッダー・Cookie・クエリ文字列は 必要最小限 に。不要な値を含めるとキャッシュヒット率が大きく下がる
- 可能な限り マネージドポリシー を利用(
CachingOptimized、CachingDisabled、AllViewer など)
- レガシーの「キャッシュ設定(Forwarded values)」は使わない
TTL と Cache-Control
- オリジン側で
Cache-Control を適切に返し、CloudFront の Min / Default / Max TTL はその範囲を制御する役割にする
- 静的アセットは ファイル名にハッシュを含める(バージョニング) + 長期 TTL(例:
max-age=31536000, immutable)
- HTML など頻繁に変わるものは短い TTL、または
stale-while-revalidate / stale-if-error を活用
- 動的 API は
CachingDisabled を使い、ビヘイビアを分ける
ヒット率の向上
- Origin Shield を有効化し、オリジンに最も近いリージョンを指定(オリジン負荷軽減・ヒット率向上)
- 圧縮(Gzip / Brotli)を有効化し、キャッシュポリシーで
Accept-Encoding の正規化を有効にする
- クエリ文字列や Cookie の正規化は CloudFront Functions で行う
- CloudWatch の
CacheHitRate を定常監視し、キャッシュ統計レポートで低ヒットのパスを特定する
無効化(Invalidation)
- 無効化は最後の手段。基本は ファイル名バージョニング で対応
- 関連コンテンツをまとめて消す必要がある場合は キャッシュタグによる無効化 を活用
- ワイルドカード(
/*)の乱用は避ける(コスト・オリジン負荷の急増)
4. パフォーマンス
- HTTP/2・HTTP/3 を有効化
- IPv6 を有効化
- ビヘイビアはパスパターンで静的 / 動的 / API に分割し、それぞれに最適なポリシーを当てる
- オリジン接続の設定を調整(接続タイムアウト、接続試行回数、キープアライブ、読み取りタイムアウト)
- 大容量ファイルは Range リクエストを活用
- 画像は Dynamic Image Transformation などを使い、フォーマット変換・リサイズをエッジ側で行う
5. エッジコンピューティングの使い分け
| 用途 | 推奨 |
|---|
| ヘッダー操作、URL リダイレクト / 書き換え、キャッシュキー正規化、簡易トークン検証、A/B テスト振り分け | CloudFront Functions(低レイテンシ・低コスト。KeyValueStore と組み合わせ可) |
| ネットワーク呼び出し、ボディ参照、重い処理、オリジンリクエスト / レスポンスでの処理 | Lambda@Edge |
- まず CloudFront Functions で実現できないか検討する
- Lambda@Edge はコールドスタートとコストを考慮し、オリジン側イベントでの利用を優先(ビューワー側イベントは全リクエストで実行される)
6. 可用性・耐障害性
- オリジングループ(オリジンフェイルオーバー) で、プライマリ障害時(5xx / 403 / 404 など指定ステータス)にセカンダリへ切り替え
- S3 はクロスリージョンレプリケーションと組み合わせる
- カスタムエラーページ を用意し、エラーのキャッシュ TTL(Error Caching Minimum TTL)を短めに設定
stale-if-error でオリジン障害時に古いキャッシュを返す
- 設定変更は 継続的デプロイ(ステージングディストリビューション) で一部トラフィックに試してから昇格
7. ログ・監視
- 標準ログ(v2) を S3 / CloudWatch Logs / Data Firehose に出力。必要に応じて リアルタイムログ を Kinesis Data Streams へ
- CloudWatch の 追加メトリクス を有効化(キャッシュヒット率、オリジンレイテンシ、エラー率のステータス別内訳)
- アラーム例
5xxErrorRate / 4xxErrorRate の急増
OriginLatency の悪化
CacheHitRate の低下
- WAF のログ・メトリクスも併せて監視
- 設定変更は CloudTrail で追跡
8. コスト最適化
- 料金体系を比較検討:従量課金、定額料金プラン(CDN・WAF・DNS・ログなどを月額にまとめ、超過料金なし)、大規模なら CloudFront Security Savings Bundle / プライベート料金
- プライスクラス で配信エッジを限定(利用者が特定地域に偏る場合)
- キャッシュヒット率を上げてオリジン転送量・オリジン側コストを削減
- 圧縮を有効化して転送量を削減
- AWS オリジン(S3、ALB など)から CloudFront へのデータ転送は無料である点を活用し、オリジンを直接公開しない
- ログはサンプリングや保存期間・出力先を見直し、不要なリアルタイムログは避ける
- 無効化リクエストの件数(月間無料枠超過分)に注意
9. 運用・IaC
- ディストリビューションは CloudFormation / CDK / Terraform で管理し、手動変更を避ける
- ポリシー(キャッシュ / オリジンリクエスト / レスポンスヘッダー)は再利用可能なリソースとして共通化
- 複数テナント(多数のドメイン)を扱う場合は マルチテナントディストリビューション の利用を検討
- 代替ドメイン(CNAME)は Route 53 の エイリアスレコード(A / AAAA)で設定
- タグ付けによりコスト配分・所有者を明確化
チェックリスト
参考