ec2-schedulerでEC2を定期的に停止してコストを節約しよう

AWS Answerで公開されているec2-schedulerを使ってみました。
EC2の自動起動、停止についてはLambdaを使って色々と工夫されているかと思いますが、このec2-schedulerはかなり高機能なソリューションになっていますのでぜひ利用を検討してもらえればと思います。
aws.amazon.com

ec2-schedulerでできること

構成

以下のような構成で提供されています。
https://d1.awsstatic.com/aws-answers/answers-images/instance-scheduler-architecture.727e008ced5a4b1b656b5c22afb4a2dfc32d7c33.png
デフォルトでは5分毎にLambdaが起動されて特定のタグが付与されているEC2、RDSの自動起動、停止を行っています。

デプロイ方法

以下のリンクからCloudFormationを該当リージョンから実行します。
リージョンごとに設定が必要になります。
Launch CloudFormation

設定方法

DynamoDBのConfigTableに以下のレコードを追加します。
テーブル名はスタック名+ConfigTableになっています。
ex)
月曜から金曜までの9:00 - 20:00(日本時間)の間だけEC2を起動する設定

scheduleレコード
type name description periods timezone
schedule ec2_stopstart ec2 stop start {"weekday_9to20"} Asia/Tokyo
periodレコード
type name description timezone weekdays begintime endtime
period weekday_9to20 Office hours Asia/Tokyo {"mon-fri"} 9:00 20:00

ちなみにconfigレコードはデフォルトタイムゾーンの設定やタグ名の設定など実行時の設定内容を保存しています。

また、レコードの登録については、DynamoDBをコンソールから直接変更してもいいですが、scheduler-cliという専用のCLIも用意されています。
docs.aws.amazon.com

EC2側にタグを付与

対象のEC2に以下のタグを付与します
f:id:cloudfish:20180413090128p:plain

動作確認

正しく設定されていれば、上記の時間以降に対象EC2が停止されます。
f:id:cloudfish:20180412145758p:plain

また、上記の時間設定であれば、9:00になれば対象EC2が起動されています。

注意点

設定した時間にEC2が停止もしくは起動されているわけではないので、例えば必ず9:00から使いたいのであれば、起動時間を考慮して早めに起動しておく必要があります。

このLambda自体のコストとしては、月額約5$程度となります。
起動・停止スケジュールを複数作ることもできますし、クロスアカウントでの実行や実行結果をCloudWatchのカスタムメトリクスに書き込むといったこともできるようです。かなり使いやすいと思うので導入を検討してみてはいかがでしょうか?