解決!AWS App RunnerとCloudFrontの404エラー問題
はじめに
AWSのApp RunnerをCloudFront経由で使用する際に、オリジンリクエストポリシーのOriginRequestHeaderBehavior
をall
に設定すると、CloudFront経由のアクセスが全て404エラーになる問題に直面することがあります。この問題の原因と解決策について説明します。
問題の概要
App RunnerをCloudFront経由で使用する際に、App Runnerにそのままリクエスト情報を渡すためのオリジンリクエストポリシーを設定すると、全てのリクエストが404エラーになります。
const originRequestPolicy = new OriginRequestPolicy(this, 'ApiOriginRequestPolicy', {
originRequestPolicyName: 'xxx',
headerBehavior: OriginRequestHeaderBehavior.all(),
cookieBehavior: OriginRequestCookieBehavior.all(),
queryStringBehavior: OriginRequestQueryStringBehavior.all()
});
原因
この問題の原因は、Host
ヘッダーがCloudFrontのHost名としてApp Runnerに渡されるためです。App Runner内部のApplication Load Balancer(ALB)は、受け取ったHost
ヘッダーが期待するものと一致しないため、404エラーを返します。
解決策
この問題を解決するためには、OriginRequestHeaderBehavior
でHost
ヘッダーを除く設定を行います。これにより、正しいHost
ヘッダーがApp Runnerに渡され、正常にアクセスできるようになります。
const originRequestPolicy = new OriginRequestPolicy(this, 'ApiOriginRequestPolicy', {
originRequestPolicyName: 'xxx',
headerBehavior: OriginRequestHeaderBehavior.denyList('Host'),
cookieBehavior: OriginRequestCookieBehavior.all(),
queryStringBehavior: OriginRequestQueryStringBehavior.all()
});
クエリ文字列が不要な場合
クエリ文字列を渡さなくても良い場合は、OriginRequestHeaderBehavior
を設定しないという方法もあります。これにより、CloudFrontはデフォルトの設定を使用し、Host
ヘッダーの問題を回避できます。
まとめ
AWSのApp RunnerとCloudFrontを連携する際に発生する404エラーは、Host
ヘッダーの不一致が原因です。OriginRequestHeaderBehavior
でHost
ヘッダーを除外することで、この問題を解決できます。クエリ文字列が不要な場合は、OriginRequestHeaderBehavior
を設定しない方法も有効です。
Discussion