読者です 読者をやめる 読者になる 読者になる

Lazuli

らずり

AutoScalingのas-put-scheduled-update-group-actionコマンドが便利すぎる

AWS AutoScaling

AWSには AutoScaling という機能があって、事前に設定したパラメータでEC2インスタンスをスケールアウトすることが出来る。たとえばCPUが60%以上の状態が5分続いたらとか、SQSがいくつ溜まったらとか、を監視してインスタンスを立ち上げられる。負荷分散が容易。

そのAutoScalingにはas-put-scheduled-update-group-actionというコマンドが存在する(コマンド名長い)。あらかじめ指定しておいた時間にAutoSalingGroupの設定を変更することが出来るコマンド。
例えばこんなふうに。

$ as-put-scheduled-update-group-action SampleScheduledAction --auto-scaling-group SampleAutoScalingGroup --region ap-northeast-1 --time '+10 minutes' --end-time '+20 minutes' --max-size 1 --min-size 1

という具合にコマンドを打つと、10分後にSampleAutoSalingGroupのmax-sizeとmin-sizeを1に変更するスケジュールをSampleScheduledActionという名前で保存することが出来る。よって、結果的に10分後にインスタンスが1台立ち上がることになる。オプションの意味は以下の様な感じ。

auto-scaling-group スケジュールで変更させるAutoScalingGroupを指定する
region リージョンの指定
time スケジュールの開始時間を指定する。+10 minutesとすると10分後。UTCでピンポイントの時刻指定も可能
end-time スケジュールの変更をもとに戻す時間。指定方法はtimeオプションと同じ。
max-size AutoScalingで立ち上げるインスタンスの上限数
min-size AutoScalingで立ち上げるインスタンスの下限数

定期実行のrecurrenceオプション

時間指定スケールアウトでお腹いっぱいなのに、さらに定期実行できるrecurrenceオプションというものがあります。cron記法でスケジュールを指定できます。

$ as-put-scheduled-update-group-action SampleScheduledAction --auto-scaling-group SampleAutoScalingGroup --region ap-northeast-1 --recurrence '*/10 18,20-22 * * *' --max-size 1 --min-size 1

まんまcrontabの書き方。18時と20~22時(UTC形式)までの間で10分毎にインスタンスを立ち上げます。素晴らしい。注意点としてはend-timeがcronに対応していないので、インスタンスを落とすのはなんらかの方法を考えないといけないということあたりかね。立ち上げたインスタンス内で、必要な処理が終わったあとにAutoScalingGroupの設定を変えてあげればいいだけだからそんなに面倒でもない。

問題点

スケジュールコマンドすげー便利だよね!!で話が終わるといいんだけど問題点がある。
EC2のインスタンスは、立ち上げから破棄までの所要時間が1時間未満でも1時間分の利用料が取られる。要するにAutoScalingで毎時間インスタンスを立ち上げてタスク処理してたら、普通にインスタンス常時稼動させてるのと料金は変わらないってこと。
マイクロ使うとかリザーブドインスタンスでコスト下げるとかそういうところを対策しないといけないよね。それを踏まえてもAutoScalingは便利だから利用できるシーンは積極的に使っていっていいと思う。