Amazon CloudFront・AWS Global Accelerator

どちらも世界中にある AWS のエッジロケーション(利用者の近くに置かれた AWS の拠点)を入口にして、遠くの利用者にも速く届けるサービスです。SAA では「キャッシュして配るなら CloudFront、固定 IP や TCP / UDP の高速化なら Global Accelerator」という使い分けと、CloudFront のセキュリティ機能が頻出です。

ひとことで言うと: CloudFront は「近所のコンビニに商品を置いておく」仕組み、Global Accelerator は「近所の入口から本店まで専用の高速道路を通す」仕組みです。

CloudFront は、よく売れる商品(コンテンツ)を近所の店(エッジ)に在庫しておき、本店(オリジン)まで行かずに渡します。Global Accelerator は在庫を持たず、近所の入口で受け付けた客を混雑した一般道(インターネット)ではなく AWS の道で本店へ運びます。

このページで押さえる論点

CloudFront の仕組み: ディストリビューション・オリジン・キャッシュ

Amazon CloudFront は CDN(コンテンツ配信ネットワーク)のサービスです。配信の設定のまとまりをディストリビューションと呼び、作成すると d111111abcdef8.cloudfront.net のようなドメイン名が割り当てられます。独自ドメイン(www.example.com)で使うときは、Route 53 のエイリアスレコードでこのドメイン名に向けます。

コンテンツの本来の置き場所をオリジンと呼びます。S3 バケット、ALB、EC2、API Gateway、さらにオンプレミスの Web サーバーのような AWS 外の HTTP サーバーもオリジンにできます。1 つのディストリビューションに複数のオリジンを登録し、キャッシュ動作(ビヘイビア)で「/images/* は S3 へ、/api/* は ALB へ」のようにパスごとに振り分けられます。

利用者のリクエストは、DNS によって近くのエッジロケーションに届きます。エッジにキャッシュ(コピー)があればそこから即座に返し(キャッシュヒット)、なければオリジンから取ってきて返し、同時にエッジに保存します(キャッシュミス)。キャッシュしてよい期間が TTL(Time To Live)です。キャッシュポリシーを使わない従来の設定では、既定の TTL は 24 時間です。オリジン側で Cache-Control ヘッダーを付けて、ファイルごとに期間を変えることもできます。

再生型アニメ図解

キャッシュミスとキャッシュヒット

利用者 エッジ ロケーション オリジン (S3) キャッシュ: なし ✓ 速い

※簡略化しています: エッジロケーションとオリジンの間にある「リージョン別エッジキャッシュ」(より大きな中間キャッシュ)と、DNS でエッジが選ばれる流れを省いています。

図では省略していますが、エッジロケーションとオリジンの間には、より多くのコンテンツを長く保持するリージョン別エッジキャッシュという中間層があります。エッジでミスしても、ここでヒットすればオリジンまで行かずに済みます。

CloudFront はキャッシュできない動的コンテンツ(ログイン後の画面や API の応答など)にも使えます。この場合もキャッシュはされませんが、利用者は近くのエッジと接続し、そこからオリジンまでは AWS のネットワークを通るため、インターネットを長く通るより速く安定します。また、ディストリビューションは GET・HEAD だけでなく、POST・PUT・DELETE などのリクエストもオリジンへ中継できます(アップロードなど)。

キャッシュの制御: キャッシュポリシー・無効化・Origin Shield・オリジンフェイルオーバー

キャッシュキーとキャッシュポリシー

CloudFront は、URL のパスなどから作るキャッシュキーで「同じコンテンツかどうか」を判断します。キャッシュポリシーで、キャッシュキーにクエリ文字列・ヘッダー・Cookie を含めるかどうかと TTL を決めます。キャッシュキーに含める値を増やすほど、別々のコンテンツとして扱われてヒット率が下がります。ヒット率を上げたいときは、キャッシュキーには本当に必要な値だけを含めます。オリジンに渡したいがキャッシュキーには含めたくない値は、オリジンリクエストポリシーで指定します。

無効化(インバリデーション)

TTL が切れる前にファイルを更新したいときは、無効化でエッジのキャッシュを消します。無効化するパスは 1 か月に 1,000 件まで無料で、それを超えるとパスごとに料金がかかります(アカウント内のすべてのディストリビューションの合計)。/images/* のようなワイルドカードは、多数のファイルが対象でも 1 パスと数えます。頻繁に更新するなら、無効化に頼るより app-v2.js のようにファイル名にバージョンを含める方法も有効です。

Origin Shield

Origin Shield は、リージョン別エッジキャッシュとオリジンの間に追加するキャッシュの層です。世界各地からの同じコンテンツへのリクエストを 1 か所にまとめるので、キャッシュヒット率が上がり、オリジンへのリクエストが減ります。「オリジンの負荷を減らしたい」「複数リージョンからのアクセスでオリジンへの問い合わせが多い」ときの答えになります。

オリジンフェイルオーバー(オリジングループ)

プライマリとセカンダリの 2 つのオリジンでオリジングループを作ると、プライマリが指定した HTTP ステータスコード(500、502、503、504、403、404 など)を返したときや、接続できない・タイムアウトしたときに、CloudFront がセカンダリへ切り替えます。たとえば「別リージョンにレプリケーションした S3 バケットをセカンダリにする」構成です。フェイルオーバーするのは GET・HEAD・OPTIONS(キャッシュ対象に設定した場合)のリクエストだけで、POST や PUT では切り替わりません。

CloudFront のセキュリティ

機能何をするか選ぶ場面
OAC(オリジンアクセスコントロール)S3 バケットへのアクセスを CloudFront 経由だけに限定する。バケットポリシーで CloudFront のサービスプリンシパルからのアクセスだけを許可するS3 の URL を直接たたかれないようにしたい。S3 は非公開のまま配信したい
署名付き URL有効期限などを付けた URL を持つ人だけが 1 つのファイルを取得できる購入者だけがインストーラーをダウンロード。Cookie を使えないクライアント
署名付き CookieCookie を持つ人だけが複数のファイルを取得できる。URL は変えなくてよい会員エリアの全ファイル、HLS 形式の動画(多数の小さなファイル)
地理的制限国単位で許可リストかブロックリストを作り、対象外の国からのリクエストに 403(Forbidden)を返す配信権のある国だけに提供、特定の国からのアクセスを拒否
HTTPS(ACM 証明書)利用者と CloudFront の間を TLS で暗号化する。独自ドメインの証明書は us-east-1(バージニア北部)の ACM で発行(またはインポート)する独自ドメインで HTTPS 配信したい
AWS WAFディストリビューションに Web ACL を関連付け、SQL インジェクションなどの攻撃や特定 IP・レート超過のリクエストをエッジで止めるアプリへの攻撃をオリジンに届く前に防ぎたい
AWS ShieldDDoS 攻撃からの保護。CloudFront・Global Accelerator は Shield と統合されている。Shield Standard は追加料金なしで自動的に有効DDoS 対策(高度な保護や DDoS 対応チームの支援が必要なら Shield Advanced)

エッジでの処理: CloudFront Functions と Lambda@Edge

CloudFront では、リクエストやレスポンスをエッジで書き換える小さなプログラムを動かせます。オリジンまで行かずに処理できるので速く、オリジンの負荷も減ります。2 種類あり、処理の重さで使い分けます。

項目CloudFront FunctionsLambda@Edge
言語JavaScriptNode.js、Python
動くタイミングビューワーリクエスト・ビューワーレスポンス(利用者との間)だけビューワーリクエスト・ビューワーレスポンスに加え、オリジンリクエスト・オリジンレスポンス
実行時間サブミリ秒(1 ミリ秒未満)の軽い処理秒単位の処理もできる
ネットワーク・リクエスト本文へのアクセスできないできる(外部 API の呼び出しなど)
向く処理ヘッダーの追加、URL の書き換え・リダイレクト、簡単なトークン検証など大量で軽い処理外部サービスへの問い合わせ、本文を使う処理、オリジンの選択など重い処理

試験では「軽い処理を低コストで大量に」なら CloudFront Functions、「ネットワークにアクセスする」「オリジン側のイベントで動かす」なら Lambda@Edge、が判断の目安です。

Global Accelerator の仕組み

AWS Global Accelerator は、アプリケーションの入口として 2 つの固定の IPv4 アドレスを用意するサービスです(デュアルスタックなら IPv6 アドレス 2 つも追加)。この IP アドレスはエニーキャスト(同じ IP アドレスを世界中のエッジロケーションが同時に受け持ち、利用者に近い拠点が応答する方式)で広告されます。利用者のトラフィックは最寄りのエッジから AWS のグローバルネットワークに入り、混雑しやすいインターネットを通る区間が短くなるので、遅延や揺らぎが減ります。

構成要素は、IP アドレスを持つアクセラレーター、ポートとプロトコル(TCP / UDP)を決めるリスナー、リージョンごとのエンドポイントグループ、その中のエンドポイント(ALB、NLB、EC2 インスタンス、Elastic IP アドレス)です。

このほか、ゲームのマッチングのように特定の EC2 インスタンスへ決め打ちで送りたい場合向けのカスタムルーティングアクセラレーターもあります。こちらはヘルスチェックによるフェイルオーバーを行いません。

CloudFront と Global Accelerator の使い分け

項目CloudFrontGlobal Accelerator
役割CDN。コンテンツをエッジにキャッシュして配るネットワークの高速化。キャッシュせず、パケットをエッジから AWS のネットワークでリージョンへ運ぶ
プロトコルHTTP / HTTPS(WebSocket を含む)TCP / UDP(HTTP 以外も可)
入口ドメイン名(IP アドレスは固定ではない)2 つの固定のエニーキャスト IP アドレス
主な機能キャッシュ、OAC、署名付き URL / Cookie、地理的制限、エッジ関数ヘルスチェックによる数秒のリージョン切り替え、トラフィックダイヤル、エンドポイントの重み
オリジン / エンドポイントS3、ALB、EC2、API Gateway、AWS 外の HTTP サーバーなどALB、NLB、EC2、Elastic IP アドレス
DDoS 対策Shield と統合、WAF を関連付け可能Shield と統合
比較・選択フローチャート

質問に答えて CloudFront か Global Accelerator かを選ぶ

配信したいアプリケーションを思い浮かべて「はい / いいえ」で答えてください。答えた経路が上から順に表示されます。

    ※簡略化しています: 両方を組み合わせる構成や、料金の比較は分岐に含めていません。

    Route 53 のルーティングとの違いも問われます。Route 53 のレイテンシーやフェイルオーバーのルーティングは DNS の答えを変える方式なので、利用者側に古い答えがキャッシュされている間(TTL の間)は切り替わりません。Global Accelerator は入口の IP アドレスが変わらず、その先の行き先を AWS 側で切り替えるので、DNS のキャッシュの影響を受けません。「DNS のキャッシュに左右されず、すばやくリージョンを切り替えたい」は Global Accelerator です(Route 53 の詳細は Route 53 のページ)。

    コストの観点では、CloudFront はエッジでキャッシュから返した分だけオリジンへのリクエストとオリジンからのデータ転送が減るため、オリジンの台数や負荷を抑えられます。

    問題文のキーワード → 選ぶべき答え

    問題文の言い回し選ぶべき答えと理由
    「世界中の利用者に静的コンテンツ(画像・動画)を低遅延で配信」CloudFront。エッジにキャッシュして近くから返す
    「S3 バケットを公開せず、CloudFront 経由でだけ配信」OAC+バケットポリシー(OAI は旧方式)
    「購入者だけが 1 つのファイルを期限付きでダウンロード」署名付き URL
    「会員だけが複数のファイル(動画のセグメントなど)を見られる」「URL を変えたくない」署名付き Cookie
    「特定の国からのアクセスを拒否」「配信権のある国だけ」CloudFront の地理的制限(国単位。細かい条件は WAF)
    「CloudFront で独自ドメインの HTTPS」us-east-1 の ACM 証明書
    「オリジンの負荷を減らす」「キャッシュヒット率を上げる」TTL を延ばす、キャッシュキーを絞る、Origin Shield
    「プライマリのオリジンが 5xx を返したら別のオリジンから配信」オリジングループ(オリジンフェイルオーバー)
    「エッジでヘッダー追加・URL 書き換えを低コストで大量に」CloudFront Functions
    「エッジで外部 API を呼ぶ」「オリジンリクエスト時に処理」Lambda@Edge
    「TCP / UDP(ゲーム・IoT・VoIP)の遅延を減らす」Global Accelerator
    「固定 IP アドレスで公開」「顧客のファイアウォールに IP を登録」Global Accelerator(2 つの固定エニーキャスト IP)
    「DNS キャッシュに左右されず、数秒でリージョンをフェイルオーバー」Global Accelerator
    「リージョンごとのトラフィックの割合を少しずつ変える」Global Accelerator のトラフィックダイヤル

    引っかけポイント

    まとめ: SAA 試験で押さえるポイント

    確認問題

    参考リンク

    AWS 公式ドキュメント(外部サイトが開きます)。本文の数値はこれらで確認しています。