複数台の EC2 を用意できましたので、ALB を使ってロードバランシングをしてみましょう。
目次
AWS 基礎入門チュートリアルについて
このページは AWS 基礎入門チュートリアル の一部です。 AWS チュートリアル全体は AWS 基礎入門チュートリアル を参照してください。
AWS で ロードバランシングをどうやって実現するか
AWS で ロードバランシングをどうやって実現するかですが、下記のようにいくつかの方法があります。
- ELB (Elastic Load Balancing) の ALB (Application Load Balancer) を使う。
- ELB の NLB (Network Load Balancer) を使う。
- ELB の CLB (Classic Load Balancer) を使う。
- Route53 のヘルスチェック機能を使う。
それぞれ思想の違いやメリット・デメリットはあるのですが、 今回は細かいことは置いといて ALB を使うことにしましょう。
左メニューからロードバランサーを選択
「AWS コンソール > EC2」で、左メニューに下記のロードバランサーの項目がありますのでクリックしてください。
ロードバランサー管理画面
すると下記のような画面が表示されるはずです。 ロードバランサーを作成していないため、ロードバランサーがない、と出ています。
では早速「ロードバランサーの作成」ボタンを押下してください。
ロードバランサーの種類の選択
ALB・NLB・CLB の選択をします。ここでは ALB の「作成」ボタンを押します。
ロードバランサーの設定
下記のようなロードバランサーの設定画面が表示されます。
下記のように「名前」に「myalb」と入力します。abc でも hoge でも何でもよいのですが、 後から変更はできないのでわかりやすい名前をおすすめします。その他は変更不要です。
アベイラビリティゾーンの設定
ALB を配置するアベイラビリティゾーンを決めます。
作成済みの 2台の EC2 のアベイラビリティゾーンを確認してください。 当ページ管理人の環境では us-east-2b と us-east-2c でしたので、 us-east-2b と us-east-2c にチェックを入れます。 最低 2つのアベイラビリティゾーンにチェックを入れる必要があります。
アベイラビリティゾーンを設定したら、右下にある「次の手順: セキュリティ設定の構成」ボタンを押下します。
セキュリティ構成の設定
HTTPS を使いましょう、と言われていますが今回は HTTP のみを対象としますので無視します。
右下の「次の手順: セキュリティグループの設定」ボタンを押して次に進みます。
セキュリティグループの設定
下記のようなセキュリティグループ設定画面が表示されます。 デフォルトでは「既存のセキュリティグループを選択する」となっています。 既存のセキュリティグループとして下記があります。
- launch-wizard-1: 2台の EC2 インスタンスにて使用 (HTTP と SSH ポートを開放)
- rds-launch-wizard: RDS インスタンスにて使用 (MySQL ポート開放)
launch-wizard-1 を使っても動きはするのですが、管理上わかりづらくなるので 下記のように「新しいセキュリティグループを作成する」にチェックをしましょう。 自動的に
- セキュリティグループ名: load-balancer-wizard-1
- ルール: TCP ポート80 について開放
という初期値が設定されます。
この初期値で問題ないので、「次の手順: ルーティングの設定」ボタンを押してください。
ルーティングの設定
下記のようにルーティングの設定画面が表示されます。
下記のようにターゲットグループの「名前」に “mytargetgroup” などと入力してください。 その他は初期値で問題ありません。
「次の手順: ターゲットの登録」ボタンを押してください。
ターゲットの設定
下記のようにターゲットの登録画面が表示されます。 初期状態では「登録済みターゲット」が空ですので、 下にある「インスタンス」からターゲットグループに登録したいインスタンスを選択します。
下記のように 2台の EC2 インスタンスにチェックを入れ、「登録済みに追加」ボタンを押します。
そうすると、「登録済みターゲット」に 2台のインスタンスが追加されました。
右下にある「次の手順: 確認」を押してください。
確認
確認画面です。問題なければ「作成」ボタンを押します。
作成指示完了
数秒で下記の「作成完了」画面が表示されます。 しかしながら例によってこれで本当に完了したわけではなく、 裏側で必要な登録作業が行われています。 「閉じる」ボタンを押してください。
作成中
ロードバランサー一覧画面に遷移します。状態が「provisioning」となっていますので、 まだ準備中であることがわかります。自動リロードはされないので、リロードボタンを押して最新情報に更新してください。 おおむね 5分程度かかるようです。
作成完了
しばらく待つと下記のように状態が「active」になります。これで本当の作成完了です。 画面下の詳細画面に「DNS名: myalb-462806750.us-east-2.elb.amazonaws.com」とあります。 これが今回 ALB に割り当てられた FQDN となります。
左メニューからターゲットグループへ
念のための確認として、左メニューから下記の「ターゲットグループ」を選択してください。
ターゲットグループ確認
下記のようにターゲットグループの情報が表示されます。 画面下部の「ターゲット」タブをクリックして、下記を確認してください。
- 登録済みターゲット欄にて、インスタンスのステータスが「healthy」になっていること
- アベイラビリティゾーン欄にて、「正常?」が「はい」になっていること
上記のようになっていないなら何かがおかしいとなります。 EC2 は起動しているか、EC2 のセキュリティグループは、選択したアベイラビリティゾーンに間違いはないかを確認してください。
例えば EC2 を停止した状態だと、下記のように「ステータス」欄が “unused”、 「正常?」欄が「いいえ (アベイラビリティゾーンに正常なターゲットがありません)」となります。
動作確認
動作確認をしてみましょう。
EC2 に直接アクセスする場合は、ブラウザで下記にアクセスしていました。
- http://[EC2のパブリックIPアドレス]/minitwitter-rds.php
ALB 経由の場合、下記になります。
- http://[ALBのDNS名]/minitwitter-rds.php
当ページ管理人の場合、http://myalb-462806750.us-east-2.elb.amazonaws.com/minitwitter-rds.php です (常につながる保証はありません)。
何度かブラウザのリロードボタンを押すと、下記のように SERVER_ADDR の IP アドレスが変わると思います。 これは EC2 のプライベート IP アドレスを表示しているものなので、どちらに振り分けられたかを判別できます。
さらに、EC2 インスタンスを 1台落としてみましょう。 下記のように「AWS コンソール > EC2 > インスタンス」より、web-01 と web-02 のいずれかを右クリックして、 「インスタンスの状態 > 停止」としてください。
停止には少し時間がかかりますので、その間
- http://[ALBのDNS名]/minitwitter-rds.php
をリロードし続けると、停止直後は数十秒ほど待たされることがあると思いますが、 ALB が EC2 のダウンを認識した後は、生きているもう片方の EC2 インスタンスにアクセスが振り分けられます。 こうなると何度リロードしても SERVER_ADDR が全く変わらないことを確認してください。
インスタンスの後始末について
これで負荷分散・フェイルオーバー編は終了です。
起動したインスタンスについてどうすればよいか下記に述べます。 EC2 1台は 12ヶ月無料枠に含まれます。 ALB は、ほとんどの場合 12ヶ月無料枠に含まれますので、そのまま放置しても構いません。 EC2 2台目を起動し続けると 12ヶ月無料対象からあふれてしまいます。 RDS は 12ヶ月無料枠に含まれます。 EBS は 30GB/月 無料ですので、8GB AMI を作成する際、実は EBS スナップショットというものが自動的に作成されているのですが、 これは 1GB/月 無料です。ここが微妙なところで、画面上では 8GB となっていても、 ディスク内で実際に使用している分しか請求されません。しかし、実使用量は画面では確認できません。 当ページ管理人の場合、1GB/月 を若干超えるかもしれない、という状況です。 ただ、1ヶ月あたり 0.05USD/月 ですので、若干超えたとしても 1〜2円程度の請求かなと思っています。
再度 ALB でいろいろ試したいなら下記をおすすめします。 ただし、(*) の部分が微妙にはみでるかもしれません。
- ALB はそのまま
- EC2 の1台目はそのまま
- EC2 の2台目は停止
- RDS はそのまま
- AMI はそのまま
- EC2 1台目の EBS はそのまま
- EC2 2台目の EBS はそのまま
- EBS スナップショットはそのまま (*)
絶対に請求を発生させたくない場合は下記を実施してください。 この状態でも、後続のチュートリアルを進めることができます。
- ALB は削除
- EC2 の1台目はそのまま (EBS もそのまま)
- EC2 の2台目は削除 (EBS も同時に削除されます)
- RDS はそのまま
- AMI は削除 (AMI を削除しないと、EBS スナップショットを削除できない)
- EBS スナップショットを削除
次に、高速化の前段として、サンプルアプリケーション mini Twitter にフォロー機能追加 を行います。