【AWS】用語を整理しながら学ぶAWS Amazon CloudFront

## はじめに

この記事ではAWSが提供するAmazon CloudFront（以下、CloudFront）を学習していく内容となっています。
主な内容としては実践したときのメモを中心に書きます。（忘れやすいことなど）
誤りなどがあれば修正していく想定です。

## Amazon CloudFrontとは

CloudFrontは、AWSが提供するグローバルなコンテンツ配信ネットワーク（CDN）です。
AWSの公式サイトには下記のように表現されています。

> 低レイテンシーかつ高速な転送速度でコンテンツを安全に配信
> グローバルに分散した 600 以上の Point of Presence (PoP) を経由してデータを配信
> トラフィックの暗号化やアクセス制御によりセキュリティを向上させ、AWS Shield Standard を利用
> 統合されたリクエスト、カスタマイズ可能な料金オプション、AWS オリジンからのデータ転送にかかる費用をゼロ
> AWS のコンテンツ配信ネットワーク (CDN) エッジで実行するコードを、サーバレスコンピューティング機能を使ってカスタマイズ

[Amazon CloudFront（グローバルなコンテンツ配信ネットワーク）](https://aws.amazon.com/jp/cloudfront/)

CloudFrontはコンテンツをユーザに対して高速に配信するためのCDNサービスです。
グローバルに分散したエッジロケーションを利用して、ユーザーに近い場所から動画、音声、画像、アプリケーションファイル、HTMLファイルなどのコンテンツを配信できます。

オリジンを指定することで、S3バケット、EC2インスタンス、Route 53などのAWSのサービスと連携して利用できます。オリジンにはコンテンツを配信するためのソースとなる場所、ディストリビューションを指定します。
エッジでコードを実行、AWS WAF（Web Application Firewall）と連携することでセキュリティを向上できます。

コンテンツをユーザに対して高速に配信する？CDN？グローバルに分散したエッジロケーション？オリジン？AWS WAF？エッジでコードを実行？ナニモワカラナイですね。

## そもそもCDNとは

ということで説明します。

最初にCDN（Content Delivery Network）とは、コンテンツを高速に配信するためのネットワークのことです。
ここで定義するコンテンツとは、動画、音声、画像、アプリケーションファイル、HTMLファイルなどを指します。
では、「コンテンツを高速に配信する」とはどういうことでしょうか。

## 「コンテンツを高速に配信する」とは

たとえば、動画を配信する場合について考えてみましょう。
まず、ユーザーが動画を再生するためには基本的に動画ファイルを手元にダウンロードする必要があります。
このとき、ユーザーが動画ファイルをダウンロードするためにはサーバにアクセスしてファイルをダウンロードする必要がありますが
当然のことながらサーバとユーザーの距離が遠ければ遠いほどダウンロードに時間がかかってしまいます。

この問題を解決するため、CDNではユーザーから近い場所にコンテンツを配置することでユーザーがコンテンツを高速にダウンロードできます。

このとき、コンテンツを配置する場所をロケーションと呼び、CloudFrontではエッジロケーション、配置されたコンテンツは（コンテンツ）キャッシュと呼びます。

また、この時にキャッシュされるコンテンツは元となるコンテンツから取得されます。この元となるコンテンツのことをオリジンと呼びます。

[CDN とは何ですか? - AWS](https://aws.amazon.com/jp/what-is/cdn/)

加えて、世界中（グローバル）にコンテンツの配信先が分散されているため、ユーザーに近い場所からコンテンツを配信できるようになります。

## コンテンツを高速に配信するためのしくみ

コンテンツを高速に配信するためのしくみを理解するにはまずはディストリビューションを理解する必要があります。

またまたまたよくわからないカタカナが出てきました。ディストリビューションとは何でしょうか。

英単語の意味から考えてみましょう。
ディストリビューション（distribution）は配布、分配、流通、配信などの意味を持つ英単語です。

つまり、CDNにおいてはコンテンツを配布、分配、流通、配信するための設定をディストリビューションと呼びます。
CloudFrontでは、コンテンツを配信するための設定のことをディストリビューションと呼びます。

### 補足：ディストリビューションという言葉について

Linuxに知見のある人は「ディストリビューション」という言葉を聞いたことがあるかもしれません。

LinuxにおけるディストリビューションはLinuxディストリビューションと呼ばれています。
簡単にいえば、Linuxカーネルとソフトウェアをまとめたものを指します。

たとえば、Ubuntu、CentOS、Debian、Fedoraなどがあります。AWSではAmazon Linux 2も有名です。※最近ではAmazon Linux 2023がリリースされました。

Linuxにしても「配布、分配、流通、配信するための設定」という意味でディストリビューションという言葉が使われていることがわかります。

## 話を戻して

なんとなくCDNとCloudFrontの概要がわかってきたところでいくつか疑問に思ったかもしれません。
CDNがあると何が嬉しいのか？CloudFrontはCDNだけのサービスなのか？などです。1つずつ見ていきましょう。

## CDNがあると何が嬉しいのか

CDNがあると何が嬉しいのか、という疑問については、以下のようなメリットがあります。

- ユーザーに近い場所からコンテンツを配信できるため、コンテンツを高速に配信できる
- オリジンへの負荷を軽減できる
- 低コストでコンテンツを配信できる
- セキュリティを向上できる

4つのメリットがあります。1つ目は先ほど説明した通りです。
2つ目から見ていきましょう。

### オリジンへの負荷を軽減できる

簡単に説明するとオリジンへのアクセスする回数を減らせるため、オリジンへの負荷を軽減できます。
オリジンはコンテンツの元となる場所です。たとえば、S3バケット、EC2インスタンスなどがオリジンとなります。

ここでもし、EC2をオリジンとしていた場合はユーザーがEC2にアクセスする回数が減るため、EC2への負荷を軽減できます。

低コストでコンテンツを配信できることの主な具体例はS3にCDNを挟む例です。
S3であれば、取り出しリクエストが減るため、S3への取り出しリクエストにかかるコストを削減できます。

### セキュリティを向上できる

「CDNなのに？」と思うかもしれませんが、CDNを利用することでセキュリティを向上できます。
大量アクセスの攻撃の典型例で知られるDDoS攻撃に対しては複数のロケーションを利用することで攻撃を分散できます。

また、CloudFrontではAWS WAFと連携することでセキュリティを向上できます。AWS WAFの`WAF`はWeb Application Firewallの略で、Webアプリケーションに対する攻撃を検知してブロックするためのサービスです。

今回は解説しませんが、簡単に説明するとWebアプリケーションのセキュリティを高めるサービスとして知られていますので覚えておきましょう。

[AWS WAF 保護の使用 - 参考](https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/distribution-web-awswaf.html)

## CloudFrontはCDNだけのサービスなのか

CDNがあると何が嬉しいのかがわかったところで、CloudFrontはCDNだけのサービスなのかについて見ていきましょう。

結論を言うと、CloudFrontはCDNだけのサービスではありません。
前述したCDNとWAFに加えて、エッジでコードを実行する機能、サーバレスレスコンピューティング機能を使ってカスタマイズする機能などがあります。

「えぇ！CDNのサービスなのにコードを実行できるの？！」と思ったかもしれません、私もそう思いました。1つずつ見ていきましょう。

### Lambda@Edge とは

Lambda@Edgeは、CloudFrontのエッジロケーションで実行されるサーバレスコンピューティング機能です。
「LambdaとついているということはAWS Lambdaを使うんですね！」と思ったかもしれませんが残念、Lambda@EdgeはAWS Lambdaとは別のサービスです。

[Lambda@Edge を使用したエッジでのカスタマイズ](https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/lambda-at-the-edge.html)

ただし、ドキュメント内では`Lambda@Edge は AWS Lambda の拡張`と記載されていますので、AWS Lambdaと関連があるかもしれません。

Lambda@EdgeはCloudFrontのディストリビューションに関連づけられ、ディストリビューションへのリクエストが発生した際にLambda@Edgeが実行されます。

用途としてはたとえば、リクエストヘッダの修正があります。つまりはリクエスト内容を修正できるのでレスポンスをカスタマイズできます。

### CloudFront Functions とは

次にLama@Edgeと同じくエッジでコードを実行する機能であるCloudFront Functionsについて見ていきましょう。
CloudFront FunctionsはCloudFront上で実行されるサーバレスコンピューティング機能です。

Lambda@Edgeとどう違うのか気になったかもしれません。難しいことを抜きにして違いを1つ説明するとCloudFront FunctionsではCloudFront KeyValueStoreが利用できます。

[CloudFront Functions 用の低レイテンシーデータストア、Amazon CloudFront KeyValueStore の紹介](https://aws.amazon.com/jp/blogs/news/introducing-amazon-cloudfront-keyvaluestore-a-low-latency-datastore-for-cloudfront-functions/)

CloudFront KeyValueStoreはエッジロケーションで実行できるグローバルな低レイテンシーキーバリューデータストアです。

CloudFront KeyValueStoreを使うと、CloudFront Functionsはキーを使ってデータを保存、取得、削除できるため
コードに値を埋め込んで再デプロイといったことをすることなく、データとコードを独立できます。

[Quotas on CloudFront Functions](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/cloudfront-limits.html#limits-functions)

他にも多くの違いがありますが、ここでは割愛します。
詳しくはドキュメントを参照してください。
[CloudFront Functions と Lambda@Edge の選択 - 参考](https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/edge-functions-choosing.html)

## リソースのレポート、モニタリング、ログ記録

いろんなことができるCloudFrontですが、リソースのレポート、モニタリング、ログ記録、設定変更の追跡ができます。
具体的には以下のようなサービスと連携できます。

- Amazon CloudWatch Logs
- AWS CloudTrail
- AWS Config

[レポート、メトリクス、ログ](https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/reports-and-monitoring.html)

## 料金

CloudFrontの料金については、データ送信、エッジコンピューティング、その他の機能の3つで分かれます。（2024年3月20日の記載を参考）

データ送信については`AWS のあらゆるオリジンからのオリジン取得は無料`という記載あるとおり、オリジンからのデータ転送にかかる料金はありません。

エッジコンピューティングについては、Lambda@Edge、CloudFront Functions、CloudFront KeyValueStoreの利用に料金が発生します。なお、リクエスト100万件単位での料金が設定されています。

その他の機能はほとんど説明していませんが、リクエストの形態やWebSocket、専用IPカスタムSSLの利用によって料金が発生します。

[料金](https://aws.amazon.com/jp/cloudfront/pricing/)

## まとめ

今回はCloudFrontの概要についていくつか確認しました。
ユーザに近い場所からコンテンツを配信するというのがCDNサービスの主な役割ですが、CloudFrontはそれに加えてセキュリティを向上できる、オリジンへの負荷を軽減できる、低コストでコンテンツを配信できるといったメリットがあります。

ユーザからするとUXの向上のためのコンテンツ配信サービスであり、インフラを構築する身からするとオリジンを守るサービスと言えそうです。

## おわり