ハマログ

株式会社イーツー・インフォの社員ブログ

CloudFront経由でサイトへアクセスする形にしてみた

( ᐛ )「サイトの負荷を軽減するためにCDN入れます。AWS環境ですしCloudFrontにしましょう」

(゜々。)「CloudFrontはS3と抱き合わせで作成したけど、CDNってなんだんねん」

( ᐛ )「コンテンツデリバリーネットワークの略。だいたいキャッシュ。ほぼキャッシュ(なんでCloudFront作成したのに知らんのよ)」

(゜々。)「CDNはわかりもした。CloudFrontってS3だけに設定できるもんじゃなかと?」

( ᐛ )「もんじゃなかと。だもんで後から作って『そっち見に行って。なかったらサーバまで来て』ができると」

 

……こういうやりとりがあったかどうかは置いておいて。

『S3にコンテンツ置いてないサイトにCloudFront導入して』

『条件検索でリストが出てくるページがあるんだけど、そこの検索結果もCloudFrontでキャッシュして』

という作業がございまして。

S3+CloudFrontであれば経験あったものの、この場合はどうするのかとけっこう難儀しました。

 

  • オリジンドメインにはALBを設定。
  • 代替ドメイン名にはCloudFrontの対象になるドメインを設定。
  • CloudFrontの有効無効の切り替えはRoute53で対象ドメインのレコードの向き先を、有効:CloudFront・無効:ALBに変えることで制御。
  • ビヘイビアにはキャッシュ対象になる画像だのスタイルシートだのJavascriptだのの拡張子、対象になってる条件検索の検索結果が戻ってくるパスパターンも設定。

⇒このパスパターンがやっかいなところで、キャッシュポリシーで『クエリ文字列-すべて』にしてやらないと検索結果をキャッシュできないです。

また、動的に変更するURLパラメータがあると、『URLが一致しないのでキャッシュが動作しない』になるので注意。

  • TTL設定がS3+CloudFrontとちょっとチガウ

⇒今回の『ALBをオリジンとするケース』だと必要なのは デフォルトTTL だけでよさそうです。

というのも、オリジンがALBな関係でオリジンヘッダーにヘッダーパラメータを仕込めない。(サーバサイドで頑張れば設定できるのかもしれないけど、CloudFrontのキャッシュポリシー・キャッシュキー機能だけだと無理)

なので、コンテンツがキャッシュに保持される期間 (有効期限) の管理

リンク先の表でいうところの『オリジンが Cache-Control: max-age ディレクティブをオブジェクトに追加しない』になって、最小TTL=0ならデフォルトTTLだけ設定すれば十分になりまして。

 

とま、こんな感じに設定すれば、『S3にコンテンツ置いてないサイトにCloudFront導入』ができます。

できました。

 

……できたんですけどね。

『ログインができなくなった』という報告が来ましてね……(゜々。)

 

原因:ビヘイビアのデフォルト(=キャッシュ対象でない場合のCloudFrontの挙動)が、cookieをキャッシュしないようになっていたから。

本来ならログイン処理をやったところでcookieにログイン情報キャッシュするわけですが、ALBをオリジンとするCloudFrontにデフォルトのビヘイビアが設定してあると、明示的にキャッシュ対象としてない通信はそこを通過するわけで。

そこに「キャッシュキーに含める cookie を選択します」ってところで「なし」なんてしちゃうと――ガォン、と。cookieが消えてしまう、と。

 

……ALBをオリジンにCloudFrontを使うときは、S3に対してのCloudFrontと違って、こういうところまで注意が必要なんですね。

ののれ。

 

おまけ。

「403 ERROR Generated by cloudfront (CloudFront) 」

CloudFrontが403エラーを出力しています

ってレスポンスを返されるときは、

『CloudFront本体じゃあなく、CloudFrontに掛けているWAFも疑え』

エラーメッセージ信じて調べまわった挙句、原因に気づくまで30分かかったわ……(゜々。)

 

 

AWSCloudFront

  Y.W   2022年12月23日


関連記事

AWS CloudWatch LogsをLambdaにストリーミングするときのサブスクリプションフィルタパターンの書き方

はじめに AWS上で動いているアプリケーション監視の際に、CloudWatch …

AWS Lambda/API GatewayのIP制限が解除されなくて困った話

AWSで環境構築・開発をするにあたって(AWSに限りませんがまあその)、 当然な…

CodeBuildでEC2とAuroraのバックアップを取得する

はじめに CodePipelineで製品をデプロイする前に、EC2とAurora…


← 前の投稿

次の投稿 →