AWS Systems Manager のメンテナンスウィンドウでEC2インスタンスを夜間自動停止させる

クラウド

今まで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を引き続き使用することになってるようです。(互換性とかの理由ですかね)

設定手順

大まかに、以下のような順番になります。

  1. Systems Manager メンテナンスウィンドウ(のタスク)にアタッチするための IAM ロールを用意
    • EC2インスタンスには IAM ロールアタッチ不要ですが、メンテナンスウィンドウ側に IAM ロールアタッチが必要
  2. メンテナンスウィンドウの作成
    • ここで、スケジュールを設定する
  3. メンテナンスウィンドウのタスクの作成
    • メンテナンスウィンドウに登録するタスクを作成し、スケジュールになったときにEC2インスタンスが停止されるようにする

なお、以下の AWS が作成している資料が非常に参考になります。
設定に迷ったら以下を参照すべしです。

https://pages.awscloud.com/rs/112-TZM-766/images/AWS-Black-Belt_2023_AWS-SystemsManager-MaintenanceWindows_0930_v1.pdf

詳細手順

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 ロールを以下の通り作成します。

  • 指定するユースケース
    • Systems Manager (「Systems Manager – Inventory and Maintenance Windows」ではない点に注意)
  • 許可ポリシーには、上記作成したIAMポリシーを選択
  • 上記以外は特に選択なし

2.メンテナンスウィンドウの作成

Systems Manager にて、左メニューから「メンテナンスウィンドウ」を選択し、さらに「メンテナンスウィンドウの作成」を選択します。

「メンテナンスウィンドウの作成」画面にて以下の通り設定します。

  • 「未登録ターゲット」:未登録ターゲットを許可するにチェックを入れる
    • チェックを入れない場合、別途「ターゲット」という設定をする必要あり。今回はとにかく早く作りたかったのでターゲットの指定なし
  • スケジュールについては、複雑なのでとりあえず以下のように設定した
    • 「CRON/Rate式」を選択し、cron(00 22 * * ? *) (毎日22時に実行)
    • 「期間」は「1」時間
      • たぶんここで設定した時間が処理実施される時間として割り当てられる?EC2インスタンスを停止するくらいなら1時間でよさそう
    • 「タスクの開始を停止する時間」は「0」
      • 上述の AWS の資料では説明が書かれているが、とりあえず「0」で問題ないという認識
    • 「スケジュールのタイムゾーン」は「Japan」
  • 以上で、「メンテナンスウィンドウの作成」を押す

上記でメンテナンスウィンドウが作成されます。

この段階では、まだスケジュールが登録されただけで、そのスケジュールで何をするかを次のステップで設定します。

3.メンテナンスウィンドウのタスクの作成

ここでは、メンテナンスウィンドウに登録するタスクを作成します。
具体的には、今回はスケジュールされた時間(上記例では毎日22時)になったときにEC2インスタンスが停止されるようにします。

2.で作成したメンテナンスウィンドウを選択し、「アクション」>「オートメーションタスクの登録」を選択します。

「オートメーションタスクの登録」で以下のように設定します。

  • 「New task invocation cutoff」にはチェックを入れない
    • この設定はよくわからん・・・
  • オートメーションドキュメントにて、以下のように設定する
    • ドキュメントには AWS-StopEC2Instance を選択
    • ドキュメントのバージョンは、とりあえず「ランタイムのデフォルトバージョン」にした(これが一番安定しそう)
    • タスク優先度は「1」(意味が分からん・・・)
  • ターゲットは「Task target not required」を選択し、入力パラメータの instanceId に、停止させるのEC2インスタンスのインスタンスIDを入力
  • IAMサービスロールにて、1.で作成したIAMロールを選択
  • 「オートメーションタスクの登録」を押す

上記で、タスクの登録も完了となります。

以上で、指定したEC2インスタンスを定時で自動停止することができました。

コメント

タイトルとURLをコピーしました