はじめに
ALBの学習が目的。
ALB + EC2 でWEBページが表示してできるようにして、ヘルスチェックが成功しているターゲットに分散ルーティングされることを確認するところまでやってみる。
【構成図】
【前提】
- EC2ではApacheが動いており、ドキュメントルート直下にindex.htmlを設置済み
- ALB → EC2間はHTTPで通信、ヘルスチェックも同様
パブリックサブネット作成
後述のとおり、インターネット向けALBのネットワークインターフェイスを設置するために必要。
ちなみにALBのネットワークインターフェースを作成するサブネットの大きさは最低でも/27とすることが推奨されている。
(参考:Application Load Balancer > アベイラビリティーゾーンサブネット | AWS)
セキュリティグループ編集
※先んじてEC2用のものを、ルールが空の状態で作成済み
■ALB
AWSの推奨ルールのとおり、アウトバウンドはEC2のリスナーポートおよびヘルスチェックポートへのトラフィックのみを許可(前述のとおり、いずれもHTTPを想定)

■EC2
インバウンドルールにALBのセキュリティグループからの80番ポートへのトラフィックを許可。
※アウトバウンドルールは一旦デフォルト(全開放)

ターゲットグループ作成
ALBからのルーティング先としたいEC2をターゲットグループのターゲットとして指定。ALB作成段階でALBとターゲットグループを紐づける。
マネジメントコンソールの
EC2 > ターゲットグループ
画面にて"ターゲットグループの作成"をクリック。

遷移先の画面で設定を入力していく。
■ターゲットグループの作成
設定
EC2をターゲットにする場合、"ターゲットの種類"については"インスタンス"もしくは"IPアドレス"を選択することとなる。
それぞれ、ターゲットをインスタンスID、IPアドレスで指定するというもの。
双方の主な違い、特徴としては以下のとおり。
インスタンス ID を使用してターゲットを指定すると、トラフィックはインスタンスのプライマリネットワークインターフェイスで指定されたプライマリプライベート IP アドレスを使用して、インスタンスにルーティングされます。IP アドレスを使用してターゲットを指定する場合は、1 つまたは複数のネットワークインターフェイスからのプライベート IP アドレスを使用して、トラフィックをインスタンスにルーティングできます。
インスタンス ID でターゲットを登録する場合は、Auto Scaling グループでロードバランサーを使用できます。Auto Scaling グループにターゲットグループをアタッチすると、ターゲットの起動時に Auto Scaling によりターゲットグループにターゲットが登録されます
VPC (同じリージョンまたは異なるリージョン) とピア接続されている VPC にインスタンスがある場合、そのインスタンスをインスタンス ID で登録することはできません。このようなインスタンスは IP アドレスで登録できます。
(出典:Application Load Balancer のターゲットグループ | AWS)
今回、以下の状況なので、どちらでも成立する。
- ターゲット(EC2)にはネットワークインターフェイスが1つ
- Auto Scalingグループを使うわけではない
- ターゲットはALB設置先と同一のVPC内
設定画面でIPアドレスを入力するのが面倒なので、"インスタンス"を選択する。
ALB → ターゲット間の通信用プロトコルはHTTP:80を指定。
ヘルスチェック
ヘルスチェックプロトコルは
ALB → ターゲット間の通信用プロトコルに合わせて
HTTPとする。
ヘルスチェックの詳細設定にてヘルスチェック用の通信先ポートを変更することも可能。

ターゲットオプティマイザー
ターゲットに対する同時接続数の制御に関する設定(参考:ALBの新機能 Target Optimizer による同時接続数の制御を試してみた | DevelopersIO)。
不要なのでオフ。

ここまでで"次へ"をクリック
■ターゲットを登録
使用可能なインスタンス ターゲットを確認
設定にて選択したVPCに設置されているインスタンスが表示されているので、ターゲットとするインスタンスにチェックを入れて"保留中として以下を含める"をクリック。

チェックを入れたインスタンスが"ターゲットを確認"に表示されたことを確認のうえ、"次へ"をクリック。

確認画面に遷移するので、内容に問題がないことを確認のうえ、"ターゲットグループの作成"をクリックしていターゲットグループ作成完了。
ALB作成
マネジメントコンソールの
EC2 > ロードバランサー
画面にて"ロードバランサーの作成"メニューの"Apllication Load Balancer"ボタンをクリック。

遷移先の画面で設定を入力していく。
■基本的な設定
インターネットからアクセスできる必要があるので、
スキームはインターネット向けを指定。
IPv4アドレスで通信できれば足りるので、
ロードバランサーのIPアドレスタイプはIPv4を選択。

■ネットワークマッピング
Application Load Balancer を作成するときは、ターゲットを含むゾーンを有効にする必要があります。ゾーンを有効にするには、ゾーン内のサブネットを指定します。
ゾーンを有効にしていない場合、登録したターゲットはロードバランサーからのトラフィックを受信しません。
Elastic Load Balancing は、ロードバランサーを設定したサブネットにネットワークインターフェイスを作成します。
(出典:Application Load Balancer > ロードバランサーのサブネット | AWS)
上記の内容をざっくり言うと、以下のとおり。
- ALBは選択したアベイラビリティゾーンに設置されたターゲット(今回はEC2)にのみリクエストをルーティングする
- 選択したアベイラビリティゾーンの中から、ALBのネットワークインターフェースを作成したいサブネットを選ぶこととなる
①アベイラビリティゾーンはリクエストをルーティングしたいターゲットが設置されているサブネットを含むもの全てにチェック。
インターネットからのトラフィックを処理する想定なので、ALBのネットワークインターフェースはパブリックサブネットになくてはならない。
②サブネットはパブリックサブネットにチェック。
とくにALBのENIに付与するパブリックIPv4アドレスはこだわらないので
IPプールは使用しない。

■セキュリティグループ
先に作成したALB用のセキュリティグループを選択
■リスナーとルーティング
リスナーはリクエストを受けつけてルーティングするプロセス。
プロトコルは、ALBの場合、HTTPもしくはHTTPSの2択。
HTTP、80番ポートを選択。
アクションのルーティングは
"ターゲットグループへ転送"として、リクエストをルーティングしたいターゲットグループを選択。
ターゲットグループが一つなので重み(分散の割合)およびターゲットグループの維持(セッションを特定のターゲットにバインド)は無視。

"ロードバランサーの作成"をクリックして完了。
検証
ヘルスチェックが成功しているターゲットに分散ルーティングされることを確認したい。
なお、作成したALBのDNS名は test-alb-****.ap-northeast-1.elb.amazonaws.com 。
①すべてのターゲットが正常な場合
ターゲットインスタンスのトップページの内容は、
アベイラビリティゾーンaの方が"testa"、cの方が"testc"となっている。
curlで連続アクセスすると交互に"testa"、"testc"が表示されている。期待通り。
$ curl test-alb-****.ap-northeast-1.elb.amazonaws.com
testc
$ curl test-alb-****.ap-northeast-1.elb.amazonaws.com
testa
$ curl test-alb-****.ap-northeast-1.elb.amazonaws.com
testc
$ curl test-alb-****.ap-northeast-1.elb.amazonaws.com
testa
$
②片方のターゲットが異常な場合
ターゲットインスタンスのうち、アベイラビリティゾーンcの方のApacheを停止。
ヘルスチェックのステータスが異常となった。

curlで連続アクセスしても"testa"しか表示されなくなった。期待通り。
$ curl test-alb-****.ap-northeast-1.elb.amazonaws.com
testa
$ curl test-alb-****.ap-northeast-1.elb.amazonaws.com
testa
$ curl test-alb-****.ap-northeast-1.elb.amazonaws.com
testa
$ curl test-alb-****.ap-northeast-1.elb.amazonaws.com
testa
$




