CloudFrontでgzip/Brotli設定をしたら[SignatureDoesNotMatch]のエラーが出た

AWS

こんにちはますのです。
CloudFront×S3の構成で静的コンテンツを配信していて、gzipやBrotliの圧縮設定を行いたいため設定してみました。

参考手順:[アップデート] CloudFront で動的に Brotli 形式の圧縮をできるようになりました!

設定後…。
なんということでしょう。
エラーが出てアクセス不可になるじゃないですか。

<Code>SignatureDoesNotMatch</Code>
<Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message>

試行錯誤:OAIを無効化して解消するが…。

証明書エラーが原因か?と模索。
OAI(オリジンアクセスアイデンティティ)を無効化したところアクセス出来るようになりました。

Name
あとで分かったことですが、ただの偶然でアクセス出来た様子。
「S3バケット名」と「CloudFrontの代替ドメイン名」を統一して作っていたのでアクセス出来ただけでした。

しかし、これではS3へのアクセスがCloudFrontのみに絞れない。
S3に直接アクセスされたりセキュリティホールになってしまうし、SecurityHubでもアラート上がってくる。
どうにかできないかと探していたところ同じ事象を解説してくれている面白法人カヤックさんのブログを発見しました。

原因:Origin request policyに「Managed-AllViewer」を設定していたため

CloudFront:ビヘイビア(Behavior)>キャッシュキーとオリジンリクエスト:オリジンリクエストポリシーの部分です。

クラメソさんの2020年9月の記事では設定してねってあったけど、地雷だったようです。

hostヘッダーが書き換わって不一致エラーとなった様子

AllViewerを設定するとすべてのリクエストヘッダーをOriginに転送します。

名前: AllViewer
ID: 216adef6-5c7f-47e4-b989-5492eafa07d3

このポリシーには、ビューワーリクエスト内のすべての値 (ヘッダー、Cookie、クエリ文字列) が含まれます。

ポリシー設定

  • オリジンリクエストに含まれるヘッダー: ビューワーリクエスト内のすべてのヘッダー
  • オリジンリクエストに含まれる Cookie: すべて
  • オリジンリクエストに含まれるクエリ文字列: すべて

引用:管理オリジンリクエストポリシーの使用

CloudFront→S3へ転送する時に、「CloudFrontのhostヘッダー」ではなく「クライアント側のhostヘッダー」に全て書き換わる動きになるようです。
結果「SignatureDoesNotMatch」と証明書不一致のエラーが出てしまった動きに見えます。

最終的にOrigin request policyは(空欄)にして解決

今回有効化したかったものは「gzip」や「Brotli」による圧縮配信です。
そのため、該当するhttpヘッダー「Content-Encoding」を転送するオリジンリクエストポリシーを自作することが必要になる手順かと想像します。

試しにオリジンリクエストポリシーを「なし」に設定して試したところ問題なくgzipとBrotliで配信されました。
わたしはとりあえずこれでヨシということでこの設定で走りたいという所存です。

設定した箇所は最終的に以下の2つです。

  • オブジェクトを自動的に圧縮:Yes
  • キャッシュポリシー:gzip/Brotliが有効化されているポリシー

CloudFrontを何度も作り直したり、OAIを何個も作り直したりめちゃくちゃ時間かかりました。
色々試して設定自体は完了していたのですが理由が分からなかったまま放置。
時間をおいて調べたところ、原因まで解説してくれているブログが出ていて納得した次第です。

 

最新情報をチェックしよう!