初めに
設定を終え、クライアントからALBのURL(route53のエイリアス)でアクセスしようとしたら502 bad gatewayと出ました。
以下に原因と対処方法を備忘録として残します。
エラー発生時の状況まとめ
- ALB(HTTPS/443, ACM証明書) → EC2(Windows Server)
- クライアントに証明書インストール済み
- **EC2のIPを直打ちではアクセスできる
- しかし ALB経由では 502 Bad Gateway
- セキュリティグループに問題なし
途中経過
公式ドキュメントを調べる
- ロードバランサーがターゲットに接続するときに SSL ハンドシェイクエラーが発生しました
ハンドシェイクとは
- HTTPS 開始時に行う手続き
- クライアントとサーバーで以下を実施する
- 暗号方式の決定
- サーバー証明書の提示・検証
- 共通鍵(セッションキー)の交換
- これが成立し、暗号通信(HTTPS)が可能になる
サーバのEC2に証明書をインポートしない構成のため、ターゲットグループのプロトコルはhttpが正しいのでは、と仮説を立てる→解決
原因
- ALBのターゲットグループが HTTPS(443) に設定されていた
- 実際のEC2は HTTP/80 で待受
- ALBがターゲットへ TLSハンドシェイクを試みるが、EC2がHTTP応答 → 不一致で失敗
- ALBはバックエンド接続エラーとして 502 を返却
対処
- ターゲットグループを HTTP/80 で再作成・登録
- 以降は ALB が HTTPS(443)で終端 → EC2へは HTTP(80) で中継
切り分けの観点
-
ターゲットグループ設定確認
- Protocol/Port (HTTP:80 or HTTPS:443)
- ヘルスチェックのプロトコルや値に問題ないか
-
実サーバー待受確認
curl -I http://<EC2_IP>:80
-
openssl s_client -connect <EC2_IP>:443
(必要時)
-
ALBのCloudWatchメトリクス
HTTPCode_ELB_5XX_Count
-
SG/NACL確認
- EC2側は ALB SG → 80(または443) のみ許可
正しい構成パターン
TLS終端をALBにする
- ALBリスナー: HTTPS/443 (ACM証明書)
- ターゲットグループ: HTTP/80
- EC2: HTTP/80で待受
- ヘルスチェック: HTTP/80
- SG: EC2は ALB SG からの80のみ許可
終わりに
再発防止として、どこがhttpsの終端なのかを確認する。
- ALB終端の場合:ターゲットは HTTP/80 で待受 (EC2に証明書を入れない構成では、ターゲットグループはHTTPを選択する)
- EC2終端の場合:ターゲットも HTTPS/443(証明書をIISに紐付けて公開する)