Open6
CloudFront覚書
CloudFrontがOriginにViewerリクエストを送る際に、いくつかのHeaderを削除する。Authorizationヘッダもその一つ。ViewerリクエストにAuthorizationヘッダを送るにはいくつか条件がある。
- CachePolicyのキャッシュキーにAuthorizationヘッダを追加する
- キャッシュキーに指定されたヘッダは無条件でViewerリクエストに含まれる
- TTLを0(disable cache)にするとキャッシュキーを指定できないっぽいので、キャッシュしたくない場合はこの手段は使えないっぽい
- OriginRequestPolicyで
AllViewer
ポリシーを指定する- Managedポリシーを使用してもいいし自前のOriginRequestPolicyでHeaderBehaviorをallViewerにしてもいいと思う
OriginがAPIGatewayの場合、HostヘッダをViewerリクエストに含めるとエラーになるため、OriginにHostヘッダは送らないよう設定する
- CachePolicyのキャッシュキーにHostヘッダ以外のヘッダを指定する
- 余計なヘッダをOriginに送りたくない、かつOriginに送りたいヘッダが少ない場合はこっち(キャッシュキーに指定できるヘッダがデフォで10個までだから。上限緩和申請は可能だけども)
- TTLを0にするとキャッシュキー指定できないのでキャッシュしたくない場合はOriginRequestPolicyでどうにかする
- OriginRequestPolicyでHostヘッダを送らないようにする
-
AllViewerExceptHostHeader
という管理ポリシーもある
-
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にアクセスさせなくても何かしらの定義は必要