1. はじめに
- AWS環境のコスト削減に取り組んでいる。コスト削減の一番ベーシックな対策である、EC2インスタンスの夜間休日の自動停止方法について、いくつかやり方があるようなので、それぞれ試してみて、難易度やメリット・デメリットを比較する。
- 本記事では2023/5時点で最新の方法と思われる、EventBridge Schedulerでの方法を確認する。
2. やったこと
- 自動起動・停止対象とするインスタンスを1台用意する。
- 以下のスケジュール設定により、夜間休日のインスタンス自動停止を実現する。
- EventBridge Schedulerで、月~金の9:00に、インスタンスを起動する設定とする。
- EventBridge Schedulerで、月~金の21:00に、インスタンスを停止する設定とする。
3. Amazon EventBridge Schedulerとは(自分の理解)
- 2022/11頃リリースされた様子。(AWS公式: Amazon EventBridge で新しいスケジューラーの提供を開始)
- 元々「EventBridge ルール」の設定において、「何らかの外部処理をスケジューリング設定して呼び出す仕組み」があった。
- その仕組みは残りつつ、「EventBridge Scheduler」では、スケジューリング機能が強化され、EventBridgeの子サービスの一つとして昇格している感じ。
- 「EventBridge Scheduler」では、まずスケジュールを設定し、次にやりたい処理を設定する。「やりたい処理」として、外部のLambdaやSSM Automation ドキュメントなどを呼び出す必要はなく、既定のAPI(出来合いの処理のセット)としてインスタンスの起動や停止が用意されている。
4. 構成図
- EventBridge Schdulerは、専用のアイコン(カレンダーと時計みたいな絵のもの)も用意されている。
5. 手順
5.1 事前準備
- 自動起動・停止の対象とするEC2インスタンスを作成する。このインスタンスのインスタンスIDを指定して自動起動・停止の操作を行う。
5.2 IAMロールの作成
- EventBridge スケジューラに対し、EC2の操作(今回は停止・起動)を許可する権限を付与する必要があり、そのためのIAMロールを作成する。
- IAM -> ロール -> ロールを作成 ->「信頼されたエンティティタイプを選択」にて、「カスタム信頼ポリシー」を選択し、以下のJSONを指定する。
scheduler.json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "scheduler.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
このロールの作成時、最初から信頼されたエンティティを「EventBridge Scheduler」にしたいが、2023/5現在、その指定ができないので、今回は「カスタム信頼ポリシー」の画面から作成する。
- 許可ポリシーとして、「AmazonEC2FullAccess」を選択する。(今回は検証のため適当だが、実際には必要な最小権限を付与)
- ロール名(mksamba-EventScheduler-InstanceStartStopRole)を付けて、ロールを作成する。
5.3 EventBridge Schedulerでのスケジュール登録
- インスタンス停止を行うスケジュールを作成する。
- EventBridge スケジューラ > スケジュール > スケジュールを作成 を選択し、スケジュール名を「mksamba-schedule-instance-stop」とする。
- 月~金の21:00PMに動作するよう、cron式を設定する。今回は「0 21 ? * MON-FRI *」で設定。動作スケジュールの設定は直接JSTで可能。
- ターゲット(時間になったら実行するのは何か)として、「EC2」->「StopInstances」を選択し、パラメータとして対象のInstanceIdを入力する。
- このスケジューラを実行するIAMロールを設定する。(先の手順で作成したロールを使用)
- 同様に、インスタンス開始を行うスケジュール「schedule-instance-stop」を作成する(画面は省略)。開始は月~金の9:00AMとするため、CRON式は「0 9 ? * MON-FRI *」となる。また、実行するターゲットは「EC2」->「StartEC2Instance」となる。
4.4 停止・起動の動作確認
-
検証用に、16:16に起動、16:20に停止するようにEventBridge Schedulerの時刻設定を変更する。
-
Cloudtrailのログは以下のようになる。イベントの詳細を開くと、EventBridge Schedulerから起動・停止されていることを確認可能。
イベントレコード(抜粋).json
{
"eventVersion": "1.08",
"eventTime": "2023-06-05T07:16:45Z",
"eventSource": "ec2.amazonaws.com",
"eventName": "StartInstances",
"awsRegion": "us-west-1",
"userAgent": "AmazonEventBridgeScheduler, aws-sdk-java/2.20.67 Linux/5.10.179-166.674.amzn2.x86_64 OpenJDK_64-Bit_Server_VM/11.0.19+8-LTS Java/11.0.19 kotlin/1.6.21-release-334(1.6.21) vendor/Amazon.com_Inc. md/internal exec-env/AWS_ECS_FARGATE io/async http/NettyNio cfg/retry-mode/legacy",
}
5. 参考
-
What is Amazon EventBridge Scheduler?
- AWS公式の「EventBridge Scheduler」に関するドキュメント。
-
Amazon EC2 の定期停止が Amazon EventBridge Scheduler によってより簡単になりました!
-
EventBridgeスケジューラを使ってEC2の定期起動/停止を行う方法
- 上記2つの記事を見て手順を確認した。注意ポイント(信頼するエンティティの指定方法)など参考になった。
6. 所感
- 従来の方法(Lambda + EventBridgeなど)と比べて、本記事の方法はEventBridgeのみで処理が完了するため、一番簡単に設定ができると感じた。今後新規に設定するのであれば、この方法がよいのではと思われる。