背景
普段EC2上で開発を行なっています。EC2はご存知の通り従量課金制なので、利用していない時は極力起動を停止させておきたい!とは思いつつ毎日EC2の起動・起動停止するのが面倒。。ということで勤務時間になったらEC2を自動で起動、勤務時間外は自動で起動停止してくれるよう定期実行を設定してみました。
実現したいこと
平日月曜〜金曜の9時に開発用EC2を起動させ、21時に停止させる
[前準備] IAMロールの作成
EventBridgeでアタッチする実行用のIAMロールをあらかじめ作成します。
カスタム信頼ポリシーでEventBridge SchedulerがIAMロールに設定された権限を引き受けることができるよう設定します。
許可ポリシーについては、既存のAWS管理ポリシーだと不要な権限を含んでいるため、今回はEC2の停止、EC2の起動を実行する処理のみを指定したインラインポリシーを作成してみます。
Actionにec2:StopInstances,ec2:StartInstancesを許可したものを用意してIAMロールに追加します。
Amazon EventBridgeスケジューラで設定する
Amazon EventBridgeスケジューラで、以下2つのスケジュールを設定します。1,2は指定するAPI以外の設定はほぼ同じため、1についてメインで記載します。
1.定期的な起動停止処理
2.定期的な起動処理
1. スケジュールグループを作成
今回はEC2の定期起動、定期起動停止の2つを同じスケジュールグループに登録するために「ec2-development」を作成します。
Amazon EventBridgeページを表示します。
メニュー「スケジューラ」の「スケジュールグループ」から「スケジュールグループを作成」を選択します。名前を入力して作成ボタンを押せば作成完了です。
2. 起動停止スケジュールを作成
続いて、メインのスケジュールを作成していきます。
メニュー「スケジューラ」の「スケジュール」から「スケジュールを作成」を選択します。
Step1:詳細の指定
cronで日時設定
続いてスケジュールのパターンでスケジュールの詳細を定めます。
- 頻度:今回は定期的に実行させたいので、定期的なスケジュールを選択します。
- スケジュールの詳細:定期実行の具体的な日時をcronで設定します。
cronの書き方については公式ドキュメントを参照しました。 - フレックスタイムウィンドウ:「オフ」を選択
cronの設定内容:毎月曜〜金曜の21:00
スケジュールの開始日時、終了日時が決まっている場合は、時間枠で指定します。今回は何も指定しないで次へ進みます。
Step2:ターゲットの選択
利用するAPIを指定します。
すべてのAPIを選択し、検索欄に「EC2」->「Stop」を入力して表示された「StopInstances」を選択します。
続いてJSON内で今回停止させたいEC2ターゲットを指定します。停止させたいEC2が複数ある場合は複数のインスタンスIDを指定して次へ。
(※MyInstanceIdに停止させたいEC2のインスタンスIDを設定)
Step3: 設定
ここではアクセス許可についての実行ロールを指定します。前準備で作成したIAMロールを設定します。これでSchedulerでの設定は完了です。
3. 起動処理のスケジュール設定
起動停止処理の設定に倣ってstart-ec2-instanceのスケジュールも登録します。stop-ec2-instanceとの主な相違点は以下2つ
cronの設定内容:毎月曜〜金曜の09:00
利用するAPI
「StartInstances」を選択します。
設定確認
これで設定が完了しました。翌朝9時前には該当のEC2が停止していること、9時過ぎにはEC2が起動していることを確認できました。