解決!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