HTTP 502 ステータスコード (不正なゲートウェイ) - Amazon CloudFront

HTTP 502 ステータスコード (不正なゲートウェイ)

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

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

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

  • ディストリビューションの該当するオリジンの [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 がサポートする暗号とプロトコルのリストについては、「サポートされている暗号とプロトコル」を参照してください。オリジンが SSL/TLS 交換でこれらの暗号またはプロトコルに応答しない場合、CloudFront は接続を確立できません。SSL ラボを使って、オリジンが暗号とプロトコルをサポートすることを確認できます:

  • SSL ラボ

    [Host Name] フィールドでオリジンのドメイン名を入力し、[Submit] を選択します。テスト結果の [Common names] フィールドと [Alternative names] フィールドを見て、オリジンのドメイン名と一致しているかどうかを確認します。

    テスト完了後、テスト結果の [Protocols] または [Cipher Suites] セクションでオリジンがサポートする暗号とプロトコルを確認してください。それらを「サポートされている暗号とプロトコル」のリストと比較します。

注記

Elastic Load Balancing を使用している場合は、Elastic Load Balancing ユーザーガイド の「Elastic Load Balancing での SSL のセキュリティポリシー」を参照して、暗号やプロトコルの設定方法を確認してください。事前定義されたセキュリティポリシー、ELBSecurityPolicy-2016-08 を使い、CloudFront で Elastic Load Balancing にアクセスできます。カスタムポリシーを使用して制限をかけるには、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 範囲がブロックされていないかを確認します。詳細については、アマゾン ウェブ サービス全般のリファレンス の「AWS IP アドレスの範囲」を参照してください。ウェブサーバーがオリジンで稼働中であるかどうかも確認してください。

DNS の問題により、CloudFront がオリジンドメインを解決できなかった

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

この問題の詳しいトラブルシューティングを行うには、オリジンのルートドメインまたは zone apex (example.com など) の権威ネームサーバーが正しく機能していることを確認します。権威ネームサーバーはリクエストを受け取り、ドメインに関連付けられた IP アドレスを返し、CloudFront ディストリビューションを設定したときに使用した DNS サーバーと同じになります。apex オリジンのネームサーバーを見つけるには、以下のコマンドを使用します。

dig OriginAPEXDomainName NS +short nslookup –query=NS OriginAPEXDomainName

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

dig OriginDomainName @NameServerFromAbove nslookup OriginDomainName NameServerFromAbove

Lambda@Edge 関数の検証エラー

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