この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。
はじめに
新サービスやアプリなど新機能をリリースする際に既存のシステムを停止させずにトラフィックのルーティングによってダウンタイムをなるべく発生させずにリリースを行う、ブルーグリーンデプロイメントやカナリアリリースといった手法があります。
今回は2つのEC2インスタンスへのアクセス時にAWSロードバランサーの一つであるALB(アプリケーションロードバランサー)の加重ルーティング機能を使い、トラフィックが指定した比率で2つのEC2インスタンスへ正しくルーティング行われるかを検証してみたいと思います。
ALBについて
Application Load Balancer(ALB)はElastic Load Balancer(ELB)の一つで、EC2やコンテナなどWebサービスにおける負荷(Load)を分散(Balancing)させるロードバランシングです。サーバーに対しての負荷を軽減し、効率化するために自動的に複数のEC2などに負荷を分散します。
Application Load Balancer は、開放型システム間相互接続 (OSI) モデルの第 7 層であるアプリケーションレイヤーで機能します。ロードバランサーはリクエストを受信すると、優先度順にリスナールールを評価して適用するルールを決定し、ルールアクションのターゲットグループからターゲットを選択します。リスナールールを構成し、アプリケーショントラフィックのコンテンツに基づいて異なるターゲットグループにリクエストをルーティングできます。それぞれのターゲットグループでルーティングは個別に実行され、複数のターゲットグループに登録されているターゲットの場合も同じです。ターゲットグループレベルで使用するルーティングアルゴリズムを設定できます。デフォルトのルーティングアルゴリズムはラウンドロビンです。代わりに最小の未処理のリクエストを指定することもできます。
AWS公式|Application Load Balancer の概要から引用
ALBを使うことで得られるメリットは以下3点を挙げます。
- アクセスによってサーバに掛かる負荷を分散させることができる。(高可用性)
- セキュリティグループの設定を行うことで、通信の制限(例:HTTP80のみ許可など)やAWS WAF(アプリケーションファイアーウォール)と関連付けることで、よりセキュリティを強化することができる。(堅牢なセキュリティ)
- ALBに関連付けられたEC2などのターゲットに対してリクエストを送信し、正常性を定期的にチェックする機能があり、トラブルが発生した際の原因究明に役立つ。(ログ記録)
目的
AWSALBルーティングに関するリスナールールの条件の一つである「forward」を使い、2つのEC2に対して重みを設定し、設定どおりのルーティングが行われるようにするのが今回の目的になります。
構成
構成詳細としては、
1.高可用性のマルチAZ構成でパブリックサブネットを作成し、その中にEC2インスタンスを設置する。
2.ALBから直接EC2へ疎通確認を行う。
3.EC2インスタンスには「HelloWorld!EC2 01」、「HelloWorld!EC2 02」と表示されるように構成する。
4.ALBに加重ターゲットグループ機能を使い、指定した比率で各メッセージが表示されるようにする。
構成手順
1.事前準備
・VPC
・パブリックサブネット×2
・インターネットゲートウェイ
・ルートテーブル
を作成します。
AWSコンソールのAWSサービス一覧から「VPC」を選択。
VPCページへ遷移後、「VPCを作成」をクリック。
設定値としては以下になります。
設定項目名 | 設定値 |
---|---|
作成するリソース | VPCなど |
AZの数 | 2 |
パブリックサブネットの数 | 2 |
プライベートサブネットの数 | 0 |
NATゲートウェイ | 無し |
VPCエンドポイント | 無し |
DNSオプションへのチェック | DNSホスト名を有効化 DNS解決を有効化 |
設定完了イメージは下記画像の通りです。
2.セキュリティグループの作成
EC2用とALB用のセキュリティグループを作成します。
設定内容としては以下になります。
インスタンス名 | セキュリティグループ | インバウンドルール |
---|---|---|
Routing-test-EC2 | Routing-test-EC2 | HTTP(0.0.0.0/0) SSH(マイIP) |
Routing-test-ALB | Routing-test-ALB | HTTP(0.0.0.0/0) SSH(マイIP) |
セキュリティグループ作成後、EC2インスタンスを2個立ち上げます。
今回は「Routing-test-EC2-01」、「Routing-test-EC2-02」という名前で作成を行いました。
※EC2インスタンス作成手順については省略いたします。
3.EC2へ表示用メッセージHTML格納
Teraterm経由で作成したEC2へ接続後、Apacheをインストールし、各EC2インスタンスへindex.htmlを格納します。
「Routing-test-EC2-01」には「HelloWorld!EC2 01」、
「Routing-test-EC2-02」には「HelloWorld!EC2 02」と表示されるようindex.htmlを編集し格納しました。
※今回はApacheのインストール手順、格納手順については省略いたします。
4.ターゲットグループの作成
負荷の分散を指定するEC2へ行うためのターゲットグループを作成します。
サービス一覧から「EC2」を選択。
EC2画面に遷移後、サイドメニューから「ターゲットグループ」をクリック。
設定内容は以下になります。
設定項目 | 設定値 |
---|---|
Choose a target type | Instances |
Target Group name | 任意 |
Protocol/Port | HTTP/80 |
VPC | 作成した自分のVPCを選択 |
Protocol version | HTTP1 |
他の項目についてはデフォルトで問題ありません。
ページ下にある「Next」をクリックし、Register targetsページへ遷移します。
VPCに紐づいているEC2インスタンスが2つ表示されているので、どちらか1つだけにチェックを入れ、「Include as pending below」をクリックします。
Review targetsにチェックしたEC2インスタンスが追加されるのを確認後、「Create target group」をクリックし、ターゲットグループの作成を完了させます。
完了後、選択していないもう一つのEC2インスタンス用のターゲットグループの作成を行います。
設定内容は同様になります。
5.ロードバランサーの作成
ターゲットグループの作成ができましたのでロードバランサーの作成を行っていきます。
設定内容は以下になります。
設定項目 | 設定値 |
---|---|
ロードバランサーの種類 | Application Load Balancer |
名前 | 任意 |
スキーム | Internet-facing |
IPアドレスタイプ | IPv4 |
VPC | 作成した自分のVPCを選択 |
マッピングズ | 作成したAZすべてにチェックを入れる サブネット選択欄からそれぞれのサブネットを選択する |
セキュリティグループ | 作成したALB用のセキュリティグループを選択 |
リスナールーティング | 作成したターゲットグループ1つ |
作成後、作成したALBの名前をクリックし、詳細画面へ遷移します。
Listenersに表示されている「HTTP:80」をクリックします。
Listeners detailsにある「Default actions」内に設定したターゲットグループが1つ表示されています。
その下に「Select a target group」と書かれた選択できる欄がありますので、ALB作成時に選択しなかったターゲットグループを追加します。
Weightという項目がどの割合で各ターゲットグループへアクセスを捌くかの比率設定になります。
6.ロードバランサーへ接続する
ALB経由でEC2にアクセスをします。
ALBページから作成したALBの名称をクリックします。
表示された詳細画面にある「DNS name」をコピーします。
ブラウザのアクセス欄にペーストし移動することでEC2インスタンスに設置したindex.htmlの内容が表示されます。
「Routing-test-EC2-01」
「Routing-test-EC2-02」
これで構成が完了しました。
検証
今回は、リスナールールのweightの比率を変更することで、10回EC2へアクセスする際のルーティング挙動を確認します。
AWS Cloudshell上で以下のコマンドを入力します。
for X in `seq 10`; do curl -so -i /dev/null -w "" ALBのDNS name/; done
①「Routing-test-EC2-01」のweightを5、
「Routing-test-EC2-02」のweightを5とした場合
②「Routing-test-EC2-01」のweightを8、
「Routing-test-EC2-02」のweightを2とした場合
③「Routing-test-EC2-01」のweightを1、
「Routing-test-EC2-02」のweightを9とした場合
設定した通りの比率でアクセスが行われていることが確認できました。
まとめ
リスナールールを設定することで、各EC2インスタンスへ偏りのない均等なルーティングや接続させたいインスタンスへのルーティングが可能になることが改めて確認できました。