Open6

CloudFront覚書

えんぶんえんぶん

オリジンにAuthorizationヘッダなどが送信されない

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

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

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

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にアクセスさせなくても何かしらの定義は必要