はじめに

AWSグローバルインフラストラクチャ紹介ページにて、「リージョン」「AZ(アベイラビリティゾーン)」と一緒に名前が出てくる「エッジロケーション」だが、実際に「エッジロケーション」について調べようとしたところ、AWSから「エッジロケーションとは~である」と説明するようなページを見つけられなかった。
本記事では、エッジロケーションの概要から利点、エッジロケーションを用いたサービスの一つである「Amazon CloudFront」の実装方法までをまとめていく。
紹介しないこと
・リージョンとAZ(アベイラビリティゾーン)について
・配信したいコンテンツの量によるCloudFrontのパフォーマンス変化について
もしもリージョンとAZに関して知りたい方は下の記事をお勧めします。少し情報は古いですが、AZとリージョンの説明が分かりやすく記載されています。
https://biz.nuro.jp/column/aws-mama-063/
(AWSの「マルチAZ」とは?DR対策で担える役割を考える|ソニー|コラム|NURO Biz(ニューロ・ビズ))
エッジロケーションとエッジネットワーク
AWSグローバルインフラストラクチャの紹介にはデータセンターを配置している場所を指す「リージョン」や、その地理に配置されたデータセンター群を指すAZ(アベイラビリティゾーン)の他に、「エッジロケーション」という設備(データセンター)が世界中に存在する。
このエッジロケーションではコンテンツ配信のキャッシュを保管し、それを活用することでユーザーへの最適なコンテンツ配信を実現することができる。
エッジロケーションを利用したAWSサービスである「Amazon CloudFront」や「AWS Global Accelerator」の説明では、「エッジロケーション」を知っている前提で話が進み、「グローバルエッジネットワーク」という言葉が主に使われるため、「あれ?エッジロケーションは?」と少々置いてけぼりを食らう気持ちになった。
エッジロケーションを用いて提供されるネットワークが「グローバルエッジネットワーク」であり、AWS Global AcceleratorやAmazon CloudFrontが提供するサービスを実現可能にしているのが、エッジロケーションと解釈しても問題ないと思われる。
【補足】そもそもAWSにおけるコンテンツ配信って何
【一例】S3 静的ウェブサイトホスティング
コンテンツの配信として代表的なものは、S3を用いた静的Webサイトホスティングが挙げられる。
手順としては大きく5通り存在し、HTTPサーバーを構築せずとも静的なWebサーバーを使えるようになるというものである。
①S3ファイルへファイルを突っ込む(今回はAI協力のもと作成されたHTMLファイルを用います)
②S3のプロパティタブより、「静的Webサイトホスティング」の有効化
③バケットポリシーの設定
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicReadGetObject",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::amzon-s3-testrh239u9wdhoq/*"
}
]
}
④パブリックアクセスブロックの無効化
⑤設定完了(プロパティタブのurlを押下すると、ページが表示される)
エッジロケーションを用いることの利点
では、エッジロケーションがあるのと無いので、どのような変化が見られるのだろうか。
今回はAWSにおけるコンテンツ配信として、Amazon S3による静的ウェブサイトホスティングを例として挙げ、東京リージョン[ap-northeast-1]にS3バケットを配置している想定で話していく。静的ウェブサイトホスティングを有効にすると、世界中のインターネットからアクセスが可能になる。
エッジロケーションが無い状態だと、ユーザーはコンテンツを取得するために、直接オリジンとなるS3バケットへアクセスする必要がある。コンテンツの配信拠点は東京にあるため、もしもアメリカやオーストラリアといった遠方のユーザーからアクセスしようとなると、それなりのレイテンシーが発生する。
さらにはコンテンツ配信のため、S3へ直接リクエストを送信しているため、それなりのコストがコンテンツの提供側へ発生してしまう。
エッジロケーションを用いずに広いエリアでコンテンツ配信を実施する場合、コンテンツ配信を受ける側はレイテンシーによって、コンテンツ配信をおこなっている側はコストによって損を被ってしまう。
win-winの逆、lose-loseである。
それではエッジロケーションを用いた[Amazon CloudFront]を設定すると、どのような変化が起こるだろうか。
エッジロケーションを用いるサービスは複数存在するが、今回はS3の静的ウェブサイトホスティングと相性がいい、「Amazon CloudFront」を例として挙げていく。
①CloudFront設定後、キャッシュをエッジロケーションへ保管する
CloudFrontを設定後、いきなりエッジロケーションからコンテンツが配信されるわけではなく、キャッシュを保管するために一度オリジンを通してコンテンツを取得する。
②エッジロケーションがコンテンツ配信を担当する
CloudFront(エッジロケーション)がキャッシュを保管後、ユーザーからのリクエストに保管しているコンテンツキャッシュが当てはまれば、CloudFront(エッジロケーション)がコンテンツ配信を実施してくれる。(もしもキャッシュに当てはまらなかった場合は、①の手順で再度オリジンからキャッシュを保管する手順を実施する。)
先述した通り、エッジロケーションというものは世界各地に配置され、ユーザーに近いエッジロケーションがコンテンツ配信を担当するため、低レイテンシーなコンテンツ提供を可能にする。
CloudFrontの料金
CloudFrontには4つのパターンでコストが発生する。
①エッジロケーションへのデータ転送
キャッシュを確保する際に、S3へリクエストするため発生する。キャッシュがヒットする限り、この料金は発生しないが、キャッシュがヒットしなかった場合は再度S3へリクエストを送信し、コンテンツのキャッシュを確保する。
②インターネットへの転送
エッジロケーションがキャッシュをインターネットへ公開し、ユーザーへ送るためのコスト。
③HTTPメソッドのリクエスト料金
エッジロケーションがリクエストを配信する際、ユーザーからリクエストを受け取る際に発生するコスト。

④オリジン「への」データ転送
もしもユーザーがオリジンに対してPOST/PUT/DELETEといったリクエストを送ることができる場合、そのリクエストにかかるコスト。
結局CloudFrontを使った方がお得なのか?
「コンテンツ配信を最適化して実施するとは言うが、使用するサービスを足したなら料金にも影響は出てくるだろう。結局、どれほどのコンテンツ配信量ならばCloudFrontの費用対効果が高くなるのか」という問いが浮かんだ。
「国内利用でアクセス数が低ければS3単体の方が安いのかな」と考えたが、CloudFrontには常時無料利用枠というものが存在する。

対してS3にもデータ転送に関するコスト無料枠が存在するため、どちらが安いかを具体的に考えたい。(CloudFrontへの転送量が無料ということに目をそらしながら)

今回はCloudFrontのHTTP(S)の利用枠があまりにもデカすぎるため、今回はコストに大きく影響しそうな「データ転送量」を中心に考える。
データ転送量のみで考慮すると、転送量が4TBまではCloudFrontの方がコストは低く、4TBを超えたあたりからS3単体でのコストが低くなってきている(キャッシュのヒット率によってはもう少し低い容量でS3単体のコストが低くなってくる)。
ただ、CloudFrontには下記のようなメリットが存在する。
- HTTP(S)配信を可能にできる
- オリジン(S3)バケットへのアクセスを制限し、プライベート化できる
- キャッシュによってレイテンシーを減らすことができる
- (他にもいろいろ...)
単に「コンテンツを配信するためのコスト」のみを考慮すればS3単体でいいかもしれないが、CloudFrontを用いてコンテンツの配信を最適化することで、ユーザーの満足度を高めて継続的なアクセスのきっかけとなったり、セキュリティの確保にもつながったりすることなどの効果も考慮すると、CloudFrontを導入することも検討していいのではないだろうか。
CloudFrontを設定してみる
ここまで、CloudFrontの概要や魅力を伝えてきたが、最後にAWS上での基本的な設定方法を記載する。
(前述のS3ウェブサイトホスティングを設定した状態から始めているため、初めて設定する方は、一度上のinfoを参考にしてここに戻ってきてください。)
①CloudFrontディストリビューションを設定する(今回はデフォルトで設定)
②作成したディストリビューションの[一般→設定]より、[Default root object]を、S3オブジェクトの名前にて設定し、5~10分待機する(デプロイ待ち)
(今回は[index.html]をバケットに突っ込んでいるため、[index.html]を記入)
③バケットポリシーを変更
IDをマスクしているため、そのまま張り付けて設定すると失敗します。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowCloudFrontServicePrincipal",
"Effect": "Allow",
"Principal": {
"Service": "cloudfront.amazonaws.com"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::amzon-s3-testrh239u9wdhoq/*", // S3バケットのarn
"Condition": {
"StringEquals": {
"AWS:SourceArn": "arn:aws:cloudfront::**************:distribution/ELTHNOY4JZKE9"
// ***** = 自身のAccount ID
}
}
}
]
}
③+α. パブリックアクセスを全てブロックする
③+β. 静的ウェブサイトホスティングを無効化する
④設定完了(ディストリビューションのドメイン名をブラウザに張り付けて実行)

おわりに(参考文献)
もう少し詳しく知りたい方はこちらをお勧めします(5年前の記事になってしまいますが)






















