はじめに
AWSコスト削減のために、使用していない時間帯はECSを停止したい。
毎回手動で起動したり停止したりするのは面倒なので、EventBridge Schedulerを使用して毎日定時にコンテナを起動/停止する。
EventBridge Scheduler について
EventBridge Rulesとの主な違い:
Amazon EventBridge スケジューラの紹介
1. IAMロール作成
スケジュール実行用のIAMロールを作成する。
AWSマネジメントコンソール > IAM > ロール > ロールの作成
信頼ポリシーは以下の通り
Principalにはscheduler.amazonaws.com
を指定する
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "scheduler.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
今回は許可ポリシーを新しく作成する。
ポリシードキュメントは以下。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ecs:UpdateService"
],
"Resource": "*"
}
]
}
許可されるアクションにはecs:UpdateService
を指定する。
起動も停止もこのアクションで実行可能。
2. ECS起動用のスケジュール作成
AWSマネジメントコンソール > EventBridge > スケジュール > スケジュールの作成
ステップ1
- スケジュール名を入力
- スケジュールパターンで「定期的なスケジュール」を選択
- スケジュールの種類を「cron ベースのスケジュール」にする
- 平日毎日9時に起動したいので、cron式には以下のように設定する
00 9 ? * 2-6 *
その他の項目はデフォルで次へ
ステップ2
- ターゲットAPI:すべてのAPI
- 検索ボックスでECSを検索し、AmazonECS > UpdateService を選択。
- APIに渡すJSONオブジェクトに以下を記述。
{
"Service": "<ECSサービス名>",
"Cluster": "<ECSクラスター名>",
"DesiredCount": 1
}
DesiredCount
がECSサービスの必要タスク数なので、起動したいタスク数を指定することでECSを起動することができる。
ステップ3
- スケジュールを有効化: オン
- スケジュール完了後のアクション:NONE
- 実行ロール: 作成したIAMロールを指定
その他の項目はデフォルで次へ。
確認と保存で問題なければスケジュールを保存。
これで指定した時間になったらDesiredCount
で指定した数のコンテナが起動する。
3. ECS停止用のスケジュール作成
起動用のスケジュールと同じ手順で作成し、cron式とDesiredCount
のみ変更する
cron式
00 19 ? * 2-6 *
入力に渡すJSONオブジェクトを記述する。
{
"Service": "<ECSサービス名>",
"Cluster": "<ECSクラスター名>",
"DesiredCount": 0
}
上記の設定で、平日毎日19時に必要タスク数を0にすることでECSを停止することができる。