Amazon Linux 2023でALBヘルスチェックを通す最小設定
この記事の目的
Amazon Linux 2023 で、ALBのヘルスチェックを通すための最小限の設定を行います。
具体的には、Apache で80番ポートにリクエストが来た時ステータスコード200が返るEC2インスタンスを作ります。
また、Amazon Linux 2 まで使用できていた yum が Amazon Linux 2023 から dnf に変更されたこともあり、最新の情報を残しておく目的もあります。
バージョン情報など
- OS: Amazon Linux 2023
- httpサーバー: Apache 2.4
- ロードバランサ: Application Load Balancer
コマンド
早速ですが、最終的なコマンドは以下のとおりです。上から順番に実行すれば、ヘルスチェックに通過するEC2が作成されます。
$ sudo dnf upgrade -y # dnf(AL2023のパッケージマネージャ)の更新
$ sudo dnf install -y httpd # Apache のインストール
$ sudo systemctl start httpd # httpd の起動
$ sudo systemctl enable httpd # インスタンス起動時に自動で起動するよう設定
$ echo "Hello World" | sudo tee /var/www/html/index.html # index.html の作成
シェルスクリプト
ユーザーデータなどで実行したい場合は、以下のシェルスクリプトを使います。コマンドは同じです。
#!/bin/bash
sudo dnf upgrade -y
sudo dnf install -y httpd
sudo systemctl start httpd
sudo systemctl enable httpd
echo "Hello World" | sudo tee /var/www/html/index.html
動作確認
これだけだと味気ないので、インスタンスにユーザーデータを設定してヘルスチェックが通ることを確認してみます。
まず、インスタンスの作成画面を開きます。
「インターネットからのhttpトラフィックを許可」にチェックを入れ、セキュリティグループの80番ポートを開けます。
次に、「高度な詳細」を開きます。
スクロールすると「ユーザーデータ」のフィールドがあるので、ここに上記のスクリプトを添付します。
この状態で、インスタンスを起動します。
起動が完了したら、インスタンスの詳細画面の「パブリックIPv4アドレス」をコピーしてブラウザに貼り付けます。
(オープンアドレスは HTTPS でアクセスされるため、正しく開けません。)
IPアドレスにアクセスすると、以下の画面が表示されApacheの起動に成功していることがわかります。
では、最後にこのインスタンスをALBに紐づけてHealthyとなることを確認します。
まずターゲットグループの画面から、ターゲットグループの作成を行います。
ターゲットタイプはインスタンス、プロトコルとポートは HTTPの80 であることを確認し、そのほかはデフォルトで設定を進めます。
ターゲットグループ名は任意のもので問題ありません。今回は test-tg としました。
ターゲットの登録画面では先ほどのEC2が表示されているはずです。
チェックを入れ、「保留中として以下を含める」を選択します。
すると、以下のような表示になります。この状態でターゲットグループを作成します。
これでターゲットグループの作成が完了しました。ただ、この状態ではヘルスチェックが行われないので、検証にはロードバランサーまで作成する必要があります。
今作成したターゲットグループの画面から、「新しいロードバランサーに関連付け」をクリックします。
ロードバランサーのスキームは「インターネット向け」を選択します。
ネットワークマッピングは、EC2インスタンスを選択したVPCとサブネットを選択します。
リスナーとルーティングで、先ほど作成した test-tg を選択します。
※ここでターゲットグループが出てこない場合は、VPCの選択が誤っている可能性があります。
これでALBの作成をクリックし、以下の成功メッセージが表示されることを確認します。
ALBの作成まで完了すると、ターゲットグループの登録済ターゲットでインスタンスの初期化が始まります。
初期化が完了し、Healthy になることが確認できました。
詰まったポイント: ヘルスチェックに失敗する
Apache にはドキュメントルートにファイルが存在しない場合は自動で表示されるページ(以下)があります。
最初は「ブラウザから見れてるな、200ヨシ!」と思って進めていたのですが、ヘルスチェックが通らず調査を行いました。
結果的には、上記の画面は 200 ではなく 403 コードでレスポンスが返って来るようで、ブラウザから見れていてもヘルスチェックには通らないという状況が起きていました。
なので、ヘルスチェックに失敗する場合はドキュメントルートに index.html が配置されているかを確認すると解決につながるかもしれません。
終わりに
インスタンスの設定自体は簡単なので、動作確認まで含めて検証してみました。
ユーザーデータであれば簡単にセットアップできるので、検証の際に活用してもらえると嬉しいです。