AWS CLIでEC2用のMaintenance Windowを作成してみた。

2022.05.25

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

概要

Maintenance Windows はSystems Manager の一機能です。Maintenance Window を使用して、ソフトウェアやパッチのインストール、ドライバーの更新など、ノードに対して破壊的になり得るアクションを実行するスケジュールを定義できます。Maintenance Windowには、スケジュール、最長期間、登録されたターゲットのセット、登録されたタスクのセットがあります。ターゲットはノードまたは他のAWSリソースにすることができます。

 

メンテナンスウィンドウは、次のタスクタイプをサポートします:

  • AWS Lambdaの関数。
  • AWS Step Functionsのタスク。
  • Run Command のコマンド。
  • Automationのワークフロー。

 

この記事では、AWS CLIでEC2用のMaintenance Windowを作成してみました。ここでは、EC2をターゲットとして単一のMaintenance Windowを作成し、Maintenance Windowを実行するためのタスクを設定しました。

 

やってみた

EC2の作成

  • 次の設定でIAMロールを作成しておきます。
    • 信頼されたエンティティの種類 : AWS のサービス
    • ユースケース : EC2
    • ポリシー  :  AmazonSSMManagedInstanceCore
  • この設定で EC2インスタンスを作成しておきます。
    • AMI : Amazon Linux 2 AMI
    • インスタンスタイプ : t2.micro
    • サブネット:パブリックサブネット
    • IAMロール : 以前に作成されたIAMロール。
    • Security Group :
      •  Inbound :SSH

 

Maintenance Windowの作成

  • 次のコマンドを使用してMaintenance Windowを作成しておきます。
  • Maintenance Window10 分ごとに最大 2 時間実行します。
  • cutoff 1: Maintenance Windowの終了から1時間以内に新しいタスクが開始されないことを示します。

 

//Create Maintenance Window
aws ssm create-maintenance-window \
    --name "EC2-Maintenance-Window" \
    --schedule "rate(10 minutes)" \
    --duration 2 \
    --cutoff 1 \
    --allow-unassociated-targets \
    --tags "Key=Name,Value=Maintenance-Window" \
    --region us-east-1

//Output
{
    "WindowId": "mw-abcd1234567efgh"
}

 

  • 次のDescribeコマンドを使用して、Maintenance Windowの詳細を表示できます。
//Describe the Maintenance Window
aws ssm describe-maintenance-windows --region us-east-1

//Output
{
    "WindowIdentities": [
        {
            "WindowId": "mw-abcd1234567efgh",
            "Name": "EC2-Maintenance-Window",
            "Enabled": true,
            "Duration": 2,
            "Cutoff": 1,
            "Schedule": "rate(10 minutes)",
            "NextExecutionTime": "2022-05-24T12:37:03.472Z"
        }
    ]
}

 

Maintenance Window

 

Maintenance WindowのDescription 

 

Maintenance Windowにターゲットを登録する

  • 次のコマンドを使用して、EC2インスタンスをターゲットとしてMaintenance Windowに登録しておきます。
//Register EC2 as Target
aws ssm register-target-with-maintenance-window \
    --window-id "mw-abcd1234567efgh" \
    --resource-type "INSTANCE" \
    --target "Key=InstanceIds,Values=i-00000000000000" \
    --region us-east-1

//Output
{
    "WindowTargetId": "abcdef123-1234-ab12-cd34-abcd12345"
}

 

  • 次のコマンドでターゲットの詳細を取得できます。
//Describe target
aws ssm describe-maintenance-window-targets \
    --window-id "mw-abcd1234567efgh" \
    --region us-east-1

//Output
{
    "Targets": [
        {
            "WindowId": "mw-abcd1234567efgh",
            "WindowTargetId": "abcdef123-1234-ab12-cd34-abcd12345",
            "ResourceType": "INSTANCE",
            "Targets": [
                {
                    "Key": "InstanceIds",
                    "Values": [
                        "i-00000000000000"
                    ]
                }
            ]
        }
    ]
}

 

 

Maintenance Windowにタスクを登録する

  • EC2インスタンスで[df]コマンドを実行する Run Command タスクを登録しておきます。
  • 次のコマンドを使用して、タスクを登録しておきます。

 

//Register Task
aws ssm register-task-with-maintenance-window \
    --window-id "mw-abcd1234567efgh" \
    --task-arn "AWS-RunShellScript" \
    --max-concurrency 1 --max-errors 1 \
    --priority 10 \
    --targets "Key=InstanceIds,Values=i-00000000000000" \
    --task-type "RUN_COMMAND" \
    --task-invocation-parameters '{"RunCommand":{"Parameters":{"commands":["df"]}}}' \
    --region us-east-1

//Output
{
    "WindowTaskId": "abcdef1245-1234-ab12-cd34-abcd12354"
}

 

  • 次のコマンドでタスクの詳細を表示できます。
//Describe Tasks
aws ssm describe-maintenance-window-tasks \
    --window-id mw-abcd1234567efgh \
    --region us-east-1

//Output
{
    "Tasks": [
        {
            "WindowId": "mw-abcd1234567efgh",
            "WindowTaskId": "abcdef1245-1234-ab12-cd34-abcd12354",
            "TaskArn": "AWS-RunShellScript",
            "Type": "RUN_COMMAND",
            "Targets": [
                {
                    "Key": "InstanceIds",
                    "Values": [
                        "i-00000000000000"
                    ]
                }
            ],
            "TaskParameters": {},
            "Priority": 10,
            "ServiceRoleArn": "arn:aws:iam::xxxxxxxxxxxxx:role/aws-service-role/ssm.amazonaws.com/AWSServiceRoleForAmazonSSM",
            "MaxConcurrency": "1",
            "MaxErrors": "1"
        }
    ]
}

 

 

タスク実行の詳細を表示する

  • 次のコマンドを実行して、特定のMaintenance Windowのタスク実行のリストしておきます。

 

//List Task Executions
aws ssm describe-maintenance-window-executions \
    --window-id mw-abcd1234567efgh --region us-east-1

//Output
{
    "WindowExecutions": [
        {
            "WindowId": "mw-abcd1234567efgh",
            "WindowExecutionId": "abcd1234-ab12-cd34-a1s2-abcdef123",
            "Status": "SUCCESS",
            "StartTime": "2022-05-24T18:17:45.592000+05:30",
            "EndTime": "2022-05-24T18:17:50.280000+05:30"
        },
        {
            "WindowId": "mw-abcd1234567efgh",
            "WindowExecutionId": "....................",
            "Status": "SUCCESS",
            "StatusDetails": "No tasks to execute.",
            "StartTime": "2022-05-24T18:07:45.805000+05:30",
            "EndTime": "2022-05-24T18:07:45.841000+05:30"
        },
        {
            "WindowId": "mw-abcd1234567efgh",
            "WindowExecutionId": ".................",
            "Status": "SUCCESS",
            "StatusDetails": "No tasks to execute.",
            "StartTime": "2022-05-24T17:57:45.799000+05:30",
            "EndTime": "2022-05-24T17:57:45.828000+05:30"
        }
    ]
}

 

  • ウィンドウ実行IDとタスクIDを指定して以下のコマンドを実行し、特定のタスク実行の詳細を取得しておきます。
//Get Task Execution Details
aws ssm get-maintenance-window-execution-task \
    --window-execution-id "abcd1234-ab12-cd34-a1s2-abcdef123" \
    --task-id "abcdef1245-1234-ab12-cd34-abcd12354" \
    --region us-east-1

//Output
{
    "WindowExecutionId": "abcd1234-ab12-cd34-a1s2-abcdef123",
    "TaskExecutionId": "abcdef1245-1234-ab12-cd34-abcd12354",
    "TaskArn": "AWS-RunShellScript",
    "ServiceRole": "arn:aws:iam::xxxxxxxxxxx:role/aws-service-role/ssm.amazonaws.com/AWSServiceRoleForAmazonSSM",
    "Type": "RUN_COMMAND",
    "TaskParameters": [
        {
            "aws:InstanceId": {
                "Values": [
                    "i-0000000000000"
                ]
            },
            "commands": {
                "Values": [
                    "df"
                ]
            }
        }
    ],
    "Priority": 10,
    "MaxConcurrency": "1",
    "MaxErrors": "1",
    "Status": "SUCCESS",
    "StartTime": "2022-05-24T18:17:45.807000+05:30",
    "EndTime": "2022-05-24T18:17:50.238000+05:30"
}

 

 

まとめ

AWS CLIでEC2用のMaintenance Windowを作成してみました。CLIを使用して他のAWSサービスの Maintenance Windowを作成することができます。

Reference :

Maintenance Window using AWS CLI