Systems Manager Maintenance Window で 任意のEC2インスタンスを定期再起動する

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

おはようございます、加藤です。

Systems ManagerのMaintenance WindowsからAutomationを実行してEC2インスタンスを定期的に再起動する方法を紹介します。

やってみた

IAMロールの作成

用意する必要があるロールは2つです。

  1. Maitenance Windowを実行するロール
  2. Automationを実行するロール

Automation用ロール

ロールの作成
  1. マネジメントコンソールでIAMのロールを開く
  2. ロールの作成を行う
  3. ロールを使用するサービスでEC2を選択する
  4. ポリシーを[Automation]で検索し[AmazonSSMAutomationRole]を選択する
  5. ロール名とロールの説明を入力する

    ロール名 ロールの説明
    AmazonSSMAutomationRole Allows EC2 instances and Systems Manager to call AWS SSM Automation on your behalf.
  6. 作成したロールを開く
  7. ロールの信頼関係タブを開き信頼関係を編集する
  8. 信頼元にSSMを追加する
     {
     "Version": "2012-10-17",
     "Statement": [
     {
     "Effect": "Allow",
     "Principal": {
     "Service": [
     "ec2.amazonaws.com",
     "ssm.amazonaws.com"
     ]
     },
     "Action": "sts:AssumeRole"
     }
     ]
    } 
    
  9. ロールARNをコピーする

Maitenance Window用ロール

ポリシーの作成
  1. マネジメントコンソールでIAMのポリシーを開く
  2. ポリシーの作成を行う
  3. ビジュアルエディタでポリシーを作成する

    サービス IAM
    アクション PassRole
    リソース コピーしたロールARN
    リクエスト条件 iam:PassedToService(存在する場合、StringLike ssm.amazonaws.com)
  4. 名前と説明を入力する

    名前 説明
    SSM_PassRole_Automation SSM_PassRole_Automation
ロールの作成

先程とパラメータが違うだけなので、スクリーンショットは省略します。

  1. マネジメントコンソールでIAMのロールを開く
  2. ロールの作成を行う
  3. ロールを使用するサービスでEC2を選択する
  4. ポリシーを[Maintenance]で検索し[AmazonSSMMaintenanceWindowRole]を選択する
  5. ポリシーを[PassRole]で検索し[SSM_PassRole_Automation]を選択する(作成したポリシー)
  6. ロール名とロールの説明を入力する
    ロール名 ロールの説明
    AmazonSSMMaintenanceWindowRole Allows EC2 instances and Systems Manager to call AWS SSM Maintenance Window on your behalf.
  7. 作成したロールを開く
  8. ロールの信頼関係タブを開き信頼関係を編集する
  9. 信頼元にSSMを追加する
     {
     "Version": "2012-10-17",
     "Statement": [
     {
     "Effect": "Allow",
     "Principal": {
     "Service": [
     "ec2.amazonaws.com",
     "ssm.amazonaws.com"
     ]
     },
     "Action": "sts:AssumeRole"
     }
     ]
    } 
    

Maintenance Windowの作成

  1. マネジメントコンソールでMaintenance Windowを開く
  2. Maintenance Windowを作成する
  3. 名前の入力と未登録ターゲットの許可を解除する
  4. スケジュールを設定する(ここでは動作検証の為10分毎に実行とした)
  5. ターゲットを作成する
  6. ターゲット名を入力する
  7. ターゲットを定義する(DailyRestart:enable)
  8. タスク(Automation)を作成する
  9. タスク名を入力
  10. 実行するAutomationにAWS-RestartEC2Instanceを選択する
  11. 作成したターゲットを選択する
  12. レート制御を設定する 複数インスタンスを同時再起動したい場合は並行性のターゲット数を増やすか、パーセンテージに切り替えて設定します
  13. ロールを設定する(Maintenance Windowのロール)
  14. 変数を設定する InstanceId を {{ TARGET_ID }}とすると、Maintenance WindowsのターゲットからInstanceIdを受け渡しできる Automation用のロールを設定

以上で設定完了です!

動作確認

テスト用EC2インスタンス作成

  1. EC2インスタンスを2つ作成
  2. IAMポリシー[AmazonEC2RoleforSSM]がアタッチされているIAMロールを作成する
  3. EC2に割り当てる
  4. タグを設定する
    Key Value
    DailyRestart enable

EC2インスタンスはSSMを利用するので、パブリックまたはVPCエンドポイントの存在するサブネットに作成してください。

ログ確認

  1. 履歴に成功したメンテナンスウィンドウを確認
  2. タスクを2つ呼び出し成功しているか確認

スケジュールの修正

10分毎に再起動する設定になっているので、希望するようにCron式・Rate式を使って修正します。

あとがき

な...ながい...やりたいことはEC2インスタンスの再起動ですが、結構手順が長くなってしまいましたね。ですが、Lambdaで再起動する方法やCloudWatchからAutomationを実行する方法と比べてプログラミングの知識が必要なく保守しやすいはずです。

この方法の欠点は細かい条件に沿って再起動が実行できないところですね。

  • タグAがついているインスタンスが対象、ただしタグBがついているものは例外
  • タグの値で日次再起動を行う時間を指定
  • 1つのタグKeyに対して複数のValueを対象にする

例えば上記のような要件はこの方法では満たせません。

一度作ってしまえば、簡単にパラメータを変えて対応できるので、インスタンスを定期的に再起動する際に活用して頂けるとうれしいです。