😎
CloudFront x API GatewayのオリジンリクエストポリシーはAllViewerExceptHostHeader
はじめに
Amazon Qのコード生成をベースにCDKを書いていて、めっちゃハマった。
同じことハマった人に届いたら嬉しいです。
ハマり事
CloudFrontとAPI Gatewayの組み合わせはよくやると思うんですが、Amazon Qが提案するAPI Gatewayをオリジンとした時のCloudFrontのオリジンリクエストポリシーはなぜかAll Viewer
なんですよね。
const distribution = new cloudfront.Distribution(this, 'Distribution', {
defaultBehavior: {
origin: new origins.RestApiOrigin(api),
...
originRequestPolicy: cloudfront.OriginRequestPolicy.ALL_VIEWER,
},
});
All Viewer
でAPIを呼び出しても403エラーで失敗する。。。
AllViewerExceptHostHeader
を設定すれば治る
const distribution = new cloudfront.Distribution(this, 'Distribution', {
defaultBehavior: {
origin: new origins.RestApiOrigin(api),
...
originRequestPolicy: cloudfront.OriginRequestPolicy.ALL_VIEWER_EXCEPT_HOST_HEADER,
},
});
CloudFrontの開発者ガイドをちゃんと読めば、書いては、ある。
AllViewerExceptHostHeader
このポリシーは、Amazon API Gateway と AWS Lambda 関数 URL オリジンでの使用を目的としています。これらのオリジンは、Host ヘッダーに CloudFront ディストリビューションのドメイン名ではなく、オリジンドメイン名が含まれていることを前提としています。ビューワーリクエストの Host ヘッダーをこれらのオリジンに転送すると、それらが機能しなくなる可能性があります。
API Gatewayをオリジンとして使用するために作られているポリシーなんてあったんですね。
API GatewayはHostヘッダーにオリジンドメイン名が含まれていることが前提となる仕様だったんですね。
さいごに
ちなみにマネコンで作ると自動でAllViewerExceptHostHeader
が適用されるみたいです。
Q!俺も頑張るからお前も頑張れ!!
Discussion