LoginSignup
0
0

More than 1 year has passed since last update.

SystemsManagerChangeCalendarでssmAutomationランブックの実行を制御する

Last updated at Posted at 2021-09-15

SystemsManagerChangeCalendarとは

SystemsManagerの機能の一つで、カレンダー内の特定の日付・時間に「イベント」を挿入することで、そのイベント間のアクションの実行を制御を行える機能です。

例えば、「毎日定時にSystems Manager Automation ランブックからEC2インスタンスを停止させているが、この日だけは停止させたくない」といった場合に、対象日にイベントを設定しておくことでインスタンスを停止させないということができます。

更にEventBridgeとも連携できるため、柔軟にイベントの管理が行えます。

以下公式ドキュメントです。

AWS Systems Manager の一機能である Change Calendar では、指定したアクション (Systems Manager Automation ランブックなど) が AWS アカウント で実行できるまたはできない日付と時刻の範囲を設定できます。Change Calendar では、このような範囲はイベントと呼ばれます。Change Calendar エントリを作成すると、ChangeCalendar タイプの Systems Manager のドキュメントが作成されます。

使ってみる

実際に使ってみます。
以下の構成のようなイメージで作成します。
構成.png

Systems Manager Automation ランブックの設定

まず、ChangeCalendarで実行管理するサンプルのメンテナンスウィンドウを作成します。
実行するタスクは「AWS-RestartEC2Instance」、実行時間は15分毎としています。

image.png

しばらく放置して正しく実行されていることを確認します。
image_04.png

カレンダーの作成

次にカレンダーを作成します。

最近の発表でカレンダーをインポートして作成することができるというアップデートがありましたので、こちらを利用します。

適当なイベントをGoogleカレンダーに入れ、エクスポートします。

※後にインポートしてわかったのですが、Googleカレンダーの設定が日本標準時だとうまくインポートできません。なので、Googleカレンダーの設定を協定世界時に直してからエクスポートしてください。
↓日本標準時で15:30~16:30のイベントを入れたカレンダーをインポートすると以下のように表示されます。
image_03.png

その後、マネージドコンソールのインポートから先ほどエクスポートした.ics形式のカレンダーをインポートします。
カレンダータイプはそれぞれ

  • デフォルトで開く:イベントがある場合、タスクを実行しない。
  • デフォルトで閉じる:イベントがある場合のみタスクを実行する。

となります。
image_02.png

作成すると以下のようにカレンダーが表示されます。
image_05.png

タスクにカレンダーの状態確認ステップを追加

タスクのステップにカレンダーの状態を確認するステップを挟みます。

「ドキュメント」から「AWS-RestartEC2Instance」を選択し、クローンの作成を押下します。
image_07.png

次にドキュメントエディタから以下のように編集し「オートメーションを作成する」を押します。
image_08.png

※AccountID,CalendarNameは置換して下さい。

Copy-AWS-RestartEC2Instance
Copy-AWS-RestartEC2Instance
{
    "description": "Restart EC2 instances(s)",
    "schemaVersion": "0.3",
    "assumeRole": "{{ AutomationAssumeRole }}",
    "parameters": {
      "InstanceId": {
        "type": "StringList",
        "description": "(Required) EC2 Instance(s) to restart"
      },
      "AutomationAssumeRole": {
        "type": "String",
        "description": "(Optional) The ARN of the role that allows Automation to perform the actions on your behalf.",
        "default": ""
      }
    },
    "mainSteps": [
      {
        "name": "checkChangeCalendarOpen",
        "action": "aws:assertAwsResourceProperty",
        "inputs": {
          "Service": "ssm",
          "Api": "GetCalendarState",
          "CalendarNames": [
        "arn:aws:ssm:ap-northeast-1:<AccountID:document/<CalendarName>"
          ],
          "PropertySelector": "$.State",
          "DesiredValues": [
        "OPEN"
          ]
        },
        "nextStep": "stopInstances"
      },
      {
        "name": "stopInstances",
        "action": "aws:changeInstanceState",
        "inputs": {
          "InstanceIds": "{{ InstanceId }}",
          "DesiredState": "stopped"
        }
      },
      {
        "name": "startInstances",
        "action": "aws:changeInstanceState",
        "inputs": {
          "InstanceIds": "{{ InstanceId }}",
          "DesiredState": "running"
        }
      }
    ]
      }

参考:

作成が完了したら「メンテナンスウィンドウ」からドキュメント「AWS-RestartEC2Instance」を「Copy-AWS-RestartEC2Instance」に変更します。
image_09.png

実行確認

イベントが予定されている時間のみ、実行が行われていないか確認します。
対象時間の実行履歴を見てみると...
image_10.png

ChangeCalendarから「OPEN」が返ってきていない為、失敗となっています!

イベントの時間が過ぎると、成功に戻りました。
image.png

まとめ

ChangeCalendarでssmAutomationランブックの実行制御を行えることを確認しました。これにより、Cronなどで表現しきれない急なイベントが発生しても、カレンダーにイベントを入れるだけで実行の調整が行えます。
今回はCalendarからOPENが返ってこない場合はエラーという単純な制御でしたが、作りこみ次第でよりいい感じにできると思います。
機会があれば試してみたいです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0