Hatena::ブログ(Diary)

つれづれなる・・・ RSSフィード Twitter

2009/05/25 (Mon)

[][] Amazon EC2 新機能 Monitoring, Auto Scaling and Elastic Load Balancing を一通り触ってみた  Amazon EC2 新機能 Monitoring, Auto Scaling and Elastic Load Balancing を一通り触ってみたを含むブックマーク

5/18に Amazon AWS から発表になった Amazon EC2 の新機能は Auto Scaling や Load Blanacing など、今までユーザ側でなんとかしていた or 提供事業者が飯の種にしていた部分に Amazonカバーしてしまった。と言う点で結構注目が集まっていた。

細かな点はさておき、ひとまず触ってみないことにはどこまでカバーされているかも分からないので触ってみた。以下、触ってみたときのメモ

事前情報

設定の仕方やコマンドはそれぞれのページを参考にした。

3機能概要
  • CloudWatch は instance と Elastic Load Balancer 両方のモニタリングが行える
  • Auto Scaling が動作するためには、CloudWatch が instance 上で有効になっていることが条件
  • Elastic Load Balancing は起動している instance を指定して分散対象に加えることができる
  • beta版ということで、すべてコマンドラインでの操作方法しか提供されていない
    • Elasticfox 上だと今回の機能に対する情報は見えない

動作環境

事前準備

CloudWatch を触る

事前準備

README.TXT をみつつ

 export AWS_CLOUDWATCH_HOME=~/Dropbox/AmazonAWS/CloudWatch
 export PATH=$PATH:$AWS_CLOUDWATCH_HOME/bin
 export AWS_CREDENTIAL_FILE=$AWS_CLOUDWATCH_HOME/credential-file
  • 以下の記述があらかじめ入っていること
 export EC2_PRIVATE_KEY=$EC2_HOME/pk-****.pem
 export EC2_CERT=$EC2_HOME/cert-****.pem
  • 確認 mon-** コマンドが実行できるようになっていること
動かしてみる
 $ ec2-monitor-instances i-***

を実行する

EC2 instance 用
CPUUtilization
DiskReadBytes
DiskReadOps
DiskWriteBytes
DiskWriteOps
NetworkIn
NetworkOut
Elastic Load Balancer 用
HealthyHostCount
Latency
RequestCount
UnHealthyHostCount

コマンドヘルプをみると、

$ mon-get-stats -help

SYNOPSIS
   mon-get-stats
        MeasureName  --statistics  value[,value...] [--dimensions 
       "key1=value1,key2=value2..." ] [--end-time  value ] [--namespace  value 
]
       [--period  value ] [--start-time  value ] [--unit  value ]
        [General Options]

何が必須なのかが分かりづらいのと、key とか value に何を入れるかが説明不足。。。

  • instance の CPU utilization をみるコマンド
    • --start-time, --end-time, --namespace を設定しないとエラーが出ずに何も出力されなかった
    • 日本時間で見たいときは +09:00 を加えれば OK
$ mon-get-stats CPUUtilization --start-time 2009-05-22T15:00:00+09:00 --end-time 2009-05-22T15:30:00+09:00 --period 60 --statistics "Average,Minimum,Maximum" --namespace "AWS/EC2" --dimensions "InstanceId=i-1183c678"
2009-05-22 06:00:00  1.0  0     0.0   4.9E-324  Percent
2009-05-22 06:01:00  1.0  0.38  0.38  0.38      Percent
2009-05-22 06:02:00  1.0  0     0.0   4.9E-324  Percent
  • Elastic Load Balancer の RequestCount をみるコマンド
$ mon-get-stats RequestCount --namespace "AWS/ELB" --statistics "Average,Minimum,Maximum" --start-time 2009-05-25T12:00:00+09:00 --end-time 2009-05-25T13:30:00+09:00 
2009-05-25 03:00:00  3.0  1  1.0  1.0  Count
2009-05-25 03:01:00  3.0  1  1.0  1.0  Count
2009-05-25 03:02:00  6.0  1  1.0  1.0  Count
2009-05-25 04:05:00  3.0  1  1.0  1.0  Count

出力結果の数値はこの場合 Samples, Average, Minimum, Maximum のようだ

auto scaling を触る

準備
  • CloudWatch の時と同じ
  • auto scaling API tools をダウンロードして、.bash_profile で PATH 指定
動かしてみる
  • 1) as-create-launch-config : スケールアウトする時(増やす際)にどの AMI を増やして行くのかあらかじめ指定する
  • 2) as-create-auto-scaling-group : 先に設定した launch-configgroup に設定する
    • --availablitity-zone と --min-size/--max-size は必須
    • min-size は最小構成 instance 数、max-size は最大構成 instance 数
    • 1test という launch-config を使って、最小0/最大2 instance の test-group1 を作成する場合
$ as-create-auto-scaling-group test-group1 --launch-configuration 1test --availability-zones us-east-1a --min-size 0 --max-size 2
  • 3) as-create-or-update-trigger : auto-scaling-group に対する閾値設定
    • test-group1 という auto-scaling group を使って、CPU利用率の平均で 20%以下 になった際にインスタンスを減らす、80% 以上になった時にインスタンスを増やす、120秒状態が継続した場合に発動する test-trigger2 という閾値を設定する場合
$ as-create-or-update-trigger test-trigger2 --auto-scaling-group test-group1 --namespace "AWS/EC2" --measure CPUUtilization --statistic Average --dimensions "AutoScalingGroupName=test-group01" --period 60 --lower-threshold 20 --lower-breach-increment=-1 --upper-breach-increment 1 --upper-threshold 80 --breach-duration 120
  • 応用編 : auto-scaling group で min-size 1 にした場合
    • group 内のすべての instance を terminated したら、自動的に 1 instance が起動する
    • この時は launch-config で指定した AMI が起動する
    • すべて落ちても自動的に立ち上げてくれるので、webフロントや front proxy 的な動きをするものになどに使えそう
    • 手動ですべて落としたいときは
$ as-terminate-instance-in-auto-scaling-group i-**** --decrement-desired-capacity

を実行すると指定したサイズに関係なく落ちてくれるので、自動起動はなくなる

load blancer を触る

準備
  • CloudWatch の時と同じ
  • Elastic Load Balancing API Tools をダウンロードして、.bash_profile で PATH 指定
動かしてみる
  • コマンドは elb-** という形式
  • 1) elb-create-lb : Load Balancer を作るコマンド
    • elb-create-lb -help をみる
SYNOPSIS
   elb-create-lb
        LoadBalancerName  --availability-zones  value[,value...]  --listener 
       "protocol=value, lb-port=value, instance-port=value" [ --listener
       "protocol=value, lb-port=value, instance-port=value" ...]
        [General Options]
$ elb-create-lb test-lb4 --availability-zones us-east-1a --listener "lb-port=80,instance-port=80,protocol=http"
DNS-NAME  test-lb4-1200388198.us-east-1.elb.amazonaws.com
$ host test-lb4-1200388198.us-east-1.elb.amazonaws.com
test-lb4-1200388198.us-east-1.elb.amazonaws.com has address 174.129.197.180

確かにグローバルアドレスが振られている

  • 2) elb-register-instances-with-lb : 作った ELB に instance を登録する
    • すでにinstance name が分かっている(起動している)こと
    • 先ほど設定した test-lb4 という Load Balancer に3つの instance を登録する
$ elb-register-instances-with-lb test-lb4 --instances i-fb155392,i-ff155396,i-f315539a
INSTANCE-ID  i-fb155392
INSTANCE-ID  i-ff155396
INSTANCE-ID  i-f315539a
  • 3) Load Balancer は分散対象となる instance の health check を行っているので、確認
    • Load Balancer 名 test-lb4 での health check 結果
$ elb-describe-instance-health test-lb4
INSTANCE-ID  i-fb155392  InService
INSTANCE-ID  i-ff155396  InService
INSTANCE-ID  i-f315539a  InService
    • instance が生きていれば InService、死んでいれば OutService となる
    • instance を登録した時点で、デフォルトで何がしかのチェックが行われている。設定内容は不明
  • 4) さらにオリジナルの health check設定を入れてみる
    • Load Balancer test-lb4 にて登録した instance に対して TCP 80 番ポートのチェック、interval 5sec(これが最小値)、timeout 3sec、死活の閾値 2回続いた時
$ elb-configure-healthcheck test-lb4 --target "TCP:80" --interval 5 --timeout 3 --unhealthy-threshold 2 --healthy-threshold 2
HEALTH-CHECK  TCP:80  5  3  2  2

$ elb-describe-instance-health test-lb4
INSTANCE-ID  i-fb155392  InService
INSTANCE-ID  i-ff155396  InService
INSTANCE-ID  i-f315539a  InService

これにて確認終了。

ちょっとはまったこと
気になったこと
  • 直接 instance に割り当てられた FQDNブラウザからアクセスしてもみれる
  • Load Balancer に割り当てられた FQDNブラウザからアクセスしてもみれる
  • instance のデフォルトゲートウエイが変わっていないことから、Load Balancer の動作は route 方式でなくて、おそらく NAT 方式なのだろう

全体通して分かったこと

( Amazon EC2 Auto Scaling をもう少し詳しく見てみた - つれづれなる・・・より、正しくない部分を修正)

auto scaling と Load Balancer の連携今のところできてないようだ 可能
  • 自動的に auto scaling から Load Balancer へ instance-ID 情報を渡すコマンドなりは見つけられなかった --load-balancers オプションを用いる
  • Load Balancer の分散対象を設定するときはあらかじめ起動してある instance-ID を指定するので、auto scaling が立ち上げた instance-ID は手動で設定する必要がある
  • Load Balancer 配下への追加は手動になるので、Load Balancer を使うケースは auto scale のメリットが発揮できない
  • これができると webフロントエンドの負荷分散を自動的にできて、auto scaling のメリットがでるが今回の機能追加ではカバーできていない
  • 今回の機能追加 auto scaling は instance が落ちてしまった際、自動的に起動できる対障害性のアップにはなりそう
Amazon EC2 が制御できる範囲はあくまでネットワーク〜電源 ON/OFF まで
リンク元