カスタムドメインを持つ Amazon CloudFront ディストリビューションを設定しました。CloudFront を使用して代替正規名 (CNAME) ドメインをリクエストすると、502「The request could not be satisfied」エラーが発生するため、トラブルシューティングしたいです。
解決策
CloudFront がオリジンの IP アドレスを解決できない場合
CloudFront がオリジンドメインを解決できない場合、「The request could not be satisfied」エラーが返されます。ディストリビューションが Amazon Virtual Private Cloud (Amazon VPC) のオリジンのみを使用している場合以外は、CloudFront はパブリック DNS クエリを介してオリジンドメインを解決できる必要があります。
オリジンをパブリックアクセス可能にする必要はありません。ただし、オリジンのドメインは外部からクエリできる必要があります。この問題をトラブルシューティングするには、dig または nslookup コマンドを実行し、オリジンのドメインが IP アドレスに解決されるかどうかを確認します。
Linux では次のコマンドを実行します。
dig ORIGIN_DOMAIN_NAME
Winidows では次のコマンドを実行します。
nslookup ORIGIN_DOMAIN_NAME
注: ORIGIN_DOMAIN_NAME をオリジンのドメイン名に置き換えてください。
上記のコマンドは、オリジンのドメイン名の IP アドレスを返します。DNS チェッカーツールを使用して複数の地域で DNS 解決が行われるかどうか確認します。たとえば、DNS Checker ウェブサイトの「Check DNS Propagation」 (DNS 伝播チェック) ツールを使用できます。認証方法がオリジンのドメインのクエリに失敗していないか確認してください。次に、パブリック DNS プロバイダーにお問い合わせのうえ、オリジンのドメインには外部から解決可能な DNS レコードが存在することを確認してください。
DNS のトラブルシューティングに関する詳細については、「DNS の仕組みと、DNS の部分的または断続的な障害をトラブルシューティングする方法を教えてください」を参照してください。
SSL/TLS 証明書がドメイン名と一致しない場合
オリジンの SSL/TLS 証明書には、次のいずれかのドメイン名が含まれている必要があります。
- オリジンのドメイン名 (証明書の Common Name フィールドまたは Subject Alternative Names フィールド内)。
- ホストヘッダーのドメイン名 (リクエストが CloudFront ディストリビューションのオリジンに転送する受信ビューワーホストヘッダー)。
証明書に Common Name と Subject Alternative Names が設定されているかどうかを確認するには、次のコマンドを実行します。
openssl s_client -connect DOMAIN:443 -servername SERVER_DOMAIN | openssl x509 -text | grep -E '(CN|Alternative)' -A 2
注: DOMAIN と SERVER_DOMAIN をオリジンのドメイン名に置き換えてください。リクエストがビューワーホストヘッダーをオリジンに転送する場合は、SERVER_DOMAIN を受信ホストヘッダーの値に置き換えてください。
次のシナリオでは、キャッシュポリシーまたはオリジンリクエストポリシーを設定し、ホストヘッダーを含める必要があります。
- オリジンの証明書には、ビューワーホストヘッダー値が SSL/TLS 証明書の共通名またはサブジェクト代替名 (SAN) として含まれている場合。
- リクエストはホストヘッダーをオリジンに転送しない場合。
オリジンの証明書が失効しているか、信頼されていないか、自己署名されている場合、または証明書チェーンの順序が正しく設定されていない場合
カスタムオリジンにインストールした証明書には、信頼された認証局 (CA) による署名が必要です。信頼された CA のリストについては、Mozilla のウェブサイトで「認証機関」を参照してください。CloudFront は、自己署名 SSL/TLS 証明書を使用するオリジンをサポートしていません。
オリジン証明書の有効期限が切れていないかを確認するには、次の OpenSSL コマンドを実行します。
openssl s_client -connect DOMAIN:443 -servername SERVER_DOMAIN | openssl x509 -text | grep Validity -A 3
注: DOMAIN と SERVER_DOMAIN をオリジンのドメイン名に置き換えてください。リクエストがビューワーホストヘッダーをオリジンに転送する場合は、SERVER_DOMAIN を受信ホストヘッダーの値に置き換えてください。
コマンドの出力から Not Before パラメータと Not After パラメータを探します。現在の日付と時刻が証明書の有効期間内であることを確認します。
中間 CA 証明書が欠けているか、中間証明書の順序が正しく設定されていない場合、HTTPS とオリジン間の通信は失敗します。
証明書チェーンを確認するには、次のコマンドを実行します。
openssl s_client -showcerts -connect DOMAIN:443 -servername SERVER_DOMAIN
注: DOMAIN と SERVER_DOMAIN をオリジンのドメイン名に置き換えてください。リクエストがビューワーホストヘッダーをオリジンに転送する場合は、SERVER_DOMAIN を受信ホストヘッダーの値に置き換えてください。
詳細については、「CloudFront で SSL/TLS 証明書を使用するための要件」を参照してください。
CloudFront はオリジンの暗号スイートをサポートしていない場合
CloudFront とオリジン間の SSL/TLS トランザクションは、共通のネゴシエート済み暗号スイートがない場合に失敗します。この問題を解決するには、サポートされているプロトコルと暗号を使用する必要があります。
SSL サーバーテストツールを使用すると、サポートされている暗号のリストには、使用するオリジンの暗号スイートが含まれているかどうかを確認できます。たとえば、Qualys ウェブサイトの 「SSL server test」を使用できます。
上流オリジンに問題がある場合
オリジンに接続された、プロキシのコンテンツ配信ネットワーク (CDN) ホスト名またはロードバランサーは、CloudFront ディストリビューションのカスタムオリジンとして使用できます。これらの中間サービスのいずれかがオリジンに接続できない場合、502 エラーが発生します。この問題を解決するには、オリジンのサービスプロバイダーと連携してください。
Application Load Balancer をオリジンとして使用している場合は、「Application Load Balancer で発生する HTTP 502 エラーのトラブルシューティング方法を教えてください」を参照してください。
Amazon API Gateway を使用している場合は、「Lambda プロキシ統合において、API Gateway REST API が HTTP 502 エラーを返す場合の解決方法を教えてください」を参照してください。
CloudFront ディストリビューションに関連付けられた Lambda@Edge 関数が検証を通過できない場合
Lambda@Edge 関数が CloudFront に無効な応答を返した場合、CloudFront は 502 エラーを返します。この問題を解決するには、Lambda@Edge 関数に次の問題がないかどうかを確認します。
- JSON オブジェクトが返される。
- 必須フィールドが欠けている。
- 応答内のオブジェクトは無効である。
- 追加または更新は許可されていない。
- ヘッダーは読み取り専用になっている。
- 最大本文サイズを超過した。
- 文字または値が無効である。
これらの問題を解決するには、「Lambda@Edge 関数のテストとデバッグ」および、「CloudFront で、Lambda@Edge 関数が 502 エラーと 503 エラーを引き起こす場合のトラブルシューティング方法を教えてください」も参照してください。