📝

EC2 でのイベントウィンドウ のサポート

2021/12/12に公開

EC2 の イベントウィンドウとは

例えば RDS などのマネージドサービスの場合、サービサーである AWS 側の都合で、メンテナンスによる インスタンスの再起動などが必要になるケースがあるのは、比較的よく知られており、意識して運用設計がされる面だと思います。
一方で、表題の EC2の場合には、これまで、この AWS 側都合による再起動について、ユーザ側の事前のコントロールはあまり効かない状況でした。
なお、以前から存在した機能としては、EC2で 既にスケジュールされたイベントの開始時間を変更出来る API は存在していました。こちらについては、以下の ブログ記事に詳しくまとまっています。

ただし、上記は、AWS による スケジュールイベント が設定された後に操作が必要であり、「事前に準備しておく」ような運用をするには、まだ一歩足りない機能だったように感じます。
今回、この AWS 側都合による EC2 のメンテナンスによる再起動を、ユーザ側でスケジューリングできる機能が追加されました。

AWS からの アナウンスは、以下のブログに掲載されています。

仕様についての説明は、以下の URL に掲載されています。

こまごまとした仕様は、上記の Considerations を参照するのがよさそうです。
なお、記事 執筆時点(2021年7月)で、いずれも 日本語版は存在していないようです。

本記事で伝えたいポイントは以上なのですが、せっかくなので、多少機能を触ってみたいと思います。

マネジメントコンソール上では、EC2 コンソール の上部にある「イベント」メニューから、「アクション」ドロッブダウンを選択し、「イベントウィンドウを管理」メニューを選択することで、イベントウィンドウの管理画面を選択することができます。

マネジメントコンソール上からの操作は難しくない(ハズ)なので、以下では、(例によって)CLIでの操作で イベントウィンドウ の機能を見ていきます。

CLIバージョン

v1 系 では、1.20.0 で、v2 系では、2.2.20 で、それぞれ、イベントウィンドウを操作する機能が取り込まれています。

以下の記事では、version 2.2.22 で実行した動作をベースに CLI を紹介します。

C:\Users\yoichi> aws --version
aws-cli/2.2.22 Python/3.8.8 Windows/10 exe/AMD64 prompt/off

CLI 概観

イベントウィンドウ に関する CLI は、以下の6つが用意されています。

  1. create-instance-event-window : イベントウィンドウを作成します。
    パラメータ : --time-range パラメーター、または --cron-expression パラメータを指定して、再起動可能なイベントウィンドウを作成します。
    --time-range と --cron-expression は、いずれか片方を 排他で設定する必要があります。

  2. delete-instance-event-window : イベントウィンドウを削除します。

  3. modify-instance-event-start-time : イベントウィンドウの設定を変更します。

  4. describe-instance-event-windows : イベントウィンドウの設定を表示します。
    パラメータ : イベントウィンドウの指定には、イベントウィンドウの ID (instance-event-window-id) を直接指定する以外にも、 associate-instance-event-window で関連付けた instance-tag や dedicated-host-id でフィルタすることもできるようです。

  5. associate-instance-event-window : 作成したイベントウィンドウを EC2 インスタンスに関連付けます。
    パラメータ : 関連付けの際には、イベントウィンドウの ID (instance-event-window-id) と ターゲットの指定が必要です。
    ターゲットには、インスタンスID(InstanceIds) 、専用ホストID(DedicatedHostIds)、またはインスタンスタグ(InstanceTags) のいずれか 1種のみが指定できます。
    イベントウィンドウに関連付けることができる個数に上限が設けられている(インスタンスID : 最大100個、専用ホストID : 50個、インスタンスタグ : 50個)ため、できるだけ、個数上限を気にしない運用をしたい場合には、インスタンスタグ による指定が推奨、という感じでしょうか。

  6. disassociate-instance-event-window : イベントウィンドウと、ターゲット の関連付けを解除します。

やってみる : イベントウィンドウの作成

通常の(週1) イベントウィンドウ 作成

まず、イベントウィンドウを作成してみます。
ただし、イベントウィンドウ には、AWSの仕様上、必要な最小時間を割り当てる必要があります。
例えば、以下のように、合計時間範囲が2時間の場合、作成に失敗します。

$ aws ec2 create-instance-event-window --name myEventWindowMonday2 --time-range StartWeekDay=monday,StartHour=0,EndWeekDay=monday,EndHour=2 --region ap-northeast-1

An error occurred (InvalidInstanceEventWindowTimeRange) when calling the CreateInstanceEventWindow operation: Time Ranges should have at-least 4 hours difference.

合計時間範囲は少なくとも4時間必要で、例えば以下のように指定する場合、作成は成功します。

$ aws ec2 create-instance-event-window --name myEventWindowMonday4 --time-range StartWeekDay=monday,StartHour=0,EndWeekDay=monday,EndHour=4 --region ap-northeast-1

{
    "InstanceEventWindow": {
        "InstanceEventWindowId": "iew-11111111111111111",
        "TimeRanges": [
            {
                "StartWeekDay": "monday",
                "StartHour": 0,
                "EndWeekDay": "monday",
                "EndHour": 4
            }
        ],
        "Name": "myEventWindowMonday4",
        "State": "creating",
        "Tags": []
    }
}

複数期間に分割された イベントウィンドウ 作成

ただし、イベントウィンドウで確保する時間は、連続4時間でなくとも、最低2時間 x 複数回で、累計4時間を満たすことができれば良いようです。この方法で指定する場合、 --time-range オプションの Shorthand Syntax 指定では、複数回の指定ができません。あらかじめ、別ファイルに イベントウィンドウ の設定を記載しておく必要があります。例えば、以下のファイル "timerange.json" を用意します。

timerange.json

[
  {
    "StartWeekDay": "sunday",
    "StartHour": 0,
    "EndWeekDay": "sunday",
    "EndHour": 2
  },
  {
    "StartWeekDay": "monday",
    "StartHour": 0,
    "EndWeekDay": "monday",
    "EndHour": 2
  }
]

このファイルを指定して実行すると、複数期間に分割されたイベントウィンドウを作成することができました。

$ aws ec2 create-instance-event-window --name myEventWindowSundayMonday2 --time-range file://./timerange.json --region ap-northeast-1

{
    "InstanceEventWindow": {
        "InstanceEventWindowId": "iew-22222222222222222",
        "TimeRanges": [
            {
                "StartWeekDay": "sunday",
                "StartHour": 0,
                "EndWeekDay": "sunday",
                "EndHour": 2
            },
            {
                "StartWeekDay": "monday",
                "StartHour": 0,
                "EndWeekDay": "monday",
                "EndHour": 2
            }
        ],
        "Name": "myEventWindowSundayMonday2",
        "State": "creating",
        "Tags": []
    }
}

cron 指定での イベントウィンドウ 作成

また、 --time-range オプションの代わりに、--cron-expression オプションを利用することもできます。

$ aws ec2 create-instance-event-window --name myEventWindowMondayTuesday2 --cron-expression "* 0-2 * * 1,2" --region ap-northeast-1

{
    "InstanceEventWindow": {
        "InstanceEventWindowId": "iew-33333333333333333",
        "Name": "myEventWindowMondayTuesday2",
        "CronExpression": "* 0-2 * * 1,2",
        "State": "creating",
        "Tags": []
    }
}

やってみる : イベントウィンドウの変更、削除、表示

イベントウィンドウ 変更

modify-instance-event-window では、IDを指定することで、イベントウィンドウの設定を変更できます。変更では、イベントウィンドウの期間の設定だけでなく、名前も合わせて、一度に変更できるようです。

$ aws ec2 modify-instance-event-window --instance-event-window-id iew-33333333333333333 --name myEventWindowSundayMonday2 --cron-expression "* 0-2 * * 0,1" --region ap-northeast-1

{
    "InstanceEventWindow": {
        "InstanceEventWindowId": "iew-33333333333333333",
        "Name": "myEventWindowSundayMonday2",
        "CronExpression": "* 0-2 * * 0,1",
        "AssociationTarget": {
            "InstanceIds": [],
            "Tags": [],
            "DedicatedHostIds": []
        },
        "State": "creating",
        "Tags": []
    }
}

イベントウィンドウ 削除

delete-instance-event-window では、イベントウィンドウを削除します。

$ aws ec2 delete-instance-event-window --instance-event-window-id iew-22222222222222222 --region ap-northeast-1

{
    "InstanceEventWindowState": {
        "InstanceEventWindowId": "iew-22222222222222222",
        "State": "deleting"
    }
}

なお、delete-instance-event-window には、イベントウィンドウ が関連付けされている場合には削除しない --no-force-delete オプションと、関連付けされていても強制的に削除する --force-delete オプションがあります。
誤操作を防止するためには、 --no-force-delete を付けて実行するのが良いかもしれません。

イベントウィンドウ 表示

describe-instance-event-windows では、作成した イベントウィンドウ を表示します。
絞りこみなしで describe-instance-event-windows を実行することで、一覧を取得できます。
(なお、list--instance-event-windows といった API は、提供されていないようですね。)

$ aws ec2 describe-instance-event-windows --region ap-northeast-1

{
    "InstanceEventWindows": [
        {
            "InstanceEventWindowId": "iew-11111111111111111",
            "TimeRanges": [
                {
                    "StartWeekDay": "monday",
                    "StartHour": 0,
                    "EndWeekDay": "monday",
                    "EndHour": 4
                }
            ],
            "Name": "myEventWindowMonday4",
            "AssociationTarget": {
                "InstanceIds": [],
                "Tags": [],
                "DedicatedHostIds": []
            },
            "State": "active",
            "Tags": []
        },
        {
            "InstanceEventWindowId": "iew-33333333333333333",
            "Name": "myEventWindowMondayTuesday2",
            "CronExpression": "* 0-2 * * 1,2",
            "AssociationTarget": {
                "InstanceIds": [],
                "Tags": [],
                "DedicatedHostIds": []
            },
            "State": "active",
            "Tags": []
        },
        {
            "InstanceEventWindowId": "iew-22222222222222222",
            "TimeRanges": [
                {
                    "StartWeekDay": "monday",
                    "StartHour": 0,
                    "EndWeekDay": "monday",
                    "EndHour": 2
                },
                {
                    "StartWeekDay": "sunday",
                    "StartHour": 0,
                    "EndWeekDay": "sunday",
                    "EndHour": 2
                }
            ],
            "Name": "myEventWindowSundayMonday2",
            "AssociationTarget": {
                "InstanceIds": [],
                "Tags": [],
                "DedicatedHostIds": []
            },
            "State": "active",
            "Tags": []
        }
    ]
}

やってみる : イベントウィンドウと EC2 の関連付け

イベントウィンドウ のインスタンスIDとの関連付け

associate-instance-event-window で EC2 と イベントウィンドウ を関連付けます。

$ aws ec2 associate-instance-event-window --instance-event-window-id iew-11111111111111111 --association-target InstanceIds=i-99999999999999999 --region ap-northeast-1

{
    "InstanceEventWindow": {
        "InstanceEventWindowId": "iew-11111111111111111",
        "TimeRanges": [
            {
                "StartWeekDay": "monday",
                "StartHour": 0,
                "EndWeekDay": "monday",
                "EndHour": 4
            }
        ],
        "Name": "myEventWindowMonday4",
        "AssociationTarget": {
            "InstanceIds": [
                "i-99999999999999999"
            ],
            "Tags": [],
            "DedicatedHostIds": []
        },
        "State": "creating"
    }
}

イベントウィンドウ の関連付け解除

disassociate-instance-event-window で EC2 との関連付けを解除します。

aws ec2 disassociate-instance-event-window --instance-event-window-id iew-11111111111111111 --association-target InstanceIds=i-99999999999999999 --region ap-northeast-1


{
    "InstanceEventWindow": {
        "InstanceEventWindowId": "iew-11111111111111111",
        "TimeRanges": [
            {
                "StartWeekDay": "monday",
                "StartHour": 0,
                "EndWeekDay": "monday",
                "EndHour": 4
            }
        ],
        "Name": "myEventWindowMonday4",
        "AssociationTarget": {
            "InstanceIds": [],
            "Tags": [],
            "DedicatedHostIds": []
        },
        "State": "creating"
    }
}

なお、仮に、すべての関連付けを解除したい場合であっても、ターゲットを省略することはできず、--association-target の指定を怠った場合には、 CLI の実行は失敗するようです。

イベントウィンドウ のタグとの関連付け

ターゲットの関連付けは、インスタンスIDではなく、タグを用いた指定も可能です。

aws ec2 associate-instance-event-window --instance-event-window-id iew-11111111111111111 --association-target InstanceTags="[{Key=EventWindow,Value=myEventWindowMonday4}]" --region ap-northeast-1

{
    "InstanceEventWindow": {
        "InstanceEventWindowId": "iew-11111111111111111",
        "TimeRanges": [
            {
                "StartWeekDay": "monday",
                "StartHour": 0,
                "EndWeekDay": "monday",
                "EndHour": 4
            }
        ],
        "Name": "myEventWindowMonday4",
        "AssociationTarget": {
            "InstanceIds": [],
            "Tags": [
                {
                    "Key": "EventWindow",
                    "Value": "myEventWindowMonday4"
                }
            ],
            "DedicatedHostIds": []
        },
        "State": "creating"
    }
}

ただし、インスタンス ID と タグ の双方を同時に関連付けることはできません。

$ aws ec2 associate-instance-event-window --instance-event-window-id iew-11111111111111111 --association-target InstanceIds=i-99999999999999999,InstanceTags="[{Key=EventWindow,Value=myEventWindowMonday4}]" --region ap-northeast-1

An error occurred (InvalidParameterValue) when calling the AssociateInstanceEventWindow operation: Target Associations must be composed entirely of instance IDs or instance tags, but not both.2

まとめ

AWS CLI で、EC2 のイベントウィンドウの操作を試してみました。
AWS 都合による EC2 の再起動イベントには、めったに出会うことはないような気もしますが、不意打ちされた時に慌てないように、事前に運用設計を関係者間で合意し、イベントウィンドウの設定をしておくと、いざという時に慌てずに済むかもしれませんね。

Discussion