今回は、CloudFrontのカスタムオリジンにS3バケットを指定した際に、S3オブジェクトにアクセスすると以下のように「SignatureDoesNotMatch」が出力された際の対応方法についてです。
■ 結論
先に結論です。
冒頭の通り、「SignatureDoesNotMatch」が出た際は、CloudFrontのビヘイビア設定にて利用している「オリジンリクエストポリシー名」にて、「Managed-AllViewer」以外のものを設定してください。
※ 以下の赤枠部分の設定を変更する必要があります。
■ 原因
本エラーが表示された場合、すぐに思い当たる原因としてオリジンリクエストポリシーに「Managed-Allviewer」を設定している場合が挙げられます。
Managed-AllViewerを設定するとすべてのリクエストヘッダーをOriginに転送するのですが、この設定はクライアント側のHostヘッダーをそのままOriginに転送いたします。
例えば、
クライアント -> CloudFront -> S3 の場合、OAC(OriginAccessControl)を設定することが大半だと思いますが、この際に期待する動作はCloudFrontのHostヘッダーをS3に転送することになります。
前述の通り、Managed-AllViewerを利用するとクライアント側のHostヘッダーをS3に転送してしまうため、本エラーが出力されます。
■ 補足(OACについて)
Amazon S3 オリジンへのアクセスの制限 - Amazon CloudFront
以上です。