定期的に EC2 インスタンスを停止・起動する仕組みの CloudFormation テンプレート

2017.01.30

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

RDS 対応バージョンをリリースしました。詳しくは下記エントリをご参照ください。

定期的に EC2・RDS インスタンスを停止・起動する仕組みの CloudFormation テンプレート

こんにちは、藤本です。

先日、コスト削減を目的にステージング環境の EC2 インスタンスを夜間・土日に停止したいという要望があったので、CloudWatch Events と AWS Lambda を使って、定期的に EC2 インスタンスを停止、起動する仕組みを作りました。当ブログでも、その他ブログでもよく紹介されていますので、ソースコードの説明は省きます。今回はその仕組みをどの環境でも簡単にデプロイできるように CloudFormation テンプレート化しました。

仕組み

起動/停止それぞれの CloudWatch Events により、指定したcron形式の日時で Lambda が実行され、特定のタグが設定されたインスタンスが起動/停止されます。

自動停止起動

ご利用は自己責任でお願いします。特にリトライ処理が実装されていないため、本番環境でのご利用はお控えください。

手順

  • CloudFormation からデプロイする
  • 対象となる EC2 インスタンスへタグを設定する

CloudFormation からデプロイする

下のボタンから CloudFormation の画面へ遷移します。

EC2 State Scheduler を起動

必要に応じて、リージョンを変更してください。

CloudFormation テンプレートは URL が入力されていますので、そのまま「Next」をクリックします。

Create_A_New_Stack

パラメータを設定します。

Create_A_New_Stack 2

デフォルト設定の場合、ec2-state-scheduler:Trueのタグが設定された EC2インスタンスを日本時間の月〜金の24時に停止し、月〜金の6時に起動します。平日の6時〜24時のみ起動している、ということになります。

パラメータ名 説明 デフォルト値
StartSchedule 起動を実行するスケジュールをUTCタイムゾーンで cron 式で記述します。 cron 式についてはこちら 0 21 ? * SUN-THU *
StopSchedule 停止を実行するスケジュールをUTCタイムゾーンで cron 式で記述します cron 式についてはこちら 0 15 ? * MON-FRI *
Ec2TagKey 起動/停止したいEC2に設定するタグのキー ec2-state-scheduler
Ec2TagValue 起動/停止したいEC2に設定するタグの値 True

設定したら「Next」をクリックします。

オプションはそのまま「Next」をクリックします。

Create_A_New_Stack 3

チェックボックスをチェックし、「Next」をクリックします。(IAM を操作する場合は承認操作としてチェックボックスへのチェックが必要)

Create_A_New_Stack 4

CloudFormation Stack の完了を待ちます。

CloudFormation_Management_Console

EC2 インスタンスへタグを設定する

EC2 のタグ設定画面から対象となるインスタンスを選択し、CloudFormation のパラメータで設定したタグを設定します。

EC2_Management_Console 4

動作確認

停止、起動の動作を確認します。

CloudWatch Events の時間を調整しました。25分に停止、30分に起動するように設定しました。

しばし、放置。。

CloudTrail から実行状態を確認します。

CloudTrail_Management_Console

CloudTrail に 25分に StopInstances、30分に StartInstances が記録されています。

まとめ

AWS の機能を使えば、このようなジョブ処理も簡単に実装できます。仕組みも、ソースコードもシンプルなので必要に応じて修正していただければと思います。特にリトライ処理は含まれていませんので、Step Functions を組み合わせて実装するのがいいと思います。ただ Step Functions はまだ CloudFormation が対応していませんので、手設定で付け加える必要があります。