CloudFrontのエラーレスポンス時のLambda@Edgeトリガ条件
CloudFrontでエラーレスポンスを返した際、Lambda@Edgeの挙動に不明点があったのでメモ。
Lambda@Edge の動作
カスタムエラーページにて 403 エラーを 200 へ変換するように設定している場合、以下のような手順で HTTP の通信が発生する。
1. クライアント -> CloudFront のリクエスト
2. CloudFront -> オリジンサーバのリクエスト
3. オリジンサーバ -> CloudFrontの 403 レスポンス
4. CloudFront -> オリジンサーバのカスタムエラーページのリクエスト
5. オリジンサーバ -> CloudFrontの 200 レスポンス
6. CloudFront -> クライアントの 200 レスポンス
このとき、Lambda@Edge の Origin Response と Viewer Response のイベントでは以下のように動作する。
Origin Response
Origin Response に指定した Lambda 関数が起動するかどうかはカスタムエラーページのキャッシュの有無によって変化する。
CloudFront でカスタムエラーページのキャッシュが利用されなかった場合、Origin Response に指定された Lambda@Edge の関数は、上記の手順の 3、5 で実行される。したがって、クライアントへのレスポンスでは 5 で実行された Lambda@Edge の関数の処理結果を反映したものとなる。
一方で、カスタムエラーページのキャッシュが利用される場合、上記の手順の 4、5 が省略され、CloudFront のキャッシュがエラーページとしてクライアントへ返されるため、Lambda@Edge の関数は 3 のみで実行される。
しかしながら、3 でのレスポンスはクライアントへのレスポンスではないため、クライアントへ返されるレスポンスに対して Lambda@Edge の関数は実行されない。クライアントへ返されるレスポンスは、過去のリクエストで CloudFront にカスタムエラーページのキャッシュが保存された際に 5 で実行された関数の結果の影響を受けている。
Viewer Response
公式ドキュメントに記載があった。Viewer Response のイベントに設定した Lambda@Edge の関数はオリジンサーバからのレスポンスのステータスコードが 403 の場合には起動しない模様。
公式ドキュメント
code: 抜粋
CloudFront は、オリジンから 400 以上の HTTP ステータスコードが返された場合、ビューワーレスポンスイベントに対して Lambda 関数を実行しません。ただし、HTTP ステータスコード 4xx と 5xx を含むオリジンレスポンスエラーの Lambda 関数を実行することができます。
- - - - - - - - - - - - - - - -