はじめに
CloudFront+Lambdaの構築で何点か注意しないといけないなと思うことがあったので、こちらで共有します!
◎やりたいこと
WAF→CloudFront→S3の処理でCloudFrontのイベントをトリガーにLambdaを起動させます。
概要
Lambda@Edgeとは、
CloudFront が配信するコンテンツをカスタマイズする関数を実行できるコンピューティングサービスである AWS Lambda の拡張機能。
CloudFront ディストリビューションを Lambda@Edge 関数に関連付けると、CloudFront イベントの発生時にLamda関数を実行できます。
注意するポイント
Lambda@Edgeを利用する際に抑えておくべきポイントがいくつかあります。
①米国東部 (バージニア北部) リージョンでLambda関数を作成する必要がある。
②Lambda関数が実行されるのはビューワー最も近いAWSロケーション。
例えば、日本のユーザーがアクセスした場合
Lambda自体はバージニア北部で構築するが、東京リージョンで実行されるため、CloudWatchLogsのログは東京リージョンに残る。
③現時点(2022年12月)で対応しているのはNode.js、Python 関数のみ。
④バージョニングを有効にしておく必要がある。
番号付きバージョンにトリガー設定されるため、マネジメントコンソール上で確認する場合でバージョンを指定しないと、トリガー設定が表示されません。
また、関数を変更する場合は米国東部 (バージニア北部) リージョンで関数の $LATEST バージョンを編集する必要がある。
⑤イベントタイプによって指定できる関数のメモリサイズやタイムアウトの値が異なる。
この点については後述します。
イベントタイプとは?
Lambda@Edgeのトリガーに設定できるCloudFrontのイベントは4種類あります。
①ビューワーリクエスト :CloudFront がビューワーからリクエストを受信したとき
②オリジンリクエスト :CloudFront がリクエストをオリジンに転送する前
③オリジンレスポンス :CloudFront がオリジンからレスポンスを受信したとき
④ビューワーレスポンス :CloudFront がビューワーにレスポンスを返す前
(引用)AWS公式ドキュメント
https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/lambda-edge-add-triggers.html
◎イベントタイプの使い分け
①ビューワーリクエスト
・すべてのリクエストに対して関数を実行する場合
・関数でキャッシュキーを変更する場合
(例)キャッシュ条件として使用しているURLを関数で変更する。
・Cookieまたはリクエストヘッダーをキャッシュ条件として使用している場合
②オリジンリクエスト
・Lambda 関数によって変更されたオブジェクトを CloudFront でキャッシュする場合
・関数がオリジンからのレスポンスに影響する場合
オリジンリクエストでは、
リクエストされたオブジェクトが CloudFront キャッシュ内にある場合、関数は実行される。CloudFront がリクエストをオリジンに転送したときにのみ、関数が実行される。
③オリジンレスポンス
・Lambda 関数によって変更されたオブジェクトを CloudFront でキャッシュする場合
(例)オリジンから返されたオブジェクトのヘッダーを追加、削除、または変更する場合に、その結果を CloudFront でキャッシュする。
オリジンレスポンスでは、
オリジンからエラーが返された場合でも関数は実行される。
④ビューワーレスポンス
・すべてのリクエストに対して関数を実行する場合
イベントタイプによって異なるクォータ
エンティティ | ビューワーリクエストイベント / ビューワーレスポンスイベント | オリジンリクエストイベント / オリジンレスポンスイベント |
---|---|---|
関数のメモリサイズ | 128 MB | 128 MB から 10,240 MB まで、1 MB 単位で増加。 |
関数タイムアウト | 5秒 | 3秒 |
ヘッダーと本文を含む、Lambda 関数によって生成されたレスポンスのサイズ | 40 KB | 1 MB |
Lambda 関数および組み込みライブラリの最大圧縮サイズ | 1 MB | 50 MB |
CloudFrontのどのイベントを選択するかによって、指定できるメモリサイズ等が異なるので、ちゅういが必要です!
参考資料