助け合いフォーラム
世界中のユーザーに対して、製品カタログを高速に配信するにはどうすればよいか。
正解
Amazon CloudFrontでALBをオリジンとして指定し、すべてのコンテンツを配信する
解説

したがって正解は
・Amazon CloudFrontでALBをオリジンとして指定し、すべてのコンテンツを配信する
です。
その他の選択肢については、以下のとおりです。
・Amazon CloudFrontでALBをオリジンとして指定し、静的コンテンツを配信する。動的コンテンツはALBから直接配信する
CloudFrontはエッジロケーションを使用して、静的コンテンツだけでなく動的コンテンツも効率的かつ高速に配信します。
動的コンテンツもCloudFront経由の方が高速に配信できるので、誤りです。
・静的コンテンツをAmazon S3に保存して配信する。動的コンテンツはALBから配信する
Amazon S3はグローバルサービスですが、データは一つのリージョン内の複数のAZに保存されます。
静的コンテンツをAmazon S3に保存しても配信にかかる時間は変わらないので、誤りです。
・すべてのコンテンツを複数のリージョンに展開する。Amazon Route 53の地理的近接性ルーティングポリシーを使用して、ユーザーの近くのリージョンから配信する
地理的近接性ルーティングポリシーは、ユーザーの位置情報を元にユーザーと地理的に近いリージョンにあるリソースのIPアドレスを回答するルーティングポリシーです。地理的近接性ルーティングポリシーを使用すると、ユーザーの近くのリージョンからコンテンツを配信するので通信遅延は少なくなりますが、一般的にリージョン(世界で31か所)よりもエッジロケーション(世界で400か所以上)から配信する方が、応答時間が短くなります。また、EC2インスタンスを複数リージョンに展開する必要があるので、その分ランニングコストがかかります。
CloudFront経由でコンテンツを配信する方が効果的なので、誤りです。
参考
コンテンツ配信ネットワークとは、インターネット上のコンテンツを高速化して配信するためのネットワークのことです。コンテンツ配信ネットワークでは、世界各地の配信サーバー(エッジサーバー)がオリジナルデータがあるサーバー(オリジンサーバー)のコンテンツをコピーして保管(キャッシュ)します。クライアントはオリジンサーバーへアクセスする代わりに、エッジサーバーのキャッシュからコンテンツを受け取ります。
コンテンツ配信ネットワークを利用することにより、クライアントがコンテンツに低遅延でアクセス可能になる他、オリジンサーバーへの負荷軽減にもなります。

【Amazon CloudFront】
Amazon CloudFrontは、AWS上で動作する安全で高速なコンテンツ配信ネットワークです。CloudFrontを利用すると、世界各地に配置されているエッジロケーションから、自動的にクライアントと地理的な距離が近いエッジロケーションが選択されます。そしてエッジロケーション内のエッジサーバーがコンテンツを配信します。
CloudFrontのオリジンサーバーには、EC2インスタンスやS3バケットなどのAWSリソースや、オンプレミスのサーバーを設定できます。

CloudFrontでは、静的なコンテンツのほか、ライブストリーミングやオンデマンドストリーミングなどの動的なコンテンツも高いパフォーマンスで配信できます。AWSメディアサービス(動画伝送サービスや、動画変換サービスなど)と連携して、世界中にいるクライアントからのリクエストに対して低遅延で動的コンテンツを配信します。
【エッジロケーション】
AZとは異なるAWSデータセンターで、AZよりも数多く世界中に配置されています。Amazon CloudFrontやAWS WAFなど一部のグローバルサービスを提供するとともに、AWS Global Acceleratorを利用してユーザーからリージョンサービスへアクセスする際の通信経路でもあります。

【ディストリビューション】
CloudFrontを使用するには、はじめに「ディストリビューション」を作成します。ディストリビューションではオリジンサーバーやキャッシュなど、コンテンツを配信するために必要な各種設定をします。
ディストリビューションを作成するとCloudFrontを通してコンテンツにアクセスするためのURL「http(s)://xxxxxx.cloudfront.net」が発行されます。URLは通信の暗号化の有無(HTTP/HTTPS)を選択できます。AWS Certificate Manager(サーバー証明書を管理するサービス)から発行したサーバー証明書をインポートすることで、URLに独自ドメイン名を使用することもできます。
■オリジンサーバーの設定
オリジンサーバーは、S3バケットやELBなどのAWSサービスから選択するか、ドメイン名を入力します。

すでにS3の静的Webホスティング(バケットに保存している静的コンテンツをWebサイトとして公開できる機能)を設定しているS3バケットもオリジンサーバーとして指定できます。
■キャッシュの設定や機能
キャッシュには、CloudFrontのキャッシュとブラウザキャッシュの2種類があります。CloudFrontのキャッシュは「キャッシュポリシー」でTTL(Time To Live)を設定でき、ブラウザキャッシュは「Cache-Controlヘッダー」で制御できます。
コンテンツ配信ネットワークはキャッシュが重要な役割を持っています。以下の設定や機能によってキャッシュを適切に管理することが大切です。
○キャッシュTTL(Time To Live:TTL)
キャッシュを保持する時間のことです。URLパスごとに指定できます。CloudFrontはキャッシュTTLが超過した後にクライアントからのリクエストを受けると、オリジンサーバーにコンテンツの更新有無を確認し、更新されていればキャッシュに反映しつつ応答を返します。
キャッシュTTLを含むキャッシュの設定のことを「キャッシュポリシー」といいます。
○キャッシュ削除(Invalidation)
エッジサーバーに保存されているキャッシュを即座に削除できる機能です。キャッシュを削除した後にクライアントからデータのリクエストを受け取ると、エッジサーバーは必ずオリジンサーバーへコンテンツを取得しにいくので、クライアントへ配信するコンテンツが最新化されます。削除対象のデータはフォルダ名やファイル名で指定できます。
S3バケットを使用してWebコンテンツを保存する際、各オブジェクトに対してCache-Controlヘッダーを設定することで、ブラウザ(ローカル)キャッシュの動作を制御できます。S3オブジェクトのCache-Controlヘッダーをno-cacheに設定すると、ブラウザキャッシュが無効になりますが、CloudFrontのキャッシュには最小TTLが適用されます。最小TTLはデフォルトで1秒なので、コンテンツが変更された直後でも最新のコンテンツが返されます。
【CloudFrontを利用したセキュリティの強化】
CloudFrontを利用してコンテンツへのアクセスを制御したり、暗号化することでデータを保護します。
■OAI(Origin Access Identity)
S3バケット内のコンテンツへのアクセスをCloudFront経由でのアクセスに限定し、クライアントからS3バケットへ直接アクセスされないようにする機能です。クライアントからオリジナルコンテンツへの直接アクセスを制限することにより、オリジンサーバーのデータを保護できます。
オリジンサーバーにS3バケットを選択すると、OAIの設定が表示されます。

OAIを利用する時は、S3バケットのバケットポリシーにCloudFront経由のみアクセス可能にする設定を追加します。

■CloudFront署名付きURL
URLを知っている特定のクライアントが期限付きでコンテンツへアクセスできる機能です。S3の署名付きURLと同じく、CloudFront署名付きURLは非常に長いランダムな文字列で作成されているため、URLを知らない人が推測することはほぼ不可能です。
CloudFront署名付きURLを利用する時は、OAIを有効にしてS3バケットへ直接アクセスされないように設定します。また、URL発行時に有効期限を設定すると、有効期限の過ぎたURLは無効になります。
■地理的制限
クライアントからのアクセスを国別に制限できる機能です。クライアントの接続情報から接続元の国を判別して、ホワイトリストに設定した国からのアクセスは許可、ブラックリストに設定した国からのアクセスは拒否します。例えば、特定の国に対して法律上の理由でコンテンツの配信ができない場合などに利用します。
■フィールドレベル暗号化
CloudFrontはユーザーからオリジンサーバーへのリクエストを受けるリバースプロキシとして動作します。フィールドレベル暗号化は、ユーザーから送信されたHTMLフォームのPOSTリクエストのうち、一部のフィールドを暗号化し、特定のアプリケーションでのみ復号可能とする機能です。リクエストをオリジンに転送する前にCloudFrontがさらにデータを暗号化するので、HTTPS通信のセキュリティがより強固になります。フィールドレベル暗号化は、ECサイトで送信される個人情報のような高い機密性が求められるデータに利用します。
下記の図では、ユーザーから送信された機密情報をCloudFrontで暗号化し、Lambda関数のみアクセス可能にしています。

CloudFrontで動的コンテンツを配信する理由がわかりません
在庫情報などの動的コンテンツで構成される
問題文にある、在庫情報のような定期的に情報が変わるようなコンテンツをCloudFrontから配信したら、古い在庫情報が表示されてしまうかと思い、
動的コンテンツはALBから直接配信するのが正解かと思いました。
CloudFrontで動的コンテンツも対応しているようですが、内容が頻繁に変わることが予想される動的コンテンツに対して使う理由がどうしてもわかりません。
ご教授いただけると幸いです。
キーポイントとしては
会社は今後、Webサイトを複数言語に対応させて、 世界中に 製品を販売していく予定である。
世界中のユーザー に対して、製品カタログを 高速に配信する にはどうすればよいか。
から「世界中に」「高速に」とある部分ですかね。この時点で世界各地にキャッシュされて高速に配信されることが期待される CloudFront が正解なのかなというのは想像はつくというのはご認識されていると思います。一方でこの問題の回答に対する疑問として「動的コンテンツ」を CloudFront で扱う理由がわからないということなのだと思うのですが、まず今は多くの CDN (Contents Delivery Network) で動的コンテンツの配信をサポートしています。参考 URL の1つ目もそうですが、他にもありますね。
https://aws.amazon.com/jp/cloudfront/dynamic-content/
https://www.cloudflare.com/ja-jp/learning/cdn/caching-static-and-dynamic-content/
https://www.stream.co.jp/blog/blogpost-36616/
https://learn.microsoft.com/ja-jp/azure/cdn/cdn-dynamic-site-acceleration
https://www.fastly.com/jp/blog/serving-truly-dynamic-content-with-a-modern-cdn-and-edge-first-delivery
理由としては本当にシンプルで「動的に生成するコンテンツのためにオリジンに取りに行っていては遅くて仕方がない」から、ですかね。いかにオリジンにデータをとりにいかず、ユーザーにはエッジからの配信だけで完了させるかが高速化のポイントなので、CloudFront を含む CDN がサポートしているのにその機能を使わないのはもったいないとも言えるかなって感じですね。
コメント
ご丁寧な回答誠にありがとうございます。以前はできなかった動的サイトのキャッシュができるようになり、高速化のために動的サイトもCDNを使うこと理解しました。
しかし、一点どうもわからない部分があります。例えば今回の例だと在庫情報ですが、在庫数が変わった直後はどうなるのでしょうか?
オリジンサーバーに最新の在庫データがあり、ユーザーはキャッシュされている古い在庫数を見ることになるのでしょうか。リアルタイムに変更されるわけではなく、ある程度ラグがあると考えて良いのでしょうか?
コメント
この投稿に対して返信しませんか?
r rysk777
2024/12/16 21:57
ご丁寧な回答誠にありがとうございます。以前はできなかった動的サイトのキャッシュができるようになり、高速化のために動的サイトもCDNを使うこと理解しました。 しかし、一点どうもわからない部分があります。例えば今回の例だと在庫情報ですが、在庫数が変わった直後はどうなるのでしょうか? オリジンサーバーに最新の在庫データがあり、ユーザーはキャッシュされている古い在庫数を見ることになるのでしょうか。リアルタイムに変更されるわけではなく、ある程度ラグがあると考えて良いのでしょうか?