AWSのELB(ALB)を使用した冗長化を実現する
はじめに
前回の記事でtodoアプリを作成しました。
このアプリケーションにALBを追加してみました。
※以下は構築後の冗長構成のイメージです。
※AMIなどを使用し、各AZにEC2(WebサーバーとAPサーバー)を用意した状態で進めていきます。
※それぞれのWebサーバーに以下のテストページを用意します。ALBによってそれぞれのページが負荷分散により表示されればOKとします。
1. ターゲットグループの作成
ALBの実装にあたりターゲットグループの作成を行います。
※ターゲットグループ : ロードバランシングの対象となるリソース(EC2インスタンスなど)をグループ化し、それらのリソースへのトラフィックを効率的に分散させるための仕組み
ターゲットグループの作成に進む
- 基本的な設定
- ターゲットグループ名 : test-tg
- プロトコル : HTTP
- ポート : 80番
- IPアドレスタイプ : IPv4
- VPC : Webサーバーと同じ
- プロトコルバージョン : HTTP1
- ヘルスチェック
- ヘルスチェックプロトコル : HTTP
- ヘルスチェックパス : /
- ターゲットを登録
- 対象のEC2インスタンスを選択し、保留中として以下を含めるをクリック
- 選択したインスタンスのポート : 80
(補足)
プロトコルバージョン(HTTP1,HTTP2,gRPC)とは
→HTTPにもバージョンがあり、そのバージョンを選ぶ必要がある。HTTP1では、ウェブサーバーに対して原則1つずつしかリクエストを送ることができない。HTTP2は、HTTP1を効率化した新しいバージョンで複数のリクエストを並行送信(多重化)できる。gRPCはGoogleが開発したRPCフレームワークで、APIの導入などに効果的。(gRPCはHTTP2上で動作する)
ヘルスチェックとは
→ターゲット(EC2インスタンスやコンテナなど)が正常に動作しているかを、ALBが定期的に確認する機能。ターゲットに異常が発生してサーバーとして機能しなくなった場合は、そのターゲットは「Unhealthy(異常)」と判定され、トラフィックの振り分け対象から除外される。ヘルスチェックの失敗回数や間隔(interval)、タイムアウトなどはALBで設定可能。
また、ターゲットがちゃんと動いているかどうかを判断するために、定期的にそのターゲットの特定のURLにアクセスを行うが、このとき指定するパスがヘルスチェックパスとなる。URLに特に制限はないが、URL(パス)が実際に存在する必要必要がある。
2. ロードバランサーの作成
続いてALBを作成します。
ロードバランサーの作成をクリック、ALB作成に進みます。
- 基本的な設定
- ロードバランサー名 : test-alb
- スキーム : インターネット向け
- ロードバランサーのIPアドレスタイプ : インターネット向け
- ネットワークマッピング
- VPC : ターゲットグループと同じ
- IPAMプール : 設定しない
- アベイラビリティゾーンとサブネット : それぞれのwebサーバーのサブネットを選択
- セキュリティグループ
- http:0.0.0.0
- リスナーとルーティング
- プロトコル : HTTP
- ポート : 80
- デフォルトアクション : test-tg(作成済みのターゲットグループ)
※WAFなどその他サービスとは統合しない
※作成完了までに時間がかかる
(補足)
IPプールとは
→ALBが動作する際に使用するIPアドレスの集合。これらのIPアドレスは、AWSのIPアドレスレンジ(プール)からランダムに選ばれる。その中で、IPAMプールとはIPアドレスの予約済みの範囲(CIDRブロック) のことで、これを使うことでIPアドレス管理を自動化・一元管理できる。つまり、IPAMで事前に定義されたプールから、使えるIP範囲(CIDR)を自動で割り当てて管理できるようになっている。
※IPAM=AWSのIP Address Manager機能
リスナーとは
→ALBが「どのポート・プロトコル」でリクエストを受け付けるかを決める窓口のようなもの。リスナーは「ただ受け取る」だけでなく、「どんな条件でどこに振り分けるか」というルールも定義できる。
3.動作確認
ALBの作成が完了したらDNS名が割り当てられるので、そこにhttp接続し負荷分散が行われているか確認します。
ページを更新すると表示が切り替わるので無事に負荷分散できているようです。
さいごに
無事にALBを構築する事ができました。ちゃんとした環境では、ここに独自ドメインを組み合わせたり、SSL証明書を適用したりといった作業が必要になると思いますが、今後の記事で実践してみようと思います。
Discussion