ALB と NLB のヘルスチェックの違い ── HTTP のパスと成功コードで見るか、TCP の接続で見るか
記事の「実践」を 1 項目ずつ進めるためのページです。AWS マネジメントコンソールで操作したら、右の一覧にチェックを入れてください。チェックはこのブラウザに保存されます。
前提条件
- リージョン:
ap-northeast-1(東京) - 以下のリソースが作成済みであること
まだ用意していない場合は、「作り方の参考」の記事の手順で作れます。リソース名は、この記事の名前に読み替えてください。
| リソース種別 | リソース名 | 内容 | 作り方の参考 |
|---|---|---|---|
| EC2 インスタンス | soa-hc-web-a(ap-northeast-1a) | Apache で / に web-a、/health.html に ok を返す | Amazon EC2 でインスタンスを起動しSSH接続する |
| EC2 インスタンス | soa-hc-web-b(ap-northeast-1c) | 同上(/ は web-b) | 同上 |
| IAM ロール | soa-hc-ec2-role | 2 台の EC2 に付与。AmazonSSMManagedInstanceCore をアタッチ(Run Command 用) | AWS IAM でユーザー・ロール・ポリシーを作成しアクセス制御する |
| セキュリティグループ | soa-hc-web-sg | EC2 用。TCP 80 を soa-hc-alb-sg と soa-hc-nlb-sg から許可 | |
| Application Load Balancer | soa-hc-alb | インターネット向け、ap-northeast-1a / 1c、soa-hc-alb-sg(HTTP 80 を許可)。リスナーはまだ無い | |
| Network Load Balancer | soa-hc-nlb | インターネット向け、ap-northeast-1a / 1c、soa-hc-nlb-sg(TCP 80 を許可)。リスナーはまだ無い |
作成するリソース一覧
| リソース種別 | リソース名 | 用途 |
|---|---|---|
| ターゲットグループ | soa-hc-alb-tg | ALB 用。HTTP で /health.html を確認する |
| ターゲットグループ | soa-hc-nlb-tg | NLB 用。TCP の接続を確認する(後で HTTP に変える) |
| リスナー | soa-hc-alb の HTTP:80 | soa-hc-alb-tg へ転送 |
| リスナー | soa-hc-nlb の TCP:80 | soa-hc-nlb-tg へ転送 |
手順 1: ALB 用のターゲットグループを作る
AWS マネジメントコンソールにログインし、リージョンが ap-northeast-1(東京)であることを確認します。上部の検索バーに EC2 と入力し、「EC2」を選択します。
左側ナビゲーションの「ロードバランシング」→「ターゲットグループ」を選択し、「ターゲットグループの作成」をクリックします。以下を設定します。
- ターゲットタイプの選択: 「インスタンス」
- ターゲットグループ名:
soa-hc-alb-tg - プロトコル : ポート:
HTTP:80 - VPC:
soa-lab-vpc - ヘルスチェックプロトコル:
HTTP - ヘルスチェックパス:
/health.html
「ヘルスチェックの詳細設定」を開き、確認が早く進むように以下へ変更します。
- 正常のしきい値:
2 - 非正常のしきい値:
2 - タイムアウト:
5 - 間隔:
10 - 成功コード:
200
その他の項目はデフォルトのままにします。
「次へ」をクリックし、「ターゲットを登録」で soa-hc-web-a と soa-hc-web-b にチェックを入れ、「保留中として以下を含める」をクリックします。「ターゲットグループの作成」をクリックします。
手順 2: ALB にリスナーを追加する
左側ナビゲーションの「ロードバランサー」を選択し、soa-hc-alb を開きます。「リスナーとルール」タブで「リスナーの追加」をクリックし、以下を設定して「追加」をクリックします。
- プロトコル:
HTTP、ポート:80 - デフォルトアクション: 「ターゲットグループへ転送」→
soa-hc-alb-tg
リスナーから参照されたことで、soa-hc-alb-tg のヘルスチェックが始まります。ターゲットグループ soa-hc-alb-tg の「ターゲット」タブを開き、しばらく待って(画面右上の更新ボタンで再読み込み)2 台とも「ヘルスステータス」が Healthy になったことを確認します。
手順 3: NLB 用のターゲットグループとリスナーを作る
「ターゲットグループ」に戻り、「ターゲットグループの作成」をクリックします。以下を設定します。
- ターゲットタイプの選択: 「インスタンス」
- ターゲットグループ名:
soa-hc-nlb-tg - プロトコル : ポート:
TCP:80(ポートは自動では入らないので入力します) - VPC:
soa-lab-vpc - ヘルスチェックプロトコル:
TCP(プロトコルを TCP にしても、ここは HTTP のまま残ることがあるので選び直します)
「ヘルスチェックの詳細設定」を開き、以下へ変更します。TCP では、パスと成功コードの項目がありません。タイムアウトは既定の 10 秒のままにします。
- 正常のしきい値:
2 - 非正常のしきい値:
2 - 間隔:
10
「次へ」をクリックし、手順 1 と同じく 2 台を登録して「ターゲットグループの作成」をクリックします。
「ロードバランサー」から soa-hc-nlb を開き、「リスナー」タブで「リスナーの追加」をクリックします。プロトコル TCP、ポート 80、デフォルトアクションの転送先に soa-hc-nlb-tg を選んで「追加」をクリックします。soa-hc-nlb-tg の「ターゲット」タブで、2 台とも Healthy になるまで待ちます。
手順 4: web-b のヘルスチェック用ページを消す
soa-hc-web-b のアプリの一部が壊れた状態を作ります。上部のツールバーの CloudShell アイコンをクリックして AWS CloudShell を開き、次のコマンドで Run Command を実行します。soa-hc-web-b の /health.html だけが消え、/(トップページ)と Apache のプロセスはそのまま動き続けます。
aws ssm send-command \
--document-name AWS-RunShellScript \
--targets Key=tag:Name,Values=soa-hc-web-b \
--parameters 'commands=["rm -f /var/www/html/health.html"]' \
--query Command.CommandId --output text
手順 5: ALB と NLB の判定を比べる
20〜30 秒ほど待ってから、soa-hc-alb-tg の「ターゲット」タブを再読み込みします。soa-hc-web-b の「ヘルスステータス」が Unhealthy になり、「ヘルスステータスの詳細」に Health checks failed with these codes: [404] のように、成功コード(200)以外が返ったことが表示されます。
次に soa-hc-nlb-tg の「ターゲット」タブを開きます。こちらは 2 台とも Healthy のままです。TCP ヘルスチェックはポート 80 に接続できるかだけを見ているので、/health.html が 404 を返していることには気づきません。
CloudShell で理由コードも確認しておきます。<ALB 用ターゲットグループの ARN> は、soa-hc-alb-tg の詳細に表示される ARN に置き換えます。
aws elbv2 describe-target-health \
--target-group-arn <ALB 用ターゲットグループの ARN> \
--query 'TargetHealthDescriptions[].[Target.Id,TargetHealth.State,TargetHealth.Reason]' \
--output table
soa-hc-web-b のインスタンス ID の行に unhealthy と Target.ResponseCodeMismatch が表示されます。コンソールの表には詳細の文だけが出て、この理由コードは出ません。
手順 6: NLB のヘルスチェックを HTTP に変える
soa-hc-nlb-tg の「ヘルスチェック」タブで「編集」をクリックし、以下に変更して「変更内容の保存」をクリックします。
- ヘルスチェックプロトコル:
HTTP - ヘルスチェックパス:
/health.html - 「ヘルスチェックの詳細設定」を開き、成功コード:
200
成功コードは空のままだと「ヘルスチェック http コードマッチャーを空にすることはできません。」と表示されて保存できないので、必ず入力します。
ヘルスチェックの設定を変えると、ターゲットはいったん initial(初期のヘルスチェック中)に戻ります。3 分ほど待って「ターゲット」タブを再読み込みすると、NLB でも soa-hc-web-b が Unhealthy になります。NLB の理由は Target.FailedHealthChecks(ヘルスチェックに失敗)としてまとめて表示されます。