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分かかったわ……(゜々。)