HTTP 502 ステータスコード (Bad Gateway) - Amazon CloudFront

HTTP 502 ステータスコード (Bad Gateway)

HTTP 502 ステータスコード (Bad Gateway) は、CloudFront がオリジンサーバーに接続できず、リクエストされたオブジェクトを提供できなかった場合に返されます。

Lambda@Edge を使用している場合、問題は Lambda 検証エラーである可能性があります。HTTP 502 エラーとして NonS3OriginDnsError エラーコードが返された場合、DNS 設定の問題が原因で CloudFront がオリジンに接続できない可能性があります。

CloudFront とカスタムオリジンサーバー間の SSL/TLS ネゴシエーションエラー

カスタムオリジンを使用していて、CloudFront とオリジンとの間に HTTPS をリクエストするように CloudFront を設定した場合、問題はドメイン名の不一致であると考えられます。オリジンにインストールした SSL/TLS 証明書では、[Common Name (共通名)] フィールドにドメイン名が含まれ、[Subject Alternative Names (サブジェクトの代替名)] フィールドにもドメイン名がいくつか含まれることがあります。(CloudFront では証明書ドメイン名にワイルドカード文字を使用できます。) 証明書のドメイン名の 1 つは、次の値の 1 つまたは両方と一致する必要があります。

  • ディストリビューションの該当するオリジンの [オリジンドメイン] に指定した値。

  • Host ヘッダーをオリジンに転送するように CloudFront を設定した場合の Host ヘッダーの値。Host ヘッダーのオリジンへの転送の詳細については、「リクエストヘッダーに基づいてコンテンツをキャッシュする」を参照してください。

ドメイン名が一致しない場合、SSL/TLS ハンドシェイクは失敗し、CloudFront は HTTP 502 ステータスコード (Bad Gateway) を返し、X-Cache ヘッダーを Error from cloudfront に設定します。

証明書のドメイン名がディストリビューションまたは Host ヘッダーの [オリジンドメイン] と一致するかどうかを確認するには、オンライン SSL チェッカーまたは OpenSSL を使用できます。ドメイン名が一致しない場合、2 つのオプションがあります。

  • ディストリビューションの該当するオリジンの [Origin Domain Name] に指定した値。

  • Host ヘッダーをオリジンに転送するように CloudFront を設定した場合の Host ヘッダーの値。Host ヘッダーのオリジンへの転送の詳細については、「リクエストヘッダーに基づいてコンテンツをキャッシュする」を参照してください。

ドメイン名が一致しない場合、SSL/TLS ハンドシェイクは失敗し、CloudFront は HTTP 502 ステータスコード (Bad Gateway) を返し、X-Cache ヘッダーを Error from cloudfront に設定します。

証明書のドメイン名がディストリビューションまたは Host ヘッダーの [Origin Domain Name] と一致するかどうかを確認するには、オンライン SSL チェッカーまたは OpenSSL を使用できます。ドメイン名が一致しない場合、2 つのオプションがあります。

  • 該当するドメイン名を含む新しい SSL/TLS 証明書を取得します。

    AWS Certificate Manager (ACM) を使用する場合は、AWS Certificate Manager ユーザーガイドの「パブリック証明書をリクエストする」を参照して、新しい証明書をリクエストしてください。

  • CloudFront で SSL を使用してオリジンに接続しないように、ディストリビューション設定を変更します。

オンライン SSL チェッカー

SSL テスト ツールを見つけるには、インターネットで「online ssl checker」を検索します。通常、ドメイン名を指定すると、ツールから SSL/TLS 証明書に関するさまざまな情報が返されます。証明書の [Common Names] フィールドまたは [Subject Alternative Names] フィールドにドメイン名が含まれていることを確認します。

OpenSSL

CloudFront からの HTTP 502 エラーをトラブルシューティングするには、OpenSSL を使用してオリジンサーバーへの SSL/TLS 接続を試行します。OpenSSL が接続できない場合、オリジンサーバーの SSL/TLS 設定に問題がある可能性があります。OpenSSL が接続を確立できる場合、証明書の共通名 (Subject CN フィールド) やサブジェクト代替名 (Subject Alternative Name フィールド) など、オリジンサーバーの証明書に関する情報を返します。

次の OpenSSL コマンドを使用して、オリジンサーバーへの接続をテストします ([オリジンドメイン] を example.com などのオリジンサーバーのドメイン名に置き換えます)。

openssl s_client -connect origin domain name:443

次のことが当てはまるとします。

  • オリジンサーバーは、複数の SSL/TLS 証明書を持つ複数のドメイン名をサポートしている

  • Host ヘッダーをオリジンに転送するようにディストリビューションが設定されている

この場合、次の例のように OpenSSL コマンドに -servername オプションを追加します (CNAME をディストリビューションで設定した CNAME に置き換えます)。

openssl s_client -connect origin domain name:443 -servername CNAME

サポートされている暗号化/プロトコルではオリジンが応答しません

CloudFront は暗号とプロトコルを使用してオリジンサーバーに接続します。CloudFront がサポートする暗号とプロトコルのリストについては、「CloudFront とオリジンとの間でサポートされているプロトコルと暗号」を参照してください。オリジンが SSL/TLS 交換でこれらの暗号またはプロトコルに応答しない場合、CloudFront は接続を確立できません。SSL Labs などのオンラインツールを使って、オリジンが暗号とプロトコルをサポートすることを確認できます。[Host Name] フィールドでオリジンのドメイン名を入力し、[Submit] を選択します。テスト結果の [Common names] フィールドと [Alternative names] フィールドを見て、オリジンのドメイン名と一致しているかどうかを確認します。テスト完了後、テスト結果の [Protocols] または [Cipher Suites] セクションでオリジンがサポートする暗号とプロトコルを確認してください。それらを「CloudFront とオリジンとの間でサポートされているプロトコルと暗号」のリストと比較します。

オリジンの SSL/TLS 証明書が期限切れ、無効、自己署名になっている、または間違った順番の証明書チェーンになっている

オリジンサーバーから、CloudFront が TCP 接続を中断する、HTTP ステータスコード 502 (Bad Gateway) を返す、X-Cache ヘッダーを Error from cloudfront に設定するなどのレスポンスがある場合:

  • 証明書が期限切れです

  • 証明書が無効です

  • 証明書が自己署名です

  • 間違った順番の証明書チェーンです

注記

中間証明書を含む、証明書チェーンが完全でない場合も、CloudFront は TCP 接続を中断します。

カスタムオリジンサーバーで SSL/TLS 証明書をインストールする方法の詳細については、「CloudFront とカスタムオリジンの間の通信に HTTPS を要求する」を参照してください。

オリジンがオリジン設定のポート指定に応答しません

CloudFront ディストリビューションでオリジンを作成するときに、HTTP および HTTPS トラフィックのために CloudFront がオリジンへの接続に使用するポートを設定できます。デフォルトでは TCP 80/443です。これらのポートは変更可能です。これらのポートで、オリジンが何らかの理由でトラフィックを拒否している場合やバックエンドサーバーが応答していない場合、CloudFront は接続に失敗します。

これらの問題におけるトラブルシューティングには、インフラストラクチャで稼動するファイアウォールを確認し、サポートする IP 範囲がブロックされていないかを確認します。詳細については、Amazon Web Services 全般のリファレンスAWS IP アドレスの範囲をご参照ください。ウェブサーバーがオリジンで稼働中であるかどうかも確認してください。

Lambda 検証エラー

Lambda@Edge を使用している場合、HTTP 502 ステータスコードは、Lambda 関数のレスポンスの形式が正しくないか、レスポンスに無効なコンテンツが含まれていたことを示している可能性があります。Lambda@Edge エラーのトラブルシューティングの詳細については、「Lambda@Edge 関数をテストおよびデバッグする」を参照してください。

DNS エラー (NonS3OriginDnsError

NonS3OriginDnsError エラーコードを含む HTTP 502 エラーは、CloudFront がオリジンに接続できないという、DNS 設定の問題があることを示しています。このエラーが CloudFront で発生した場合は、オリジンの DNS 設定が正常に機能していることを確認してください。

CloudFront は、期限切れのオブジェクトや、キャッシュに保存されていないオブジェクトをリクエストされると、オリジンにリクエストしてオブジェクトを取得しようとします。オリジンに対して正常なリクエストを行うため、CloudFront はオリジンドメインで DNS 解決を実行します。ドメインの DNS サービスで問題が発生している場合、CloudFront はドメイン名を解決して IP アドレスを取得できないため、HTTP 502 エラー (NonS3OriginDnsError) が発生します。この問題を解決するには、DNS プロバイダーにお問い合わせください。Amazon Route 53 を使用している場合は、「Route 53 DNS サービスを使用している自分のウェブサイトにアクセスできないのはなぜですか?」を参照してください。

この問題の詳しいトラブルシューティングを行うには、オリジンのルートドメインまたは zone apex (example.com など) の権威ネームサーバーが正しく機能していることを確認します。dignslookup などのツールにより、次のコマンドを使用して apex オリジンのネームサーバーを検索できます。

dig OriginAPEXDomainName NS +short
nslookup -query=NS OriginAPEXDomainName

ネームサーバーの名前がある場合、次のコマンドを使用して、それらに対してオリジンのドメイン名のクエリを実行し、各サーバーが応答して答えを返すことを確認します。

dig OriginDomainName @NameServer
nslookup OriginDomainName NameServer
重要

この DNS トラブルシューティングは、公共のインターネットに接続しているコンピュータを使用して実行してください。CloudFront はインターネット上のパブリック DNS を使用してオリジンドメインを解決するため、同様の状況でトラブルシューティングを行うことが重要です。

オリジンがサブドメインであり、このサブドメインの DNS 権限がルートドメインとは異なるネームサーバーに委任されている場合は、ネームサーバー (NS) および Start of Authority (SOA) レコードが、このサブドメインに対して正しく設定されていることを確認してください。これらのレコードは、前述の例と同様のコマンドを使用して確認できます。

DNS の詳細については、Amazon Route 53 ドキュメントの「ドメインネームシステム (DNS) の概念」を参照してください。