AWS ALBのターゲットグループに設定したEC2インスタンスがunhealthyでバランシングされない
お勉強用で構築しているAWS環境でALB作成後、ターゲットグループのstatusがどちらのインスタンスともhealthyから変わらないため四苦八苦したが、案外大したことなかったので二度とやらかさないために備忘。
目次
・前提条件
・問題点
・問題解決①セキュリティグループの設定
・問題解決②HTMLファイルの作成
・まとめ
前提条件
AZ:ap-northeast-1a
OS:Amazon Linux release 2 (Karoo)
ミドルウェア:nginx version: nginx/1.12.2
AZ:ap-northeast-1c
OS:CentOS Linux release 8.2.2004 (Core)
ミドルウェア:Server version: Apache/2.4.37 (centos)
問題点
ALBとターゲットグループを設定したが、どちらのインスタンスもunhealthyとなり、ブラウザからDNS名(Aレコード)でアクセスしても負荷分散どころかアクセスすらできない。(504 Gateway Time-out)ただし、どちらのインスタンスも直接インスタンスに向けてアクセスするのであれば成功する。
【ターゲットグループの設定】
問題解決①セキュリティグループの設定
何が原因か色々なサイトをググっていたら、インスタンス向けにHTTP:80で通信のやり取りがあるのにふと気づく。(ターゲットグループを作成したときに、デフォルトとは言え、自身で80ポートに設定したことは数日前に始めて作成したから忘れたという言い訳をしておく)
【参考サイト】
そういえば、セキュリティグループはちゃんと設定してたか確認したが、HTTPはパブリック IPv4 アドレスからしか許可していなかったため、セキュリティグループのインバウンドにALBからの接続用(VPC内部間での通信用)のIPアドレスを追加。
【追加設定前】
【追加設定後】
インスタンス①へは接続成功!ただ、インスタンス②にはいつまでたっても接続できず・・・
ターゲットグループを見ると、やはりインスタンス②はまだエラーが出ている模様。どうやら、エラーの内容は403 Forbiddenっぽい。
【ALB経由でのインスタンス①へのアクセス】
【ターゲットグループの設定】
問題解決②HTMLファイルの作成
とりあえず、Status detailsの文章を丸っとコピペして検索したところ、ドンピシャの記事発見!
【参考サイト】
確かにerror.logでDirectoryIndexがないって言ってますね。とりあえず、HTMLファイルがあればよさそうなのでいつものあいさつで作成。
#cat index.html
<html><head><title>Test Page</title></head><body>Hello World!</body></html>
まずはインスタンス②へ直接アクセスしてブラウザに表示されること確認。
しばらくするとターゲットグループも反映され、インスタンス②もhealthyに変更されました。これでDNS名(Aレコード)でアクセスするときちんとALBでバランシングされていることが確認できました。
【ターゲットグループの設定】
まとめ
今回使用するミドルウェアはapacheとnginxとあえて違うものをインストールしたうえで実施しましたが、どんな事象であれエラーがでたときはまずはログの確認だと改めて思いました。その場の検索でなんとかするのではなく、本質的な問題解決力を身に着けていきたいですね。