Hatena::ブログ(Diary)

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

2010/03/06 (Sat)

[][] Amazon EC2 Auto Scaling をもう少し詳しく見てみた  Amazon EC2 Auto Scaling をもう少し詳しく見てみたを含むブックマーク

以前、Auto Scaling について触ってみた内容は以下のエントリーで書いた。

Amazon EC2 新機能 Monitoring, Auto Scaling and Elastic Load Balancing を一通り触ってみた - つれづれなる・・・

それ以降、実際に使ってみて、正しくない部分に気づいたので、前のエントリーの修正をしつつ追加で分かったことを含めて書いておく。

Auto Scaling の設定手順をまとめてみる

Auto Scaling の設定はいくつかの設定を依存させて動作させているので、その整理を行う。

設定すべき内容は以下3つになる。

  1. launch-config
  2. auto-scaling-group
  3. trigger

順番に設定する必要があり、依存関係は launch-config > auto-scaling-group > trigger となっている。

それぞれについて解説する。

launch-config

自動的にインスタンスが起動する際に必要な項目を設定する

as-create-launch-config TEST-CONFIG --image-id ami-89e809e0 --key temp-key --group Web-group --instance-type m1.small
auto-scaling-group

起動したインスタンスを動作させるための全般的な設定

  • 設定する項目
    • AutoScalingGroupName: 名前
    • availability-zones: インスタンスをどの availability-zones で起動させるか
    • launch-configuration: 適用させる launch-configuration 名
    • min-size: 起動させるインスタンスの最小数。0以上で max と同じもしくは小さい値にすること。
    • max-size: 起動させるインスタンスの最大数。10000より小さくて min と同じもしくは大きい値にすること。
    • load-balancers: 起動したインスタンスを load balancer 配下に追加する。このオプションを付けない場合は load balancer 配下に入らずに起動される
  • 作成するコマンドは、as-create-auto-scaling-group
  • 例:
as-create-auto-scaling-group test-group1 --launch-configuration 1test --availability-zones us-east-1a --min-size 0 --max-size 2 --load-balancers Web-LB
    • AutoScalingGroupName: test-group1
    • availability-zones: us-east-1a
    • launch-configuration: 1test
    • min-size: 0
    • max-size: 2
    • load-balancers: Web-LB
trigger

auto-scaling-groupを発動させるしきい値の設定。(ちょっと分かりづらい。いまいち把握しきれていない。)

as-create-or-update-trigger WebApp-trigger1 --auto-scaling-group WebApp-group1 --measure CPUUtilization --statistic Average --dimensions "AutoScalingGroupName=WebApp-group1" --period 60 --lower-threshold 20 --upper-threshold 95 --lower-breach-increment=-1 --upper-breach-increment 1 --breach-duration 180
    • TriggerName: WebApp-trigger1
    • auto-scaling-group: WebApp-group1
    • measure: CPUUtilization
    • statistic: Average
    • dimensions: "AutoScalingGroupName=WebApp-group1"
    • period: 60
    • lower-threshold: 20
    • upper-threshold: 95
    • lower-breach-increment: -1
    • upper-breach-increment: 1
    • breach-duration: 180

Auto Scaling で自動で増えたインスタンスを Elastic Load Balancing 配下に追加できた

オプションの見落としだったわけですが、以前は自動的に増えたインスタンスは Elastic Load Balancing 配下に自動的に追加されないと思っていたが、ちゃんと追加できるオプションがあった。Load Balancer 配下に自動的に追加されなければオートスケーリング意味無いじゃんと思っていたけど、さすがアマゾン、ちゃんとサポートしていた。

オプションは、as-create-auto-scaling-group コマンドにある。ヘルプを見てみると、

SYNOPSIS
   as-create-auto-scaling-group
        AutoScalingGroupName  --availability-zones  value[,value...]
        --launch-configuration  value  --max-size  value  --min-size  value
       [--cooldown  value ] [--load-balancers  value[,value...] ]
        [General Options]

(snip)
SPECIFIC OPTIONS
   --cooldown VALUE
       Time (in seconds) between a successful scaling activity and succeeding
       scaling activity.

   -l, --launch-configuration VALUE
       Name of existing launch configuration to use to launch new instances.
       Required.

   --load-balancers VALUE1,VALUE2,VALUE3...
       List of existing load balancers. Load balancers must exist in Elastic
       Load Balancing service, within the scope of the caller's AWS account.

「--load-balancers」というのがあり、Load Balancer 名を書くことでその配下に追加されることが可能になる。事前に Load Balancer は作成してあることが必要。


決して落ちないインスタンスを作ることができる

min-size 1以上であれば動作させることが可能。

例えば、min-size 1 にした場合、

  • 意味としては「必ず1台立ち上がっている=決して落ちない」状況を作ることができる
  • Webサーバみたいな必ず立ち上がっていて欲しい時には --min-size 1 にしておくと良い
    • この時は --load-balancers オプションを忘れずに。事前にWeb用ロードバランサを作成しておくこと
    • Web用ロードバランサの FQDNDNS で CNAME して、www.example.com とかと紐付けて置くこと前提
  • この設定をした途端に自動的にインスタンスが立ち上がる。後述の trigger がなくても動作する
  • 手動で立ち上がっているインスタンスを terminate して、0台の状態にしても自動的に起動してくる
決して落ちない状況で起動インスタンス数を0にしたい場合
as-terminate-instance-in-auto-scaling-group i-f7e9859f --decrement-desired-capacity

実際 Auto Scaling がちゃんと動くかどうか試してみる

設定する

以下の順にコマンドを実行

$ as-create-launch-config TEST-CONFIG -i ami-654ea20c -t m1.small --group default,SSH,Web --key temp-key
$ as-create-auto-scaling-group test-group1 --launch-configuration TEST-CONFIG -z us-east-1a,us-east-1b,us-east-1c,us-east-1d --min-size 1 --max-size 10 --load-balancers web-front

このコマンド入力した時点で、min-size 1 が有効になって1台インスタンスが起動した。

$ as-create-or-update-trigger WebApp-trigger1 --auto-scaling-group test-group1 --measure CPUUtilization --statistic Average --namespace "AWS/EC2" --dimensions "AutoScalingGroupName=test-group1" --period 60 --lower-threshold 20 --upper-threshold 95 --lower-breach-increment=-1 --upper-breach-increment 1 --breach-duration 180

設定完了。

実際CPUを回してオートスケーリングするかどうか確認してみる

1台起動したインスタンス内で stress コマンドを実施する。(事前にstressをインストールして利用可能な状況にしてある前提)

実行コマンドは以下

# stress -c 1 --timeout 360s
    • 起動しているのはスモールインスタンスCPUは1つなので、Load Average 1 を狙えばCPU利用率は100%になるだろう
    • timeout 360s にしているのは、180sec でオートスケーリングされるはずなので、起動時間考慮して若干長めにとった

AWS Management Console にて確認する。

ちゃんと動いた。



Auto Scaling を使いこなせれば、運用の手間を省くことが出来そうな設定内容になっている。ただし、あくまでサーバの起動・停止をオートスケーリングで行うだけなので、内部のアプリケーション整合性はユーザ側で事前にとっておく必要がある。

例えば、立ち上げるAMI自動起動プロセスが起動する状態で保存しておかなくてはいけないし、Load Balancer 配下に追加した場合、単純なラウンドロビンで分散するので、セッション維持など複数台構成をとっても問題が生じないようにしておく必要もある。

そういう意味ではユーザ側で事前の準備や検証が必要で、その後の運用状況もチェックするようにしておかないと実サービス運用は難しいだろう。

リンク元