今までEC2インスタンスを夜間自動停止させる方法として、EventBridge+Lambda (EC2インスタンスを停止させる関数作成) で実施していたのですが、Systems Manager からノーコードで実施できることを知りましたので、その備忘録をしておきます。
はじめに
「メンテナンスウィンドウ」という用語について
私は完全に勘違いしていたのですが、Systems Manager の「メンテナンスウィンドウ」は、EC2インスタンスやRDSの指定日時にアップロードさせるために設定する「メンテナンスウィンドウ」とは、全く異なる概念とのことです。
同じメンテナンスウィンドウという名前ですが、全く異なる概念とは紛らわしすぎ・・・
- Systems Manager のメンテナンスウィンドウ
- 定期的なタスク実行のスケジュールを設定するもの
- Systems Manager のサービスの一つ
- EC2やRDSに設定するメンテナンスウィンドウ
- それらのサービスのソフトウェアアップデートをスケジュールするためのもの
- EC2インスタンスやRDSの設定の一つ
「Systems Manager」と「SSM」について
もともと SSM とう名前のサービスだったものが、Systems Manager になったという経緯があるとのことです。
サービス名は「Systems Manager」になったが、CLIやIAMで使用するプレフィックスとしては、ssmを引き続き使用することになってるようです。(互換性とかの理由ですかね)
設定手順
大まかに、以下のような順番になります。
- Systems Manager メンテナンスウィンドウ(のタスク)にアタッチするための IAM ロールを用意
- EC2インスタンスには IAM ロールアタッチ不要ですが、メンテナンスウィンドウ側に IAM ロールアタッチが必要
- メンテナンスウィンドウの作成
- ここで、スケジュールを設定する
- メンテナンスウィンドウのタスクの作成
- メンテナンスウィンドウに登録するタスクを作成し、スケジュールになったときにEC2インスタンスが停止されるようにする
なお、以下の AWS が作成している資料が非常に参考になります。
設定に迷ったら以下を参照すべしです。
詳細手順
1.IAM ロールの作成
Systems Manager メンテナンスウィンドウ(のタスク)にアタッチするための IAM ロールを用意します。
今回は EC2 インスタンスを停止させるので、それ用のIAMポリシーとIAMロールを作成しました。
IAM ポリシー
EC2への処理およびSSMへの処理を許可します。
本来はしっかりできる処理を制限するべきですが、今回は怠惰で権限フルMAXにしてます。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "ec2:*",
"Resource": "*"
},
{
"Effect": "Allow",
"Action": "ssm:*",
"Resource": "*"
}
]
}
上記で作成した IAM ポリシーをアタッチするための IAM ロールを以下の通り作成します。
- 指定するユースケース
- 許可ポリシーには、上記作成したIAMポリシーを選択
- 上記以外は特に選択なし
2.メンテナンスウィンドウの作成
Systems Manager にて、左メニューから「メンテナンスウィンドウ」を選択し、さらに「メンテナンスウィンドウの作成」を選択します。
「メンテナンスウィンドウの作成」画面にて以下の通り設定します。
- 「未登録ターゲット」:未登録ターゲットを許可するにチェックを入れる
- チェックを入れない場合、別途「ターゲット」という設定をする必要あり。今回はとにかく早く作りたかったのでターゲットの指定なし
- スケジュールについては、複雑なのでとりあえず以下のように設定した
- 以上で、「メンテナンスウィンドウの作成」を押す
上記でメンテナンスウィンドウが作成されます。
この段階では、まだスケジュールが登録されただけで、そのスケジュールで何をするかを次のステップで設定します。
3.メンテナンスウィンドウのタスクの作成
ここでは、メンテナンスウィンドウに登録するタスクを作成します。
具体的には、今回はスケジュールされた時間(上記例では毎日22時)になったときにEC2インスタンスが停止されるようにします。
2.で作成したメンテナンスウィンドウを選択し、「アクション」>「オートメーションタスクの登録」を選択します。
「オートメーションタスクの登録」で以下のように設定します。
- 「New task invocation cutoff」にはチェックを入れない
- この設定はよくわからん・・・
- オートメーションドキュメントにて、以下のように設定する
- ターゲットは「Task target not required」を選択し、入力パラメータの instanceId に、停止させるのEC2インスタンスのインスタンスIDを入力
- IAMサービスロールにて、1.で作成したIAMロールを選択
- 「オートメーションタスクの登録」を押す
上記で、タスクの登録も完了となります。
以上で、指定したEC2インスタンスを定時で自動停止することができました。
コメント