しばらく軽いネタが続くので書くのが楽になるかなと期待しています。
実際どうなのかは知りませんが・・・
###0.ゴール
今回はAWSのロードバランサElastic Load Balancing(ELB)について見ていきます。
設定自体は非常に簡単ですが、ELBで何ができるのか、ELBがどのような挙動をするのかも含めて見ていこうかと思います。
まずは実際にやってみましょう。
--
###1.ELBの作成(マネジメントコンソール編)
ELBの設定はEC2の中にあります。
「ロードバランサ」の作成
このロードバランサのプロトコルで「HTTPS」なんかを指定し、ELBに証明書(X.509)をアップロードすることで、使うことができます。
ロードバランサを設置するサブネットを指定します。
耐障害性、観点から異なるAZに配置されたサブネットを指定する必要があります。
単一のAZにある複数のサブネットを指定するとあとに指定したほうで置換されます。
SGを割り当てます。
注意としてはHTTPやHTTPSなど使うプロトコルのポートが開いているSGをちゃんと割り当てましょう。
当然ですが通信が不通になります。
####ヘルスチェック
ELBにはヘルスチェック機能(EC2への定期的な正常・異常のチェック)が備わっています。
ロードバランサーは、正常なインスタンスのみにトラフィックをルーティングします。インスタンスが異常であると判断した場合、ロードバランサーはそのインスタンスへのトラフィックのルーティングを中止します。
つまり、複数のWEBサーバにトラフィックを振り分けている際にどっかの1台がぶっ壊れた場合、その故障したWEBサーバにはトラフィックを流さなくなります。
ヘルスチェックの設定で設定するものは以下のとおりです。
項目 | 説明 |
---|---|
ping プロトコル | 使用可能(TCP、HTTP、HTTPS、および SSL) |
ping ポート | インスタンスに接続するために使用するポート(ポート範囲: 1 ~ 65535) |
ping パス | HTTP または HTTPS リクエストの送信先。 |
応答タイムアウト | ヘルスチェックからの応答を受け取るまで待つ時間(有効な値: 2 ~ 60) |
HealthCheck 間隔 | 個々のインスタンスのヘルスチェックの間隔(有効な値: 5 ~ 300) |
非正常のしきい値 | この回数失敗すると異常判定される(有効な値: 2 ~ 10) |
正常のしきい値 | この回数成功すると正常判定される(有効な値: 2 ~ 10) |
Pingパスでのチェックでは、ロードバランサーが応答タイムアウト時間内に "200 OK" 以外の応答を受信した場合、インスタンスは異常と見なされます。
DNS名に注目してください。
ELBにはEIPではなくDNSのAレコードが設定されています。
ELBは負荷に応じて自動で増減するため固定のIPを使ったアクセスができません。
この辺がオンプレとは大きな違いになりますかね。
ヘルスチェックの間隔によって異なりますが、少し待つとステータスがInServiceになります。
###2.CLI
####ELBの作成
CLIリファレンス
ELB_NAME='my-sample-elb'
ELB_PROTOCOL='HTTP'
ELB_PORT=80
INSTANCE_PROTOCOL='HTTP'
INSTANCE_PORT=80
AZ=("ap-northeast-1a""ap-northeast-1c")
SUBNET_ID=subnet-********
SG_ID=sg-********
INSTANCE_ID=i-********
aws elb create-load-balancer --load-balancer-name ${ELB_NAME} --listeners "Protocol=${ELB_PROTOCOL},LoadBalancerPort=${ELB_PORT},InstanceProtocol=${INSTANCE_PROTOCOL},InstancePort=${INSTANCE_PORT}" --subnets ${SUBNET_ID} --security-groups ${SG_ID}
aws elb register-instances-with-load-balancer --load-balancer-name ${ELB_NAME} --instances ${INSTANCE_ID}
サブネットIDとセキュリティグループIDはマネジメントコンソールで調べて記載してください。
このようにして調べることもできます。
SUBNET_ID=`aws ec2 describe-subnets | jq -r '.Subnets[].SubnetId'`
#####デフォルトVPCのみの場合での取得です
ちなみに、先日Macをクリーンインストールしたのでこれやるときに’jq’入ってなくて
ああ〜入れるかーと思い
brew install jq
をやったらそんなサイトねぇよボケ!とか怒られて( ;´Д`)ふぁっ!?
ってなりましたが普通に brew update
したらインストールできました。
####ELBの削除
aws elb delete-load-balancer --load-balancer-name ${ELB_NAME}
###3.おわり
以上でEC2をELBにぶら下げることができました。
どうだったでしょうか。
今回は片側のAZに1台のインスタンスしかない状態で試しましたが、数台のインスタンスをぶら下げて、その中の1台のApacheを落としたりするとチェックの間隔でちゃんとそのインスタンスへ振り分けをしないでくれます。
また、デフォルトのページの内容を1台づつ変えておくとF5を押した際にちょくちょく違うインスタンスにつなぎに行っていることもわかるかと思います。
今回は説明しませんが、「スティッキーセッション」を有効にするとこで特定のインスタンスとの通信を持続させることもできます。