4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

年末だしChange Calendarについて書く

4
Posted at

はじめに

年末といえばカレンダーだよなという安直な考えが頭をよぎりました。
せっかくなのでAWS Systems ManagerのChange Calendarについて記事を書きます。

Change Calendarは、スケジュールに基づいてシステムの動作を制御できるサービスです。
本記事では、CalendarについてStateという概念を中心に解説します。

Calendarの基本

Stateの管理

Calendarは、スケジュールを定義してOPENCLOSEDの2つのStateを管理するリソースです。

Stateの実例

image.png

上記画像は2025年の日本の祝日を定義したCalendarの一部です。
9月15日の敬老の日が定義されています。

スクリーンショット 2025-12-18 164924.png

CalendarのTypeを見ると、DEFAULT_OPENであることが分かります。
つまり、このCalendarで特に定義されていない時間帯はOPENというStateで、定義したイベント(敬老の日)の時間帯(0:00~23:59)はCLOSEDというStateになります。

このようにCalendarはイベントの有無でOPENCLOSEDという2つの状態を管理しています。

※CalendarがDEFAULT_CLOSEDの場合は評価が逆転し、イベント時がOPEN、イベント以外がCLOSEDになります。

Calendarでできること

API経由でのState確認

image.png

特に何のイベントも定義していないDEFAULT_OPENのCalendarを用意しました。
現在の日付は12月18日です。
CalendarのStateは以下のコマンドで確認可能です。

aws ssm get-calendar-state --calendar-names <CalendarName>

実際の実行結果は以下の通りです。

~ $ aws ssm get-calendar-state --calendar-names calendar-template-stack-TestCalendar-NitvHCFau1np
{
    "State": "OPEN",
    "AtTime": "2025-12-18T08:13:34Z"
}

12月18日にイベントを追加してみます。

image.png

再度Stateを確認するコマンドを実行するとStateがCLOSEDに変更されました。

~ $ aws ssm get-calendar-state --calendar-names calendar-template-stack-TestCalendar-NitvHCFau1np
{
    "State": "CLOSED",
    "AtTime": "2025-12-18T08:18:56Z",
    "NextTransitionTime": "2025-12-18T14:59:59Z"
}

複数のCalendarへの問い合わせ

Stateを問い合わせるAPIは、一度の実行で複数(最大10個)のCalendarに対しての問い合わせが可能です。
例えば、祝日Calendarと本日(12月18日)をイベントとして定義したCalendarの2つに対して問い合わせてみます。

image.png

image.png

祝日Calendarへの問い合わせ結果はOPENです。

~ $ aws ssm get-calendar-state --calendar-names calendar-template-stack-JapaneseHolidayCalendar-VyPJ2R59q4Gs
{
    "State": "OPEN",
    "AtTime": "2025-12-18T08:28:57Z"
}

本日をイベントとしたCalendarへの問い合わせ結果はCLOSEDです。

~ $ aws ssm get-calendar-state --calendar-names calendar-template-stack-TestCalendar-NitvHCFau1np
{
    "State": "CLOSED",
    "AtTime": "2025-12-18T08:30:11Z",
    "NextTransitionTime": "2025-12-18T14:59:59Z"
}

この時両方のCalendarを対象にStateを確認するとCLOSEDになります。

~ $ aws ssm get-calendar-state --calendar-names calendar-template-stack-TestCalendar-NitvHCFau1np calendar-template-stack-JapaneseHolidayCalendar-VyPJ2R59q4Gs
{
    "State": "CLOSED",
    "AtTime": "2025-12-18T08:31:33Z",
    "NextTransitionTime": "2025-12-18T14:59:59Z"
}

複数のCalendarに問い合わせた際の挙動について公式ドキュメントを確認すると、以下の記述があります。

1 つの要求に複数のCalendarを指定すると、要求内のすべてのCalendarが開いている場合にのみ、コマンドは OPEN のステータスを返します。要求内の 1 つ以上のCalendarが閉じている場合、返されるステータスは CLOSED です。

つまり複数のCalendarのうち一つでもCLOSEDがあればレスポンスはCLOSEDになります。

複数Calendar設計の考察

複数のCalendarに同時問い合わせができる機能が提供されていることから、AWSはCalendarの責任範囲を明確に分離する設計を推奨していると推測されます。

単一責任の原則

  • 各Calendarは1つの明確な責任を持つことが望ましい
  • 例:祝日Calendar、営業時間Calendar、メンテナンスCalendar

再利用性の向上

  • 祝日Calendarは複数のシステムで共有できる
  • 営業時間Calendarは部署ごとに異なる設定ができる

管理の容易性

  • 祝日の更新は祝日Calendarのみを変更すればよい
  • 営業時間の変更は営業時間Calendarのみを変更すればよい
  • 変更の影響範囲が明確になる

柔軟な組み合わせ

  • システムAは「祝日 + 営業時間」の組み合わせ
  • システムBは「祝日 + メンテナンス」の組み合わせ
  • 必要な条件を自由に組み合わせて使用できる

このような設計により、複雑な条件を1つのCalendarに詰め込むのではなく、シンプルなCalendarを組み合わせて使うのがよさそうです。

State確認のユースケース

CalendarのStateを確認することで、時間帯に応じた処理の制御が可能になります。

Lambda関数での処理制御

以下のような処理フローで、Calendarの状態に応じて処理を実行するかスキップするかを制御できます。

1. Lambda関数が起動
2. get-calendar-state APIでCalendarの状態を確認
3. Stateが**OPEN**の場合
   → 処理を実行
4. Stateが**CLOSED**の場合
   → 処理をスキップ

例:祝日Calendarを使用した場合

  • 平日:State = OPEN → バッチ処理を実行
  • 祝日:State = CLOSED → バッチ処理をスキップ

複数Calendarを使った高度な制御

複数のCalendarを組み合わせることで、より複雑な条件での制御が可能です。

1. 処理開始前に複数のCalendarに問い合わせ
2. すべてのCalendarが**OPEN**の場合のみ
   → 処理を実行
3. いずれか1つでも**CLOSED**の場合
   → 処理をスキップ

例:祝日Calendar + 営業時間Calendar

  • 平日の営業時間内:両方OPEN → 処理実行
  • 祝日または営業時間外:いずれかCLOSED → 処理スキップ

さいごに

今回はAPI経由でStateを問い合わせ、処理フローに利用するという観点でCalendarの記事を書きました。
問い合わせる以外にも、Stateが切り替わる瞬間(CLOSED→OPEN、OPEN→CLOSED)を検知して、何らかの処理のトリガーとする使い方もあります。
機会があれば、後者の利用方法についても記事を書くつもりです。

参考資料

4
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
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?