Amazon CloudFrontにオリジンへのリクエストを軽減するキャッシュレイヤー(Origin Shield)が追加されました
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 がリージョナルキャッシュと異なるリージョンにある場合、追加費用が発生する点にはご注意ください。