Open6
CloudFront覚書
オリジンにAuthorizationヘッダなどが送信されない
CloudFrontがOriginにViewerリクエストを送る際に、いくつかのHeaderを削除する。Authorizationヘッダもその一つ。Viewerリクエストに含まれるAuthorizationヘッダをOriginに送るにはいくつか条件がある。
- CachePolicyのキャッシュキーにAuthorizationヘッダを追加する
- キャッシュキーに指定されたヘッダは無条件でOriginリクエストに含まれる
- TTLを0(disable cache)にするとキャッシュキーを指定できないっぽいので、キャッシュしたくない場合はこの手段は使えないっぽい
- OriginRequestPolicyで
AllViewer
ポリシーを指定する- CachePolicyとは別にOriginにどの情報を渡すかを定義するポリシー
- キャッシュを無効化したい場合はこちら
- 無効化してないとOriginRequestPolicyは設定できない、というわけではない
- Managedポリシーを使用してもいいし自前のOriginRequestPolicyでHeaderBehaviorをallViewerにしてもいいと思う
OriginがAPIGatewayの場合、HostヘッダをOriginリクエストに含めるとエラーになるため、OriginにHostヘッダは送らないよう設定する
- CachePolicyのキャッシュキーにHostヘッダを指定しない
- 「キャッシュキーに指定されたヘッダは無条件でOriginリクエストに含まれる」ため
- キャッシュを無効にする
- OriginRequestPolicyでHostヘッダを送らないよう設定する
-
AllViewerExceptHostHeader
という管理ポリシーもある - もしくはManagedポリシーでHostだけ除外する
-
Originから返したVary
ヘッダーがCloudFrontで書き換えられる
- デバイスを特定するヘッダー(CloudFront-Is-Desktop-Viewer, CloudFront-Is-Mobile-Viewer, CloudFront-Is-SmartTV-Viewer, CloudFront-Is-Tablet-Viewer) をCloudFrontからOriginに送信する、かつ、Originから
Vary:User-Agent
を返している場合、CloudFrontはViewerにVary:User-Agent
を返す - Vary ヘッダーに Accept-Encoding または Cookie を含めるようにオリジンを設定すると、CloudFront はビューアーへの応答に値を含める
- ヘッダーをオリジンに転送するように CloudFront を設定し、Vary ヘッダーでヘッダー名を CloudFront に返すようにオリジンを設定した場合 (例: Vary:Accept-Charset,Accept-Language)、CloudFront は、これらの値を含む Vary ヘッダーをビューアに返す
- 「ヘッダーをオリジンに転送する」→CachePolicyかOriginRequestPolicyに当該ヘッダーを含める
- Vary ヘッダーに他の値を含めるようにオリジンを設定すると、CloudFront はビューアにレスポンスを返す前に値を削除する
Cacheの保管期間(有効期限)の管理
OriginレスポンスにCache-Control
: no-cache
, no-store
、もしくはprivate
directiveを含む場合、次に同じオブジェクトに対してリクエストがあってもキャッシュを返さずにOriginに接続する。
Originに到達可能な場合は、Originからのレスポンスを返す。
Originに到達不可能な場合は、キャッシュしたレスポンスを返す。この挙動が嫌ならCache-Control: stale-if-error=0
をレスポンスに含めておくと、エラーを返すようになる。
常に503返す仕組みをCloudFont+WAFで作る
WAFv2 WebACLのCustomResponseBodies
でカスタムレスポンスを定義して、DefaultAction.Block.CustomResponse
で定義したカスタムレスポンスと503ステータスを返すようにする
- レスポンスは任意のものを定義できるがContent-Typeはapplication/json, text/html, text/plainの3つからしか選べない
- CloudFront DistributionはOriginに何も定義せずに構築できないので、Originにアクセスさせなくても何かしらの定義は必要