はじめに
EKS の検証で数台の Node を起動しているが、業務時間外は使わないので停止をしたい。毎回手動で起動/削除するのが面倒なので、なんとか自動化できないか調査したところ、EventBridgeで実現できそうなので検証した。
概要
アーキテクチャは以下の通り
- 起動、停止用の EventBridge を作成する
- トリガーは cron とし、決められた日時に EKS API を実行する
- EKS API の UpdateNodegroupConfig で、EKS Managed Node Group の Desired Capacity (希望する台数)をアップデートする
作成手順
作成手順は下記の通り
- EventBridge 用の IAM Role を作成する
- EC2起動用の EventBridge Scheduler を作成する
- EC2削除用の EventBridge Scheduler を作成する
EventBridge 用の IAM Role を作成する
信頼ポリシー
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Statement1",
"Effect": "Allow",
"Principal": {
"Service": "scheduler.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
インラインポリシー
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "eks:UpdateNodegroupConfig",
"Resource": "*"
}
]
}
※ ここではインラインポリシーを使用しているが、IAM ポリシーでも可能
※ Resource 句は Node Group を指定するとより厳格になる
起動用の EventBridge Scheduler を作成する
主要な設定のみ記載
スケジュール(cron)
月曜日から金曜日の 9:00 に EC2 を起動させる場合
0 9 ? * 2-6 *
ターゲット
Amazon EKS の 「UpdateNodegroupConfig」 を選択
最小0台、最大4台、希望する台数4台の場合、入力値は下記の通り
なお「クラスタ名」と「ノードグループ名」は自身の環境に合わせて設定する
{
"ClusterName": "クラスタ名",
"NodegroupName": "ノードグループ名",
"ScalingConfig": {
"MinSize": 0,
"MaxSize": 4,
"DesiredSize": 4
}
}
アクセス許可
事前に作成した EventBridge 用の IAM Role を指定する
その他のパラメータ
任意の値を指定する
削除用の EventBridge Scheduler を作成する
主要な設定のみ記載
スケジュール(cron)
月曜日から金曜日の 19:00 に EC2 を削除させる場合
0 19 ? * 2-6 *
ターゲット
Amazon EKS の 「UpdateNodegroupConfig」 を選択
最小0台、最大4台、希望する台数0台の場合、入力値は下記の通り
なお「クラスタ名」と「ノードグループ名」は自身の環境に合わせて設定する
{
"ClusterName": "クラスタ名",
"NodegroupName": "ノードグループ名",
"ScalingConfig": {
"MinSize": 0,
"MaxSize": 4,
"DesiredSize": 0
}
}
アクセス許可
事前に作成した EventBridge 用の IAM Role を指定する
その他のパラメータ
任意の値を指定する
動作確認
ノードグループのページにある「更新履歴」から Config のアップデート履歴、内容が確認できる
苦労した点
EventBridge のターゲットで指定する入力値の JSON のサンプルがなく、フォーマットが分からなかった。一旦 boto3 の例とデフォルトの例を元にアッパーキャメルで書いたところうまく行った。(その他のケースは未検証)
CloudFormation Template
あとで書く