この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
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 の数だけインスタンスが起動されます。
上記を行ったら、マネージメントコンソールを開き、インスタンスが起動していることを確認してみましょう。
指定した数分起動していますね。
指定日時にスケールアウトさせる
指定日時にアクションを行うためには、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 と同じ値かそれより大きい値を指定します。
マネージメントコンソールを開いて、指定日時にスケールアウトされることを確認します。
スケールアウトされましたね。
指定日時にスケールインさせる
スケールインについても、スケールアウトとコマンドは同じです。
下記のコマンドで、指定日時に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 と同じ値かそれより小さい値を指定します。
マネージメントコンソールを開いて、指定日時にスケールインされることを確認します。
スケールインされましたね。
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 ではまだサポートしていないようでした。。