/lambda-edge-experiment

Lambda@Edgeの挙動を確認する実験プロジェクトです。

Primary LanguageJavaScriptMIT LicenseMIT

Lambda@Edgeの挙動を確認する実験用プロジェクトです。

Lambda@EdgeのすべてのイベントにLambda関数を用意し、どのような条件で呼び出され、どのような引数が渡されるかを記録したものです。

利用技術

  • Node.js
  • Serverless
  • Lambda@Edge

セットアップとデプロイ

次のコマンドを実行すると新しいCloudFrontディストリビューションまでセットアップできます。デプロイには20分くらいかかります。

yarn install
yarn deploy

run-all.shを実行すると、下記の実験リクエストを10秒間隔で実行します。

Lambda@EdgeイベントとLambda関数に渡される値

作成されたCloudFrontディストリビューションに実際にリクエストを行った結果の出力とログを一例を紹介します。

  • クエリ文字列の挙動も確認するため、すべてのリクエストには?name1=value1&name2=value2を付与しています。
  • 各イベントではカスタムヘッダを追加しています。ヘッダ情報の伝播を確認するためです。
  • イベントの値はClientIp以外、実値です。CloudFrontのディストリビューションは削除済みなので応答しません。

オリジンのindex.htmlを取得するケース

オリジンとしたExample Domainのルートドキュメントindex.htmlへのリクエストです。

curl -X GET -I 'http://CloudFrontドメイン/index.html?name1=value1&name2=value2'

index.htmlへの初回リクエスト

すべてのLambda@Edge関数が呼び出されます。

index.htmlへの2回目のリクエスト

CloudFrontがすでにキャッシュを保持しているので、オリジンへのリクエストが発生しません。そのためorigin-requestorigin-responseは呼び出されません。

viewer-requestでレスポンスを返すケース

URIパス/dump-viewer-request-eventにリクエストすると、viewer-requestの段階でレスポンス(イベント引数のダンプしたJSON)を返却します。

curl -X GET -I 'http://CloudFrontドメイン/dump-viewer-request-event?name1=value1&name2=value2'

/dump-viewer-request-envetへの1回目のリクエスト

viewer-requestでレスポンスを返却すると、それ以外のイベントは呼び出されません。

/dump-viewer-request-envetへの2回目のリクエスト

viewer-requestで返却したレスポンスはキャッシュされることがないので、毎回動的な結果が出力されます。

origin-requestでレスポンスを返すケース

URIパス/dump-origin-request-eventにリクエストすると、origin-requestの段階でレスポンス(イベント引数のダンプしたJSON)を返却します。

curl -X GET -I 'http://CloudFrontドメイン/dump-origin-request-event?name1=value1&name2=value2'

/dump-origin-request-envetへの1回目のリクエスト

origin-responseは呼び出されませんが、viewer-responseは呼び出されます。

  • viewer-request event
  • origin-request event
  • origin-response 呼び出されない
  • viewer-response event

/dump-origin-request-envetへの2回目のリクエスト

origin-requestで返却したレスポンスはキャッシュされます。そのためorigin-requestorigin-responseは呼び出されません。

  • viewer-request event
  • origin-request 呼び出されない
  • origin-response 呼び出されない
  • viewer-response event