初学者向け：アプリケーションロードバランサー（ALB）のヘルスチェックのパスを理解する

## はじめに

アプリケーションロードバランサー（ALB）は、AWS環境でスケーラブルなアプリケーションを構築する際に欠かせないサービスの一つです。

:::note info
***今回は、ALBの「ヘルスチェックのパス」に焦点を当て、簡単な技術検証を行いながら解説していきます。***
:::

この記事では、自分自身の備忘録も兼ねて、ヘルスチェックに関する知識を体系的に整理していきます。

## 書こうと思ったきっかけ
今回、ALBのヘルスチェックについて記事をまとめようと思った理由は、AWSを学び始めた当初、この「ヘルスチェック」が具体的に何をしているのかイメージが湧かなかった経験があるからです。

:::note alert
***当時は、ターゲットが "Healthy" になったり "Unhealthy" になったりする状態をうまく理解できず、困ったことがありました。***
:::

***結論として、ヘルスチェックは設定したパスが正常に応答しているかを確認する仕組みです。***

同じようにヘルスチェックの仕組みで悩んでいる方もいるのではないかと思い、この記事をまとめることにしました。

## ALB関連の技術検証の記事

ALBはAWSの中でも非常に重要なサービスの一つです。そのため、これまでにもさまざまな技術検証を行ってきました。***過去の記事も参考にしていただけると嬉しいです。***

https://qiita.com/free-honda/items/d8fbcd649a711e8f283a

https://qiita.com/free-honda/items/a2563c86c6d8eda89a96

https://qiita.com/free-honda/items/95e969d3473bff492198

https://qiita.com/free-honda/items/1d8810054b556739afaf

https://qiita.com/free-honda/items/f61bb378d9cf400ce235

***これ以外にも技術検証を行っていますので、興味のある方はぜひマイページから探してみてください！***

## ヘルスチェックとは？
アプリケーションロードバランサー（ALB）のヘルスチェックは、ターゲット（EC2インスタンスやコンテナ）が正常に動作しているかを定期的に確認する機能です。

***ヘルスチェックの結果をもとに、ALBはリクエストを送信するターゲットを選別します。***

### ヘルスチェックの主な特徴

:::note info
- **HTTP/HTTPSプロトコルを使用してターゲットのステータスを確認**
- **ヘルスチェックに合格したターゲットにのみリクエストをルーティング**
- **ターゲットが非正常と判断された場合、自動的にリクエスト対象から除外**
:::

## ヘルスチェックの設定項目
ALBのヘルスチェックでは、以下のパラメータなどを細かく設定できます。

| 項目           | 説明                                                                             |
|----------------|----------------------------------------------------------------------------------|
| プロトコル      | HTTPまたはHTTPSを選択                                                            |
| パス           | ヘルスチェック用のエンドポイント（例: /health）                                   |
| ポート         | チェックを行うターゲットのポート番号（通常は80または443）                          |
| 間隔（Interval）| ヘルスチェックのリクエストを送る間隔（秒）                                        |
| タイムアウト    | ヘルスチェック応答のタイムアウト（秒）                                            |
| 正常チェック数  | ターゲットを正常と判断するために必要な連続成功回数                                 |
| 異常チェック数  | ターゲットを異常と判断するために必要な連続失敗回数                                 |

***これらは基本的な設定ですが、ALBでは「スティッキーセッション」と呼ばれる、アクセスしてきたセッション情報を保持する機能も利用可能です。***

ALBのスティッキーセッションについては、過去の記事で詳しくご紹介しています。興味のある方はそちらも参考にしてみてください。

https://qiita.com/free-honda/items/d7fba9f7761f582cb1dc

## ヘルスチェック用のエンドポイント（パス）について
ヘルスチェックでは、ターゲットのエンドポイントが正しいか、または ```/health```のような指定されたエンドポイントが正常に応答しているかを確認します。

![スクリーンショット 2025-01-02 7.41.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/ffd23c89-91cd-bb0c-a67f-ee4004556fdc.png)

AWSマネジメントコンソールでは、以下のようにヘルスチェック用のパスを設定する項目があります。

![スクリーンショット 2025-01-02 8.17.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/3e403790-a27d-0648-a1a7-385a45fbbb01.png)

### 補足：ヘルスチェックのパスが「/」に設定されている場合
ヘルスチェックのパスが「/」と設定されている場合、これはターゲット（EC2インスタンスやコンテナ）に対して送信されるリクエストのURLパス部分がルート（/）であることを意味します。

:::note info
***ALBは、指定されたターゲット（例: EC2インスタンス）に対し、HTTPまたはHTTPSリクエストを送信します。***
:::

***このリクエストは、設定されたポート（通常は80または443）に対して行われ、パスが「/」に設定されている場合、送信されるリクエストは以下のようになります。***

**例:**
ターゲットのIPアドレスが ```http://192.168.1.100``` で、パスが「/」に設定されている場合、リクエストは次のようになります。

```bash
http://192.168.1.100/
```

「/」はアプリケーションのルートパスを指し、システム全体が正常に稼働しているかを確認するための最も基本的な方法です。

:::note warn
***このパスに応答がない場合、アプリケーション全体がダウンしている可能性が高いと判断されます。***
:::

## 実際にヘルスチェックを確認してみた
ここでは、[過去の技術検証記事](https://qiita.com/free-honda/items/d7fba9f7761f582cb1dc)で取り扱ったTerraformによるコード化された構成を使用して、ヘルスチェックの動作を検証します。

***現在、2台のウェブサーバーに対して、ALBからヘルスチェックが実行されている状況です。***

![スクリーンショット 2025-01-02 7.43.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/2c5d66e6-9409-550f-41b5-bbbed849da08.png)

### ヘルスチェック用のエンドポイント（パス）を変更してみる
通常、EC2上のウェブサーバーにはindex.htmlを配置し、それをヘルスチェックで確認するように設定しています。

:::note warn
***今回は、一時的にヘルスチェックのパスを存在しないHTMLファイル ```/test.html``` に設定して挙動を確認してみます。***
:::

![スクリーンショット 2025-01-02 7.47.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/ff04d193-00c4-1eed-50a3-494fd2ccb299.png)

***想定通り、存在しないパスに対してヘルスチェックが実行され、正常に応答しないために「Unhealthy」と判定されたことが確認できました。***

```bash
Health checks failed with these codes: [404]
```

また、詳細画面からもロードバランサーがターゲットに対して送信したヘルスチェックリクエストに対し、HTTPステータスコード404（Not Found）が返されたことが記録されています。

## まとめ
ここまで読んでいただき、ありがとうございました！

:::note info
***今回は、基本的なALBのヘルスチェックのパスについて深掘りし、検証を行いましたが、記事をまとめる中で、自分の理解が曖昧だった部分もクリアになりました。***
:::

***AWSの勉強を始めた方や、これから勉強を始めようと思っている方の学びのきっかけや、技術的な支えになれば幸いです！***

## 余談

少し余談になりますが、仕事が休みの日や休日などは、朝から晩までパソコンを触っていることが多く、睡眠時間がつい短くなってしまうことがあります。

***今回の年末年始も平均して睡眠時間が5時間を切っていたため、昨日は疲れが溜まり、8時間ほどしっかり眠ることができました。***

やはり、たくさん寝た翌日は、頭がすっきり整理され、やりたいことも明確になります。改めて、睡眠の大切さを実感した次第です。

:::note warn
***ただ、知的好奇心が人一倍強く、「知らないことを知りたい」「技術をもっと学びたい」という想いが、最近では睡眠欲を上回ってしまうのが贅沢な悩みです（笑）。***
:::

今年は、この贅沢な悩みと向き合いながら、うまくバランスを取りつつ改善していきたいと思っています。

## 関連記事

https://dev.classmethod.jp/articles/alb-healthcheck-403/

https://blog.serverworks.co.jp/tech/2017/02/08/alb-tagert-health-status/

https://zenn.dev/takuh/articles/4446e12c607a6b

https://www.kaitech-media.biz/post-463/