Amazon CloudFront
開発者ガイド (API バージョン 2016-09-29)

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

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

重要

ウェブサイトやアプリケーションにアクセスを試みたときにこのエラーが発生する場合は、おそらく、サイトへのトラフィックが異常に高くなっているだけです。しばらく待ってから、サイトにアクセス (またはアプリケーションを実行) してみてください。それでもエラーが発生する場合は、ウェブサイトまたはアプリケーションのディストリビューターに直接お問い合わせください。

なぜこのエラーが CloudFront で発生するのですか? CloudFront は、世界各地にあるサーバーにコピーを保存することで、ウェブサイトがイメージやウェブページなどのコンテンツの配信を高速化できるようにします。ただし、ウェブサイトに対して大量のインターネットトラフィックが発生し、サイトが対応しきれない場合、サイトにアクセスしようとするとエラーが返されます。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 がオリジンと接続を確立できるかどうかを確認するには、OpenSSL を使用してオリジンへの SSL/TLS 接続を試み、オリジンの証明書が正しく設定されていることを確認します。OpenSSL で接続できる場合は、オリジンサーバーの証明書に関する情報が返されます。

使用するコマンドは、SNI (Server Name Indication) をサポートするクライアントを使用しているかどうかによって異なります。

クライアントが SNI をサポートする場合

openssl s_client -connect domainname:443 -servername domainname

クライアントは SNI をサポートしない場合

openssl s_client –connect domainname:443

domainname は適切な値に置き換えます。

  • Host ヘッダーをオリジンに転送しない場合domainname をオリジンのドメイン名に置き換えます。

  • ホストヘッダーをオリジンに転送する場合domainname を CloudFront ディストリビューションで使用している 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 アドレスを取得できず、503 エラーが発生します。この問題を解決するには、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 関数に実行エラーが含まれます。

Lambda@Edge 関数に実行エラーが含まれていると、CloudFront が HTTP 502 エラーを返す場合があります。

この問題のトラブルシューティングを行うには、アクセスログを調べて Lambda 関数が返したエラーを探します。必ず、関数が実行されたリージョンのログファイルを確認します。詳細については、「Lambda 関数の CloudWatch メトリクスと CloudWatch Logs」を参照してください。