CloudFront によるコンテンツ配信とエッジ最適化
CloudFront のエッジネットワーク、キャッシュ戦略、アクセス制御(OAI/OAC)、署名付き URL/Cookie、暗号化、ACM 連携による高速かつセキュアなコンテンツ配信を学びます。
CloudFront とは
Amazon CloudFront は、AWS が提供する CDN(Content Delivery Network)サービスです。世界中に配置された 400 以上のエッジロケーションを通じて、ユーザーに最も近い地点からコンテンツをキャッシュ配信します。
CDN の役割
CDN は、オリジンサーバー(EC2、S3、ALB など)の負荷を軽減しながら、エンドユーザーへのコンテンツ配信を高速化します。北米、アジア、ヨーロッパなど各地域のエッジロケーションが、オリジンの手前でキャッシュを保持することで、以下を実現します:
- レイテンシーの削減: ユーザーに地理的に近いエッジから配信
- オリジン負荷の軽減: 繰り返しアクセスされるコンテンツをエッジで処理
- 帯域コストの最適化: オリジンからのデータ転送量を削減
CloudFront の主要機能
分散配信とパフォーマンス
-
400 以上のエッジロケーション
世界中に配置された POP(Point of Presence)から、ユーザーに最も近いロケーションを自動選択して配信します。 -
リージョナルエッジキャッシュ
オリジンと POP の中間に配置され、人気が中程度のコンテンツを保持します(後述)。 -
高パフォーマンス配信
HTTP/1.0、HTTP/1.1、HTTP/2 に対応し、Gzip 圧縮によるデータサイズ削減も可能です。
セキュリティ統合
-
AWS WAF 連携
エッジでアプリケーション層の攻撃(SQL インジェクション、XSS)をブロックします。 -
AWS Shield
L3/L4 の DDoS 攻撃を自動緩和します(Standard は無料)。 -
AWS Certificate Manager(ACM)
SSL/TLS 証明書を自動プロビジョニング・更新し、HTTPS 配信を実現します。
柔軟なオリジン設定
- S3 バケット: 静的コンテンツ(HTML、画像、動画)の配信
- カスタムオリジン: EC2、ALB、オンプレミスサーバーなど HTTP サーバーからの配信
- マルチプルオリジン: パスパターンごとに異なるオリジンを設定(例:
/api/*は ALB、/static/*は S3) - オリジングループ: 複数のオリジンをフェイルオーバー構成で冗長化
エッジコンピューティング
- Lambda@Edge: エッジロケーションで Node.js/Python コードを実行し、リクエスト・レスポンスを動的に変更
- CloudFront Functions: より軽量な JavaScript 実行環境で、リクエストのリダイレクトやヘッダー操作を実施
エッジネットワークの階層構造
CloudFront は多層のキャッシュ構造で効率的な配信を実現します。
POP(エッジロケーション)
ユーザーに最も近い配信拠点です。人気の高いコンテンツをキャッシュし、高速にレスポンスを返します。
リージョナルエッジキャッシュ
オリジンサーバーと POP の中間層として機能します。以下の特徴があります:
-
中程度の人気コンテンツを保持
POP に残らないコンテンツでも、リージョナルエッジキャッシュに保持されていれば、オリジンへのリクエストを回避できます。 -
オリジンへの直接転送
以下のリクエストはリージョナルエッジキャッシュをバイパスし、オリジンに直接送られます:- すべてのヘッダーを転送するよう構成されたリクエスト
- プロキシメソッド(PUT、POST、PATCH、OPTIONS、DELETE)
配信フロー
-
ユーザーがコンテンツをリクエスト
最も近い POP に DNS 解決されます。 -
POP がキャッシュを確認
- キャッシュヒット → 即座にレスポンス
- キャッシュミス → リージョナルエッジキャッシュに問い合わせ
-
リージョナルエッジキャッシュが確認
- キャッシュヒット → POP に返却し、POP もキャッシュ
- キャッシュミス → オリジンから取得
Distribution 設定
CloudFront の配信設定は Distribution で管理します。
Distribution タイプ
現在は Web Distribution のみが利用可能です(RTMP Distribution は廃止されました)。
| 項目 | 説明 |
|---|---|
| 対応プロトコル | HTTP/1.0、HTTP/1.1、HTTP/2 |
| オリジン | S3 バケット、MediaPackage チャネル、HTTP サーバー(EC2、ALB、オンプレミス) |
| 配信コンテンツ | 静的コンテンツ(HTML、CSS、画像)、動的コンテンツ(API レスポンス)、動画ストリーミング(HLS、DASH) |
設定項目
- オリジン設定: S3 エンドポイントまたはカスタムオリジンの IP アドレス・ドメイン名
- 独自ドメイン: Route 53 で独自ドメインを設定し、CNAME レコードで CloudFront Distribution を指定
- 使用量上限: デフォルトで最大 40Gbps・10万 RPS。超過する場合は上限緩和申請が必要
キャッシュ戦略
キャッシュ保持期間(TTL)
CloudFront は TTL(Time To Live) でキャッシュの有効期限を制御します。
| TTL 設定 | 説明 | デフォルト値 |
|---|---|---|
| Minimum TTL(最小 TTL) | CloudFront がオリジンに問い合わせるまでの最小保持期間 | 0 秒 |
| Default TTL(デフォルト TTL) | オリジンから Cache-Control ヘッダーが返されない場合の保持期間 | 86,400 秒(1 日) |
| Maximum TTL(最大 TTL) | Cache-Control ヘッダーで指定された有効期限の上限 | 31,536,000 秒(1 年) |
Cache-Control ヘッダーとの連携
オリジンサーバーから返される HTTP ヘッダーで、キャッシュ動作を細かく制御できます。
| ヘッダー | 説明 | 例 |
|---|---|---|
| Cache-Control: max-age | キャッシュの有効期間を秒単位で指定 | Cache-Control: max-age=3600(1時間) |
| Expires | キャッシュの絶対的な有効期限を指定 | Expires: Sat, 01 Jan 2030 00:00:00 GMT |
| Cache-Control: no-cache | キャッシュせず、常にオリジンに問い合わせる | 動的コンテンツ、リアルタイムデータ |
キャッシュキーの構成
CloudFront は、以下の要素を組み合わせてキャッシュキーを生成します:
- URL パス:
/images/logo.png - クエリ文字列:
?version=2&format=webp - リクエストヘッダー:
Accept-Language: ja - Cookie:
session_id=abc123
これらの完全一致でキャッシュが識別されるため、不要なパラメータを転送するとキャッシュヒット率が低下します。
キャッシュの無効化
キャッシュが期限切れになる前に強制削除する方法です。
- 無効化パス指定: 最大 3,000 個のパスを個別指定
- ワイルドカード指定: 最大 15 個のワイルドカード(例:
/images/*)
緊急時のコンテンツ修正に使用しますが、頻繁な無効化はコストがかかるため、適切な TTL 設計が重要です。
アクセス制御
オリジンへのアクセス制限
OAC(オリジンアクセスコントロール)
S3 バケットへの直接アクセスを制限し、CloudFront 経由のみアクセスを許可する仕組みです。
OAC の利点(OAI からの改善点):
- 全リージョン対応: すべての AWS リージョンの S3 バケットで利用可能
- SSE-KMS 対応: KMS で暗号化された S3 オブジェクトも配信可能
- 動的リクエスト対応: PUT・DELETE など書き込み系リクエストもサポート
設定手順:
- CloudFront Distribution で OAC を作成
- S3 バケットポリシーで、OAC からのアクセスのみ許可
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Principal": {
"Service": "cloudfront.amazonaws.com"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::my-bucket/*",
"Condition": {
"StringEquals": {
"AWS:SourceArn": "arn:aws:cloudfront::123456789012:distribution/EDFDVBD6EXAMPLE"
}
}
}]
}
カスタムヘッダーによる制限
カスタムオリジン(EC2、ALB)への直接アクセスを制限する方法です。
- CloudFront Distribution で任意のカスタムヘッダーを設定(例:
X-Custom-Secret: random-string-12345) - オリジンサーバーで、このヘッダーが含まれるリクエストのみ許可
ALB の場合、リスナールールで X-Custom-Secret ヘッダーの値を検証し、一致しない場合は 403 を返します。
コンテンツへのアクセス制限
署名付き URL
特定のファイルへのアクセスを期限付き・IP制限付きで許可します。
使用シーン:
- 有料コンテンツのダウンロード(ソフトウェアインストーラー、PDF レポート)
- Cookie をサポートしないクライアント(IoT デバイス、モバイルアプリ)
署名付き URL の生成フロー:
- アプリケーションサーバーが CloudFront の秘密鍵で署名を生成
- URL に署名・有効期限・IP 範囲を付与
- ユーザーに署名付き URL を発行
- CloudFront が署名を検証し、条件を満たす場合のみコンテンツを配信
署名付き Cookie
複数のファイルに対して、URL を変更せずにアクセス制御を実現します。
使用シーン:
- 動画ストリーミング(HLS の複数セグメントファイル)
- 会員制サイトの購読者エリア(多数のページ・画像)
署名付き Cookie の設定フロー:
- ユーザーがログイン
- アプリケーションサーバーが署名付き Cookie を Set-Cookie ヘッダーで発行
- ブラウザが Cookie を保持し、以降のリクエストに自動付与
- CloudFront が Cookie を検証し、アクセスを許可
地域制限
特定の国・地域からのアクセスをホワイトリストまたはブラックリストで制限します。
- ホワイトリスト: 指定した国のみアクセス許可
- ブラックリスト: 指定した国からのアクセスを拒否
ライセンス契約や規制要件で配信地域が限定される場合に使用します。
暗号化
SSL/TLS 暗号化
CloudFront は ACM(AWS Certificate Manager) と統合し、HTTPS 配信を実現します。
2つの暗号化区間:
-
ビューワー ↔ CloudFront
- ビューワープロトコルポリシーで「HTTPS のみ」または「HTTP を HTTPS にリダイレクト」を設定
- ACM で発行した証明書を CloudFront に適用
-
CloudFront ↔ オリジン
- オリジンプロトコルポリシーで「HTTPS のみ」または「ビューワーと同じプロトコル」を設定
- オリジンサーバーに有効な証明書を配置
Perfect Forward Secrecy(PFS)対応:
セッションごとに一時的な鍵を生成し、秘密鍵が漏洩しても過去の通信を復号できないようにします。
フィールドレベル暗号化
POST リクエストの特定フィールドのみを暗号化し、アプリケーションサーバーまでエンドツーエンドで保護します。
使用シーン:
- クレジットカード番号
- 社会保障番号
- 医療情報
動作フロー:
- CloudFront にフィールド暗号化プロファイルを設定(暗号化対象フィールド・公開鍵を指定)
- ユーザーがフォームを送信
- CloudFront がエッジで指定フィールドを公開鍵で暗号化
- オリジンに暗号化されたデータを転送
- アプリケーションが秘密鍵で復号
HTTPS による通信路の暗号化とは別に、データ自体を暗号化するため、中間の処理系(ログ収集、WAF)でも平文を参照できません。
セキュリティ連携
AWS WAF
エッジロケーションでアプリケーション層の攻撃をブロックします。
- SQL インジェクション: 不正な SQL 文を含むリクエストを検知
- XSS(クロスサイトスクリプティング): スクリプトタグを含むリクエストを拒否
- レート制限: 特定 IP からの過剰なリクエストを制限
- Referer 制限: 許可されたドメインからのリンクのみ許可(画像の直リンク防止)
AWS Shield
DDoS 攻撃を自動緩和します。
- Shield Standard: すべての CloudFront ディストリビューションに無料で適用され、L3/L4 の DDoS 攻撃を緩和
- Shield Advanced: 有料オプションで、より高度な攻撃に対応し、24/7 の DDoS 対応チームによるサポートを提供
CloudTrail・アクセスログ
- CloudTrail: CloudFront の API 呼び出し(ディストリビューション作成・変更)を記録
- CloudFront アクセスログ: ディストリビューションへの全リクエストを S3 バケットに保存(リクエスト URL、ステータスコード、クライアント IP など)
コスト構造
CloudFront の料金は、主にリクエスト数とデータ転送アウトで決まります。
| 項目 | 内容 |
|---|---|
| リクエスト | HTTP/HTTPS リクエスト、無効化リクエスト、フィールドレベル暗号化リクエスト、リアルタイムログリクエスト |
| データ転送アウト | エッジロケーションからインターネットへのデータ転送(リージョンごとに料金が異なる) |
| データ転送 - オリジンフェッチ | CloudFront がオリジンからコンテンツを取得する際のデータ転送(リージョン内転送) |
| 専用 IP カスタム SSL | 独自 SSL 証明書を専用 IP で提供する場合、1 証明書あたり月額 600 USD |
コスト最適化のポイント:
- キャッシュヒット率を向上: オリジンからのデータ転送を削減
- Gzip 圧縮を有効化: データサイズを削減
- 適切な TTL 設定: 頻繁な無効化リクエストを回避
その他の機能
Gzip 圧縮
CloudFront がエッジでコンテンツを自動圧縮し、ユーザーへの転送量を削減します。
- 対象: テキストベースのコンテンツ(HTML、CSS、JavaScript、JSON)
- 効果: ファイルサイズを 70〜90% 削減
- 設定: Distribution 設定で「Compress Objects Automatically」を有効化
オリジンサーバーの CPU 負荷を削減しながら、配信速度を向上させます。
Lambda@Edge と CloudFront Functions
| 機能 | Lambda@Edge | CloudFront Functions |
|---|---|---|
| 実行環境 | Node.js、Python | JavaScript(ES5) |
| 実行タイミング | ビューワーリクエスト・レスポンス、オリジンリクエスト・レスポンス | ビューワーリクエスト・レスポンスのみ |
| 実行時間制限 | 最大 30 秒 | 最大 1 ミリ秒 |
| 用途 | 複雑な認証、画像リサイズ、A/B テスト | シンプルなリダイレクト、ヘッダー追加、URL 書き換え |
| 料金 | 実行時間とリクエスト数 | リクエスト数のみ(Lambda@Edge より安価) |
まとめ
CloudFront は、グローバルに分散したエッジネットワークを活用して、コンテンツ配信を高速化し、オリジンサーバーの負荷を軽減します。
キャッシュ戦略では、TTL と Cache-Control ヘッダーを適切に設定し、キャッシュヒット率を最大化します。キャッシュキーの設計では、不要なパラメータを除外してヒット率を向上させます。
アクセス制御では、OAC で S3 への直接アクセスを制限し、署名付き URL・Cookie でプライベートコンテンツへのアクセスを時間・IP 制限付きで提供します。
セキュリティでは、ACM と連携した SSL/TLS 暗号化、フィールドレベル暗号化で機密データを保護し、WAF・Shield でアプリケーション層・ネットワーク層の攻撃を緩和します。
CloudFront を適切に設計・運用することで、グローバルなユーザーベースに対して、高速でセキュアなコンテンツ配信を実現できます。
重要ポイント
- ▸CloudFront は世界 400 以上のエッジロケーションでコンテンツをキャッシュし、高速配信を実現
- ▸リージョナルエッジキャッシュが中間層として機能し、オリジンへのリクエストを削減
- ▸TTL と Cache-Control ヘッダーでキャッシュ保持期間を制御し、キャッシュヒット率を最適化
- ▸OAC(オリジンアクセスコントロール)で S3 への直接アクセスを制限し、CloudFront 経由のみ許可
- ▸署名付き URL・Cookie でプライベートコンテンツへのアクセスを時間制限・IP制限付きで提供
- ▸ACM と連携して SSL/TLS 証明書を自動管理し、フィールドレベル暗号化で機密データを保護
このトピックの学習を完了しますか?
完了状態はいつでも切り替えられます