はじめに

「CloudFrontを導入したいけど、データ転送料金の内訳がいまいち分からない…」
「Lambda@Edgeでリダイレクトを設定したいけど、これって追加コストはどれくらいかかるの?」
となったので、オリジン転送とインターネット転送について調べてみました。

1. CloudFrontにおける2種類のデータ転送

CloudFrontの料金体系は、主に「リクエスト料金」と「データ転送料金」から構成されます。特にデータ転送料金は、データの流れによって「オリジン転送」と「インターネット転送」の2つに大別されます。

1-1. オリジン転送

オリジン転送は、CloudFrontのエッジロケーションが、オリジンサーバー(S3、EC2など)へコンテンツを取得しにいく際のデータ転送のことです。

  • 発生タイミング: エッジロケーションにキャッシュが存在しない場合(キャッシュミス)や、キャッシュの有効期限(TTL)が切れた場合に発生します。
  • 料金:
    • オリジンがAWSサービス(S3、EC2など)の場合: オリジンからCloudFrontへのデータ転送料金は無料です。
    • オリジンが外部のサーバーの場合: CloudFrontからオリジンへのデータ転送料金が発生します。また、ビューワーからのPOSTやPUTリクエストによってオリジンにデータが転送される場合も課金対象となります。
  • https://aws.amazon.com/jp/cloudfront/pricing/

1-2. インターネット転送

インターネット転送とは、CloudFrontのエッジロケーションから、ビューワー(エンドユーザーのブラウザなど)へコンテンツを配信する際のデータ転送のことです。

  • 発生タイミング: ビューワーからのリクエストに対して、CloudFrontがコンテンツを応答する際に常に発生します。
  • 料金: CloudFrontの利用料金の主要な部分を占めます。データ転送量と、配信先のリージョンによって単価が変動します。毎月1TBまでの無料枠があります。
  • https://aws.amazon.com/jp/cloudfront/pricing/

2. データ転送の流れ:通常時とリダイレクト時

CloudFront FunctionsやLambda@Edgeを利用すると、エッジでリクエストを書き換えてリダイレクトさせることができます。このリダイレクト処理がデータ転送にどう影響するかを見ていきましょう。

2-1. 通常のコンテンツ配信フロー

まずは、リダイレクトがない場合の基本的なデータの流れです。

【図1】通常のコンテンツ配信フロー

  • オリジン転送: キャッシュミスが発生した際のステップ34で発生します。
  • インターネット転送: ビューワーへコンテンツを応答するステップ2または5で発生します。転送量はコンテンツのサイズに依存します。

2-2. CloudFront Functions / Lambda@Edge によるリダイレクトフロー

次に、CloudFront FunctionsまたはLambda@Edgeを使って、/old-url へのアクセスを /new-url へリダイレクトする場合のフローです。

【図2】リダイレクト時のフロー

3. リダイレクト時のデータ転送量の考え方

リダイレクト処理を挟むと、データ転送は以下のようにカウントされます。

  1. 最初のリクエスト(リダイレクト応答)
    • オリジン転送: 発生しません。CloudFront FunctionsやLambda@Edgeは、オリジンにアクセスする前にリクエストを処理し、リダイレクトレスポンスを生成します。
    • インターネット転送: 発生します。ただし、転送されるのはHTTPステータスコード(301や302)とLocationヘッダーのみで構成される非常に小さなレスポンスです。そのため、ここでのデータ転送量はごくわずかです。
  2. リダイレクト後の新しいリクエスト
    • ビューワーはリダイレクト応答を受け取ると、新しいURL (/new-url) に対して再度リクエストを送信します(図2のステップ5)。
    • この2回目のリクエストは、通常のコンテンツ配信フロー(図1)と同じ扱いになります。
    • /new-url のコンテンツがエッジにキャッシュされていれば、キャッシュから応答されインターネット転送のみが発生します。
    • キャッシュされていなければ、オリジン転送が発生してコンテンツを取得し、その後インターネット転送によってビューワーへ配信されます。

まとめ

オリジンがAWSサービスの場合、オリジン転送料が無料というのは覚えておきたいですね。
参考になれば幸いです。

参考ドキュメント

Amazon CloudFront の料金
https://aws.amazon.com/jp/cloudfront/pricing/
リクエストとレスポンスの動作
https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/RequestAndResponseBehavior.html
CloudFront Functions を使用してエッジでカスタマイズする
https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/cloudfront-functions.html