[AWS] Auto Scaling Based on a Schedule

2013.07.31

AutoScaling は時間が掛かる?

Auto Scaling はポーリングで動くため、実際にスケールされるまで時間が掛かります。
また、CloudWatch を組み合わせたり、ELB を使っている場合、データ収集やヘルスチェックについてもポーリングで動くため、実際にアクセス可能になるまで時間が掛かってしまいます。

事前に予測できる負荷の場合、Auto Scaling では、予めスケジュールを指定して負荷に対応することができます。
※過去にほぼ同じ内容のエントリがありますが、今回 aws cli 版で試したので執筆することにしました。。
https://dev.classmethod.jp/cloud/auto-scaling-schedule/

手順

前提

以下が事前に設定済みとします。

  • AWS Command Line Interface(http://aws.amazon.com/jp/cli/)のインストール
  • アクセスキーとシークレットアクセスキー、及びリージョンが環境変数の指定
  • スケール時に起動する元の AMI の作成

LaunchConfiguration と AutoScalingGroup の作成

下記を実行し、Launch Configuration を作成します。

$ aws autoscaling create-launch-configuration \
--launch-configuration-name my-test-lc \
--image-id ami-8bce5cb1 \
--instance-type t1.micro \
--key-name scale-test-key

--image-idに AMI の ID を指定します。

次に、上記の Launch Configuration を指定して、AutoScalingGroup を作成します。

$ aws autoscaling create-auto-scaling-group \
--auto-scaling-group-name my-test-asg \
--launch-configuration-name my-test-lc \
--min-size 2 \
--max-size 2 \
--desired-capacity 2 \
--availability-zones "ap-northeast-1a" "ap-northeast-1b" 
--tags '{ "key": "Name", "value": "scale test"}' 

実行すると、--desired-capacity の数だけインスタンスが起動されます。

上記を行ったら、マネージメントコンソールを開き、インスタンスが起動していることを確認してみましょう。

130730-0001

指定した数分起動していますね。

指定日時にスケールアウトさせる

指定日時にアクションを行うためには、put-scheduled-update-group-action コマンドを使用します。
日時の指定 start_time は、 UTC/GMT で指定します。
下記のコマンドは、指定日時に3台にスケールアウトさせます。

$ aws autoscaling put-scheduled-update-group-action \
--auto-scaling-group-name my-test-asg \
--scheduled-action-name ScaleOut \
--start-time "2013-07-30T09:00:00Z" \
--desired-capacity 3 \
--max-size 3

--max-size には、--desired-capacity と同じ値かそれより大きい値を指定します。

マネージメントコンソールを開いて、指定日時にスケールアウトされることを確認します。

130730-0002

スケールアウトされましたね。

指定日時にスケールインさせる

スケールインについても、スケールアウトとコマンドは同じです。
下記のコマンドで、指定日時に1台にスケールインさせます。

$ aws autoscaling put-scheduled-update-group-action \
--auto-scaling-group-name my-test-asg \
--scheduled-action-name ScaleIn \
--start-time "2013-07-30T11:00:00Z" \
--desired-capacity 1 \
--min-size 1
--max-size 2

--min-size には、--desired-capacity と同じ値かそれより小さい値を指定します。

マネージメントコンソールを開いて、指定日時にスケールインされることを確認します。

130730-0003

130730-0004

スケールインされましたね。

cron 形式でも記述可能

ちなみに、上記のスケジュールのアクションは以下のように --recurrence オプションを使って、cron形式でも指定可能です。

$ aws autoscaling put-scheduled-update-group-action \
--auto-scaling-group-name my-test-asg \
--scheduled-action-name ScaleIn \
--recurrence “30 0 1 1,6,12 0”\
--desired-capacity 1 \
--min-size 1

後片付け

update-auto-scaling-group--min-size--max-size を 0 にして、インスタンスを落とします。

$ aws autoscaling update-auto-scaling-group \
--auto-scaling-group-name my-test-asg \
--min-size 0 \
--max-size 0 

describe-auto-scaling-instances で、起動しているインスタンスを確認し、結果がなくなるまで実行します。

$ aws autoscaling describe-auto-scaling-instances
[]

紐づくインスタンスがすべて Terminate されたら、AutoScalingGroup を削除します。

$ aws autoscaling delete-auto-scaling-group \
--auto-scaling-group-name my-test-asg 

最後に LaunchConfiguration を削除します。

$ aws autoscaling delete-launch-configuration \
--launch-configuration-name my-test-lc

まとめ

テレビ紹介などで事前にアクセス増加が分かってる場合は、スケジューリングによって対応した方が望ましいですね。
スケーリングには時間がかかるので、それを加味してスケジューリングすることが重要です。
ちなみに、CloudFormation ではまだサポートしていないようでした。。