Amazon CloudFrontにオリジンへのリクエストを軽減するキャッシュレイヤー(Origin Shield)が追加されました

Amazon CloudFrontにエッジとオリジン間に新たなキャッシュレイヤー「Origin Shield」が追加されました。 キャッシュヒット率の向上、オリジンの負荷軽減、ネットワークパフォーマンスの向上を期待できます。
2020.10.22

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

AWSのCDNサービスAmazon CloudFrontに新しいキャッシュレイヤーOrigin Shieldが追加されました。

これまでのキャッシュは

  • 200を超える Points of presence (POP/エッジロケーション)
  • 10を超えるリージョナルエッジキャッシュ

の2レイヤーでした。

今回追加された Origin Shield はリージョナルエッジキャッシュよりもさらにオリジンよりのキャッシュレイヤーです。

このキャッシュレイヤーを利用すると

  • オリジンへのリクエスト
  • オリジンからのアウトバウンドトラフィック(data transfer out/DTO)

を Origin Shield に集約する事ができます。

Origin Shield のユースケース

グローバル展開しているサービスを考えます。

以前は全世界のリージョナルエッジキャッシュが個別にオリジンと通信していました。

※ 画像は公式ドキュメントのもの

Origin Shield を利用すると、オリジンとの通信は Origin Shield に集約されます。 オリジンへのリクエストが発生するのは、Origin Shield にキャッシュがない場合だけです。

※ 画像は公式ドキュメントのもの

結果的に、以下のようなメリットがあります。

  • 全リージョナルエッジキャッシュで共有されるためにキャッシュヒット率が向上
  • 各リージョナルエッジキャッシュが個別にオリジンにリクエストしなくなるため、オリジンの負荷が軽減
  • エッジローケーション 〜 リージョナルエッジキャッシュ 〜 Origin Shield(オリジンのそば) 間は CloudFront のグローバルネットワークを利用するためネットワークパフォーマンスが向上

マルチCDNでサービス展開している場合も同じです。各CDNが個別にオリジンと通信していました。

※ 画像は公式ドキュメントのもの

Origin Shield を利用すると、オリジンとの通信は Origin Shield に集約されます。

※ 画像は公式ドキュメントのもの

Origin Shield のねらいはより効率的なキャッシュです。

  • CloudFrontをプロキシーとして利用
  • キャッシュしにくいコンテンツ
  • あまりアクセスされないコンテンツ

といったケースには向いていません。

Origin Shield を有効化する

新規ディストリビューションの場合

新規にディストリビューションを作成する場合、「Enable Origin Shield」を Yes にすると、Origin Shield を有効にできます。

Origin Shield は特定のAWSリージョンにデプロイします。 オリジンに最寄りのリージョンにデプロイすること、CloudFront の グローバルネットワークを活用できます。

すべてのリージョンで Origin Shield が提供されているわけではないため、レイテンシーを計測して最適なリージョンを選択しましょう。

既存ディストリビューションの場合

既存ディストリビューションの場合、 Origin の設定画面で Origin Shield を有効化します。

Origin Shield の効果を確認

グローバルアクセス時を例に、 Origin Shield の効果を確認します。

東京リージョンに乱数を返すEC2サーバーを構築し、CloudFrontのオリジンに設定し、Origin Shield も同じ東京リージョンに構築します。

同じキャッシュであれば、同じ値(乱数)を返すはずです。

初回アクセス時

初回アクセス時は

  • POP
  • リージョナルエッジキャッシュ
  • Origin Shield

がすべてキャッシュミスするため、オリジンにアクセスします。

$ curl http://xxx.cloudfront.net/test.php
1377316324

対応する CloudFront のアクセスログです。

x-edge-location x-edge-result-type time-taken x-edge-response-result-type time-to-first-byte x-edge-detailed-result-type
MUC50-C1 Miss 1.006 Miss 1.006 Miss
  • x-edge-result-type : Miss
  • x-edge-response-result-type : Miss

はともに Miss となっています。

オリジンへのリクエストが発生しているため

  • time-taken
  • time-to-first-byte

に1秒近くかかっています。

同じビューからからの2度目のリクエストはエッジキャッシュにヒット

このクライアントから続けてリクエストすると、エッジキャッシュがヒットし、すぐにレスポンスが帰ります。

$ curl http://xxx.cloudfront.net/test.php
1377316324

対応する CloudFront のアクセスログです。

x-edge-location x-edge-result-type time-taken x-edge-response-result-type time-to-first-byte x-edge-detailed-result-type
MUC50-C1 Hit 0.002 Hit 0.002 Hit
  • x-edge-result-type
  • x-edge-response-result-type

はともに Hit となっています。

エッジのキャッシュをかえしているため

  • time-taken
  • time-to-first-byte

はオリジンアクセス時の1秒から 0.002 秒程へと高速化しています。

別POPの場合はリージョナルキャッシュにヒット

同じリージョンの別の場所からアクセスすると、キャッシュが帰ってきます。

$ curl http://xxx.cloudfront.net/test.php
1377316324

対応する CloudFront のアクセスログです。

x-edge-location x-edge-result-type time-taken x-edge-response-result-type time-to-first-byte x-edge-detailed-result-type
FRA2-C2 Hit 0.009 Hit 0.008 Hit
  • x-edge-location : FRA2-C2

から異なるPOPを経由していることがわかります。

  • time-taken
  • time-to-first-byte

が 0.008 秒程度になり、エッジキャッシュヒット時(0.002秒)よりも少し伸びました。

リージョナルエッジキャッシュまでアクセスしたものと思われます。

別リージョンの場合はOrigin Shield キャッシュにヒット

次に別リージョン(N. VirginiaのEC2)からアクセスします。

先程と同じ値が帰ってきたため、キャッシュヒットしたことがわかります。

$ curl http://xxx.cloudfront.net/test.php
1377316324

対応する CloudFront のアクセスログです。

x-edge-location x-edge-result-type time-taken x-edge-response-result-type time-to-first-byte x-edge-detailed-result-type
IAD66-C2 Hit 0.749 Hit 0.749 OriginShieldHit
  • x-edge-result-type : Hit
  • x-edge-detailed-result-type : OriginShieldHit

のため

  • POP
  • リージョナルエッジキャッシュ

はキャッシュミスし、Origin Shield でキャッシュヒットしたことがわかります。

これが Origin Shield の効果です。

CloudFront からのレスポンスには、 Origin Shield 用のレスポンスヘッダーも追加されています。

$ curl -I  xxx.cloudfront.net/test.php
HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
Date: Wed, 21 Oct 2020 19:20:40 GMT
Server: Apache/2.4.46 ()
X-Powered-By: PHP/7.2.33
X-Edge-Origin-Shield-Bytes: 278
X-Edge-Origin-Shield-Region: ap-northeast-1
X-Cache: Hit from cloudfront
Via: 1.1 dc368befe9301385c5ebfce15527c741.cloudfront.net (CloudFront)
X-Amz-Cf-Pop: TXL52-C1
X-Amz-Cf-Id: VNzJnRm60gx7JAOnAnDBVDslZ9yClTR5vFpKRoGpNMtdQKZ2gIbKlQ==
Age: 14382

Origin Shield 無効時はリージョナルエッジキャッシュからオリジンに直接通信

Origin Shield が無効化されていると、リージョナルエッジキャッシュからオリジンへのリクエストが発生します。

Origin Shield は可用性が高い

リージョナルエッジキャッシュはAWS リージョンの少なくとも3 Availability Zoneを利用し、可用性が高くなるように構築されています。

Oirigin Shieldはこのリージョナルエッジキャッシュを活用しているため、可用性に優れています。

費用について

通常の費用とは別に、Origin Shield へのリクエストに対しては課金されます。

リージョナルキャッシュとOrigin Shieldが同じリージョンの場合、追加費用は発生しません。

リージョンが異なる場合、追加費用が発生します。 この費用は CloudFront の HTTP リクエストと同じ費用です。エリア毎にレートは異なり、日本エリアの場合、 $0.0090/1万リクエストです。

CloudFrontをパススルーで利用していたり、キャッシュヒット率が低い場合、Origin Shield へのリクエストも増加するため、利用費がかさむリスクがあります。

なお、マルチCDN構成を利用し、CDN利用費のディスカウントを受けている場合、AWSへの問い合わせが必要です。

詳細は CloudFront の料金ページをご確認ください。

Origin Shield 有効時の既存機能への影響

アクセスログ

S3 へ出力されるCloudFrontのアクセスログは以下の様に出力されます。

キャッシュ x-edge-result-type x-edge-detailed-result-type
キャッシュミス Miss Miss
POP/リージョナルでキャッシュヒット Hit Hit
Origin Shieldでキャッシュヒット Hit OriginShieldHit

Lambda@Edge

Lambda@Edge の機能は制限を受けません。

ただし、オリジンへのリクエスト・レスポンスに介入する

  • origin request
  • origin response

は Origin Shield で指定したリージョンで実行されます。

最後に

Amazon CloudFrontにオリジンの前段で機能するキャッシュレイヤー「Origin Shield」が追加されました。 オリジンへのリクエストを集約できるため、キャッシュヒット率の向上、オリジンサーバーの負荷軽減、オリジンからのデータ転送削減を期待できます。

リリースノートによると、ユースケースであるライブストリーミング、画像処理、マルチCDNでは、オリジンの負荷が57%も削減したそうです。

Origin Shield がリージョナルキャッシュと異なるリージョンにある場合、追加費用が発生する点にはご注意ください。

参考