😎

CloudFront x API GatewayのオリジンリクエストポリシーはAllViewerExceptHostHeader

2025/01/10に公開

はじめに

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 ヘッダーをこれらのオリジンに転送すると、それらが機能しなくなる可能性があります。

https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/using-managed-origin-request-policies.html

API Gatewayをオリジンとして使用するために作られているポリシーなんてあったんですね。
API GatewayはHostヘッダーにオリジンドメイン名が含まれていることが前提となる仕様だったんですね。

さいごに

ちなみにマネコンで作ると自動でAllViewerExceptHostHeaderが適用されるみたいです。
Q!俺も頑張るからお前も頑張れ!!

GitHubで編集を提案

Discussion