Open6

CloudFront覚書

えんぶんえんぶん

CloudFrontがOriginにViewerリクエストを送る際に、いくつかのHeaderを削除する。Authorizationヘッダもその一つ。ViewerリクエストにAuthorizationヘッダを送るにはいくつか条件がある。

https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/add-origin-custom-headers.html#add-origin-custom-headers-forward-authorization

  1. CachePolicyのキャッシュキーにAuthorizationヘッダを追加する
    • キャッシュキーに指定されたヘッダは無条件でViewerリクエストに含まれる
    • TTLを0(disable cache)にするとキャッシュキーを指定できないっぽいので、キャッシュしたくない場合はこの手段は使えないっぽい
  2. 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で書き換えられる

https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/RequestAndResponseBehaviorCustomOrigin.html#ResponseCustomRemovedHeaders

  • デバイスを特定するヘッダー(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 はビューアにレスポンスを返す前に値を削除する
えんぶんえんぶん
えんぶんえんぶん

OriginからのレスポンスにCache-Control: no-cache, no-store、もしくはprivate directiveを含む場合、次に同じオブジェクトに対してリクエストがあってもキャッシュを返さずにOriginに接続する。
Originに到達可能な場合は、Originからのレスポンスを返す。
Originに到達不可能な場合は、キャッシュしたレスポンスを返す。この挙動が嫌ならCache-Control: stale-if-error=0をレスポンスに含めておくと、エラーを返すようになる。

えんぶんえんぶん

常に503返す仕組みをCloudFont+WAFで作る

https://go-to-k.hatenablog.com/entry/2021/09/05/203949

WAFv2 WebACLのCustomResponseBodiesでカスタムレスポンスを定義して、DefaultAction.Block.CustomResponseで定義したカスタムレスポンスと503ステータスを返すようにする

  • レスポンスは任意のものを定義できるがContent-Typeはapplication/json, text/html, text/plainの3つからしか選べない
  • CloudFront DistributionはOriginに何も定義せずに構築できないので、Originにアクセスさせなくても何かしらの定義は必要