はじめに
よくある話ですが、AWSの利用料金を節約するためにEC2の自動停止を実施したいという要望があります。方法は色々あるかなと思いますが、2024年7月時点で一番お手軽なのはEventBridge Schedulerを使う方法かなと考えています。
簡単に動作検証をしてみました。
実装
EC2を停止させるために、EventBridge Schedulerを操作する前にIAMロールを作成します。IAMロール作成の画面にて「カスタム信頼ポリシー」を選んで以下のJSONをコピペします。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "scheduler.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
許可ポリシーはEC2FullAccessを付与してあげれば確実ですが、最小はec2:StopInstances
を与えてあげればOKです。
EventBridge Schedulerを使うのはコンソール上でボタンをポチポチやっていれば簡単に実装できます。最初は1回限りのスケジュールを作成して動作確認を取ると良いかなと思います。
EC2を停止するためには、ターゲットAPIにてEC2を選択後、StopInstancesを選択します。
ターゲットとなるインスタンスIDは一個ずつコピペして設定してあげます。まとめて指定することはできないのかなとちょっと試してみましたが、うまく動きませんでした。
あとは時間になればEC2インスタンスが停止していることを確認すればOKです。
1回限りのスケジュールで動作確認ができれば、cron式で定期的なスケジュールを実行するようにします。
cron式にはいろいろな方言があるので、AWSが定めているcron式のリファレンスを見ながら設定します。
ログについては、CloudTrailに出力されます。以下は出力されたJSONの切り抜き。
だいぶ検索性は低いので実際にはAthenaなどで検索するようにすると良いかなと思います。
考察
EC2の自動停止をEventBridge Schedulerを使って実装しました。コーディングなしに実装できるのは大変楽なのですが、設定にはIAMロールの作成やcron式の入力など地味に引っかかるところがあるので、一度素振りしておいた方が良いかなとおもます。
また、ログについてはかなり貧弱です。EventBridge Scheduler上から確認できればいいんですが、ちょっとなさそうです。