Amazon API Gateway のプライベート統合を使用して API を呼び出すと、400 Bad Request エラーが発生します。
解決策
"400 Bad Request" エラーは、API Gateway のプライベート統合に構成上の問題がある場合に発生します。
HTTP API
HTTPS または TLS ポートに設定されたリスナーを持つ Application Load Balancer または Network Load Balancer がリクエストを受信している
デフォルトでは、HTTP API のプライベート統合は HTTP プロトコルを使用します。HTTPS または TLS リスナーが構成されている場合、ロードバランサーは HTTP リクエストではなく HTTPS リクエストを想定します。この結果、次のエラーが発生します。
<html>
<head><title>400 The plain HTTP request was sent to HTTPS port</title></head>
<body>
<center><h1>400 Bad Request</h1></center>
<center>The plain HTTP request was sent to HTTPS port</center>
<hr><center>nginx</center>
</body>
</html>
HTTPS または TLS リスナーには、TLS 設定でサーバー名を指定する必要があります。HTTPS プロトコルを設定するには、次の手順を実行します。
- 内部 Application Load Balancer または Network Load Balancer のドメイン名を記録します。
- API Gateway コンソールを開きます。
- API の統合設定を開き、構成を編集します。
- ステップ 1 のドメイン名を使用して TLS 構成にサーバー名を指定します。
- (オプション) 自動デプロイが無効な場合は、API を再度デプロイします。
Desync の移行モードが最も厳格に設定されている
HTTP API では、プライベート統合または仮想プライベートクラウド (VPC) リンク統合で Application Load Balancer を使用できます。API Gateway が正しく構成されていても、Application Load Balancer の Desync 緩和モード設定が最も厳格な場合、次のエラーが発生します。
<html>
<head><title>400 Bad Request</title></head>
<body>
<center><h1>400 Bad Request</h1></center>
</body>
</html>
Desync 緩和モードは、HTTP Desync を原因とする問題からアプリケーションを保護します。詳細情報は、Application Load Balancer のメトリクス DesyncMitigationMode_NonCompliant_Request_Count で取得できます。
Desync 緩和モードを無効にするには、次の手順を実行します。
- Amazon Elastic Compute Cloud (Amazon EC2) コンソールを開きます。
- ナビゲーションペインで [ロードバランサー] を選択し、編集する Network Load Balancer を選択します。
- [アクション] を選択し、[ロードバランサー属性の編集] を選択します。
- [パケット処理] で [防御的] を選択します。
- [変更を保存] を選択します。
REST API
TLS ポートで構成されたリスナーを持つ Network Load Balancer がリクエストを受信している
構成に TLS リスナーを含む Network Load Balancer は、アップストリームサービスから HTTPS リクエストを受信することを想定します。REST API 構成において、HTTP URL を統合エンドポイント URL として指定した場合、リクエストは失敗し、次のエラーが発生します。
<html>
<head><title>400 The plain HTTP request was sent to HTTPS port</title></head>
<body>
<center><h1>400 Bad Request</h1></center>
<center>The plain HTTP request was sent to HTTPS port</center>
<hr><center>nginx</center>
</body>
</html>
HTTPS プロトコルを構成するには、次の手順を実行します。
- API Gateway コンソールを開きます。
- API の統合設定を開き、構成を編集します。
- エンドポイント URL で、http:// ではなく https:// を使用するように変更します。
- API を再度デプロイします。
重要: エンドポイント URL の変更を HTTPS に適用する際は、TLS リスナーの構成時に使用したドメイン名を使用する必要があります。
関連情報
API Gateway REST API を Application Load Balancer と統合する方法を教えてください
Amazon Gateway REST API の Amazon VPC リンクを削除する方法を教えてください