CloudFrontでHTTPもHTTPSを使う場合の注意点

CloudFrontで、

・オリジンの設定
Origin Protocol Policy: Match Viewer

・Behavior
Viewer Protocol Policy: HTTP and HTTPS

とかやると、HTTPとHTTPS両方使えるわけですが、実はこんな制限があります。

https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/distribution-web-values-specify.html

[Match Viewer (ビューアーに合わせる)]: CloudFront は、ビューアーリクエストのプロトコルに応じて HTTP または HTTPS を使用してオリジンと通信します。ビューアーが HTTP と HTTPS の両方のプロトコルを使用してリクエストを行った場合でも、CloudFront がオブジェクトをキャッシュするのは 1 回だけです。

HTTPとHTTPSで同じ結果が返ってこないと駄目っすよと。

これブラウザで挙動確認していると全然気づかなくて、実際プロトコルごとに違う結果が返ってくるんですが、curlとかで余計なヘッダー入ってないやつでやると一つの結果しか返ってきません。

常時SSLをEC2側でやろうものなら、リダイレクトループをかますという悲しい現実。

なので、プロトコル単位でキャッシュを分けたいので、

Cache Based on Selected Request Headers

CloudFront-Forwarded-Proto

を追加します。
これでプロトコルごとに違うキャッシュになるはず・・・です。