Lambda@Edge×CloudFrontのトリガー選定基準
困ったこと
以下の手順で静的ホスティングを構築した。
htmlを編集してS3に上げ直したが表示内容が変わらなかった。
原因
経由しているCloudFrontがキャッシュを返していたので
S3に到達することなくレスポンスを返していた。
問題解決
Lambda@Edgeのトリガーを、要件に応じて選定する必要があった。
今回の場合はキャッシュが必要なかったので別のトリガーが適切だった。
しかし、URL変更は「オリジンリクエスト」である必要があるので今回はしょうがない。
htmlを変更したい場合は、
- 別でCloudFrontをたててキャッシュのない無い状態にリセットする
- Lambda@EdgeでURL変更するという仕様を無くす(セコイ)
Lambda@Edgeトリガー種類
- CloudFront ビューワーリクエスト
- CloudFront オリジンリクエスト
- CloudFront オリジンレスポンス
- CloudFront がオリジンからのレスポンスを受け取った後、
レスポンス内のオブジェクトをキャッシュする前に関数が実行されます。
- CloudFront がオリジンからのレスポンスを受け取った後、
- CloudFront ビューワーレスポンス
- リクエストされたオブジェクトがビューワーに返される前に関数が実行されます。
- オブジェクトがすでにエッジキャッシュに存在するかどうかに関係なく関数が実行されます。
Lambda@Edgeトリガー選定基準
質問 | Lambda@Edgeトリガー |
---|---|
関数をキャッシュミスで実行したいか? | オリジン |
すべてのリクエストで関数を実行したいか? | ビューワー |
キャッシュキー(URL、Cookie、ヘッダー、クエリ文字列) を変更しますか? | ビューワーリクエスト |
結果をキャッシュせずにレスポンスを変更するか? | ビューワーレスポンス |
オリジンを動的に選択するか? | オリジンリクエスト |
オリジンへの URL を書き換えますか? | オリジンリクエスト |
キャッシュされないレスポンスを生成するか? | ビューワーリクエスト |
レスポンスをキャシュする前に修正するか? | オリジンレスポンス |
キャッシュ可能なレスポンスを生成するか? | オリジンリクエスト |
まとめ
変な要件を無理やり再現すると変なことになる。
しっかりと要件の整理と使用する機能やトリガーの選定はサボらずやろう!
今回はキャッシュが裏目に出たが、本来は非常に強いメリットです!
- 別でCloudFrontをたててキャッシュのない無い状態にリセットする
結局これで対応しました。
追記(後で知りました)
CloudFrontはデフォルトでオリジンサーバのコンテンツを24時間キャッシュする設定になっている。
Cache-Controlヘッダーを設定してCloudFrontのキャッシュ時間を制御する等、
キャッシュコントロールを適切に行う必要がある。
誤ってキャッシュしてしまった場合
- CloudFrontでInvalidationsタブからファイル名を登録してキャッシュを失効
参考
5分で読む!Lambda@Edge 設計のベストプラクティス
CloudFrontイベントを決定する方法
Lambda関数をトリガーできるCloudFrontイベント
AWSブログ CloudFront&Lambda@Edgeで画像をリサイズする