HTTP 502 ステータスコード (Bad Gateway)
HTTP 502 ステータスコード (Bad Gateway) は、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 ラボを使って、オリジンが暗号とプロトコルをサポートすることを確認できます:
-
[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=NSOriginAPEXDomainName
ネームサーバーの名前がある場合、次のコマンドを使用して、それらに対してオリジンのドメイン名のクエリを実行し、各サーバーが応答して答えを返すことを確認します。
dig OriginDomainName @NameServerFromAbove nslookup OriginDomainName NameServerFromAbove
Lambda@Edge 関数の検証エラー
Lambda@Edge を使用している場合、HTTP 502 ステータスコードは、Lambda 関数のレスポンスの形式が正しくなかったか、レスポンスに無効なコンテンツが含まれていたことを示している可能性があります。Lambda@Edge エラーのトラブルシューティングの詳細については、「Lambda@Edge 関数のテストとデバッグ」を参照してください。