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

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

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

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

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

CloudFront とオリジンの間で HTTPS を必要とするカスタムオリジンを使用すると、ドメイン名が一致しない場合にエラーが発生する可能性があります。オリジンの SSL/TLS 証明書には、CloudFront ディストリビューションに指定した [オリジンドメイン] またはオリジンリクエストの Host ヘッダーのいずれかに一致するドメイン名が含まれている必要があります。

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

証明書のドメイン名がディストリビューションまたは Host ヘッダーの [オリジンドメイン] と一致するかどうかを確認するには、オンライン 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 VPC ユーザーガイド」の「AWS IP アドレスの範囲」を参照してください。ウェブサーバーがオリジンで稼働中であるかどうかも確認してください。

Lambda 検証エラー

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

CloudFront 関数の検証エラー

CloudFront 関数を使用している場合、HTTP 502 ステータスコードは、CloudFront 関数が読み取り専用ヘッダーを追加、削除、または変更しようとしていることを示している場合があります。このエラーは、テスト中は表示されませんが、関数をデプロイしてリクエストを実行した後に表示されます。このエラーを解決するには、CloudFront 関数を確認して更新します。詳細については、「関数を更新する」を参照してください。

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) の概念」を参照してください。

Application Load Balancer オリジン 502 エラー

Application Load Balancer をオリジンとして使用して 502 エラーが発生した場合は、「Application Load Balancerの HTTP 502 エラーのトラブルシューティング方法を教えてください」を参照してください。

API Gateway オリジン 502 エラー

API Gateway を使用していて 502 エラーが発生した場合は、「Lambda プロキシ統合を使用して API Gateway REST API からの HTTP 502 エラーを解決するにはどうすればよいですか?」を参照してください。