gitkadoの気まぐれ日記

島根在住エンジニアが何かに興味を持ったらブログを更新します

Lambda@Edge×CloudFrontのトリガー選定基準

困ったこと

以下の手順で静的ホスティングを構築した。
htmlを編集してS3に上げ直したが表示内容が変わらなかった。

gitkado.hatenadiary.jp

原因

経由しているCloudFrontがキャッシュを返していたので
S3に到達することなくレスポンスを返していた。

問題解決

Lambda@Edgeのトリガーを、要件に応じて選定する必要があった。
今回の場合はキャッシュが必要なかったので別のトリガーが適切だった。
しかし、URL変更は「オリジンリクエスト」である必要があるので今回はしょうがない。

htmlを変更したい場合は、

  • 別でCloudFrontをたててキャッシュのない無い状態にリセットする
  • Lambda@EdgeでURL変更するという仕様を無くす(セコイ)

Lambda@Edgeトリガー種類

f:id:gitkado:20190211225532p:plain
AWS公式より引用

  • CloudFront ビューワーリクエス
    • CloudFront がビューワーからリクエストを受け取った後、
      リクエストオブジェクトがエッジキャッシュにあるか確認する前に関数が実行されます。
  • CloudFront オリジンリクエス
    • CloudFront がリクエストをオリジンに転送する場合にのみ関数が実行されます。
    • リクエストオブジェクトがエッジキャッシュにある場合は実行されません。
  • CloudFront オリジンレスポンス
    • CloudFront がオリジンからのレスポンスを受け取った後、
      レスポンス内のオブジェクトをキャッシュする前に関数が実行されます。
  • CloudFront ビューワーレスポンス
    • リクエストされたオブジェクトがビューワーに返される前に関数が実行されます。
    • オブジェクトがすでにエッジキャッシュに存在するかどうかに関係なく関数が実行されます。

Lambda@Edgeトリガー選定基準

質問 Lambda@Edgeトリガー
関数をキャッシュミスで実行したいか? オリジン
すべてのリクエストで関数を実行したいか? ビューワー
キャッシュキー(URL、Cookie、ヘッダー、クエリ文字列) を変更しますか? ビューワーリクエス
結果をキャッシュせずにレスポンスを変更するか? ビューワーレスポンス
オリジンを動的に選択するか? オリジンリクエス
オリジンへの URL を書き換えますか? オリジンリクエス
キャッシュされないレスポンスを生成するか? ビューワーリクエス
レスポンスをキャシュする前に修正するか? オリジンレスポンス
キャッシュ可能なレスポンスを生成するか? オリジンリクエス

まとめ

変な要件を無理やり再現すると変なことになる。
しっかりと要件の整理と使用する機能やトリガーの選定はサボらずやろう!
今回はキャッシュが裏目に出たが、本来は非常に強いメリットです!

  • 別でCloudFrontをたててキャッシュのない無い状態にリセットする

結局これで対応しました。

追記(後で知りました)

CloudFrontはデフォルトでオリジンサーバのコンテンツを24時間キャッシュする設定になっている。
Cache-Controlヘッダーを設定してCloudFrontのキャッシュ時間を制御する等、
キャッシュコントロールを適切に行う必要がある。

誤ってキャッシュしてしまった場合

  • CloudFrontでInvalidationsタブからファイル名を登録してキャッシュを失効

qiita.com

参考

5分で読む!Lambda@Edge 設計のベストプラクティス
CloudFrontイベントを決定する方法
Lambda関数をトリガーできるCloudFrontイベント
AWSブログ CloudFront&Lambda@Edgeで画像をリサイズする