AWSデータ転送料金の改定に伴い、料金構成を再確認する

# はじめに

https://aws.amazon.com/jp/blogs/news/aws-free-tier-data-transfer-expansion-100-gb-from-regions-and-1-tb-from-amazon-cloudfront-per-month/

AWSで運用しているなら非常にありがたいニュースがあった。 

# 料金改定の要点

2021年12月から データ転送量 (out) 無料枠の大幅な引き上げが行われた。

- 通常のデータ転送 (out) は 1GB から 100GB まで無料に (!)
    - EC2 からインターネット向けの出力や、S3 からの出力などが該当
- CloudFront を通したデータ転送 (out) は 50GB から 1TB まで無料に (!)
- CloudFront の HTTP および HTTPS の無料リクエスト数が 2,000,000 から 10,000,000 に
- これらのデータ転送 (out) の料金は 0.114USD/GB (東京リージョンの場合、記事執筆時点)

小規模のウェブサイトであれば、よほどのことがない限りデータ転送料金は気にしないでもよさそうな無料枠になったと思う。
実際、CloudFront の料金具体例が更新されて、ほとんど利用料が0となるケースが載っている。

> 料金例１: 静的なウェブサイト 
> この例では、小規模なプロダクションワークロードまたはアプリケーションのテスト用に静的なウェブサイトを配信します。CloudFront のキャッシュからインターネットに出力されるデータは 1 か月に 100 GB で、CloudFront からコンテンツを取得してビューワーに配信する際の HTTPS リクエストは 100 万件です。 
> 
> また、キャッシュキーの操作や URL の書き換えなど、ウェブリクエストの軽量処理には CloudFront Functions を使用しています。 
>
> **アカウントのインターネットへのデータ転送 (アウト) が 1 TB 未満で、HTTPS リクエストの合計が 2,000 万件未満であるとすると、DTO および HTTPS リクエストは AWS 無料利用枠でカバーされ、費用負担はありません。** CloudFront ディストリビューションでは、各リクエストでビューワーリクエストとビューワーレスポンス関数を使用しています。これにより、リクエストごとに 2 つの関数が呼び出され、最初の 200 万件のリクエストについては費用負担が発生しません。その後、100 万件のリクエストごとに 0.1 USD が課金されます。
> 
> 引用元: https://aws.amazon.com/jp/cloudfront/pricing/ (一部記事内で強調)


今回の値下げは小規模の AWS を運用している人にはデータ転送料金の悩みから解き放たれる非常にうれしいニュースであると同時に、CloudFront で常時 1TB 以上のデータ転送を行っている人たちにとっても、追加で 950GB 分の無料枠 (日本の場合だと、108.3USD = 0.114USD/GB * 950GB) が毎月付与されたということでもある。 これが毎月となると、最大で年間15万円 (税抜き、1USD=115円換算)近くのランニングコストの節約となる[^1]。

[^1]: あくまで最大時。 PB とかの通信量をしていると単価が下がってくるのでここまでの恩恵はない。

ただし、組織的に紐づけられているような AWS アカウントの場合、そもそも無料枠が効かない (=アカウントが何個あっても組織的に1つの無料枠しか有効にならない) ことがあったので、上記内容が適用されるかは個別のアカウント毎の事象となる。


# データ転送料金の再確認

AWS データ転送料金の基本的なルールは以下の通りである。[^2]

[^2]: あくまで基本的には。 GoV・中国リージョンが特別扱いされているなど例外は数多い。

- 「外部 ⇒ AWS 内部」への通信は無料、「AWS ⇒ 外部」への通信は有料
    - AWS内部の場合、同一AZ内であれば無料、別AZや別リージョン間であれば有料
- データ転送料金は従量課金制で 1GB あたりの値段が決められている
- データ転送料金はリージョン毎に単価が異なる
    - バージニアと日本だと、バージニアの方が安い、など 

また、CloudFront の料金ルールは以下の通りである。

- データ転送量の重量課金で、利用されたエッジロケーションによって料金が異なる
    - サービスの利用者が日本とアメリカにいた場合、日本の利用者は日本のエッジロケーションからデータ転送を行うため日本リージョン起点のデータ転送料金 (0.114USD/GB) が発生し、アメリカの利用者はアメリカ起点のデータ転送料金 (0.085USD/GB) が発生する
- AWS オリジン (EC2サーバー、ELB、S3) から CloudFront までのデータ転送 (オリジンフェッチ) は無料
- HTTP/S リクエストの回数による従量課金が別途発生する (日本の場合 1万回で 0.0090 USD)
- POST や PUT によってオリジンに渡すデータ量に応じたデータ転送料金が発生する (!)
    - これはやや例外的。 [料金表](https://aws.amazon.com/jp/cloudfront/pricing/) のAmazon CloudFront からオリジンサーバーへが該当。
    - 日本の場合は 0.060 USD/GB ほどになる
    - 大容量のファイル (動画など) をアップロードする仕組みをもつウェブサイトであれば、S3 の presigned url を使って別途 S3 にアップしてそれを内部で利用する、というフローにした方が料金的には安くつきそう

# 何もしない CloudFront を料金節約のために使えるか？

これらの性質から、EC2/ELB から直接出すよりも CloudFront を (CacheDisabledでも良いので) 挟んだ方がデータ転送量金が安くなる可能性がある。 その時の指標となる項目は以下の通り。

- オリジンフェッチは無料
- データ転送料金の無料枠: 100GB (EC2) vs 1TB (CloudFront)
- HTTP/S リクエスト料金 (CloudFrontのみ, ただし毎月2000万リクエストまでは無料)
- PUT/POST などのデータ転送料金 (CloudFront のみ 0.06USD/GB)

データ転送料金が多めでリクエスト数がそこそこ、POST/PUT などが少なければなにも考えずに CloudFront を挟む方が安くなるかもしれない。 ただし、CloudFront は SNI ベースなので、SNI 非対応の旧型システムでは使えない可能性があるので、一応注意。

# まとめ

AWS で運用をしていると EC2 などの料金に目がとらわれがちだが、データ転送量は非常に読みづらく、また、予想外のコストとなってのしかかってくることがある。  コンテンツを配信するだけのサービスとなると、サーバー代金よりもデータ転送料金の方が大きいということも普通にあり得るぐらいに予想外に高い。

そのため、AWS でサービスを構築する場合、データ転送量、および、そのコストの見積りをしておくことを推奨する。