【小ネタ】 SSM State ManagerとSSM Maintenance Windowsで利用できるcron式は異なる
はじめに
皆様こんにちは、あかいけです。
知っていましたか?
SSM State Manager と SSM Maintenance Windows で利用できるcron式が異なることを…。
AWS Systems Managerでスケジュール実行を設定する際、
State Manager(関連付け)とMaintenance Windowsの両方でcron式を使用できます。
しかし、両者でサポートされているcron式のフォーマットには違いがあります。
私はこの違いを知らなかったため、「なぜかエラーになる…」という状況に陥りました。
そのためこのブログでは違いを整理してみました。
State Managerの場合
State Managerの関連付けでは、
5つの必須フィールドでcron式を指定します。
cron(分 時 日 曜日 年)
- 制約
- 月(Month)フィールドは指定できません
- 曜日の範囲指定(例:
MON-FRI)はサポートされていません - 曜日のカンマ区切り(例:
MON,TUE,WED)もサポートされていません - 曜日は単一の値(例:
MON)または*(毎日)のみ
サポートされているcron式のパターン
| パターン | cron式の例 | 説明 |
|---|---|---|
| 30分ごと | cron(0/30 * * * ? *) |
毎時0分と30分に実行 |
| 1、2、4、8、12時間ごと | cron(0 0/4 * * ? *) |
4時間ごとに実行 |
| 毎日特定時刻 | cron(15 13 ? * * *) |
毎日13:15に実行 |
| 毎週特定曜日 | cron(15 13 ? * MON *) |
毎週月曜日の13:15に実行 |
| 月の第n曜日 | cron(30 23 ? * TUE#3 *) |
毎月第3火曜日の23:30に実行 |
| 月の最後のX曜日 | cron(0 0 ? * 3L *) |
毎月最後の火曜日の0:00に実行 |
rate式の制約
State Managerのrate式にも制約があります。
(ドキュメントだと31日未満、という記載でしたが実際に作ってみたところ31日は作成可能で、32日以上は作成不可でした)
- 30分以上かつ31日以下の間隔のみサポート
# OK
rate(30 minutes)
rate(1 hour)
rate(15 days)
# NG - 30分未満はサポートされない
rate(15 minutes)
# NG - 32日以上はサポートされない
rate(32 days)
Maintenance Windowsの場合
Maintenance Windowsでは、
6つの必須フィールドでcron式を指定します。
cron(分 時 日 月 曜日 年)
- 特徴
- すべてのcronおよびrate式をサポート
- 月(Month)フィールドを指定できます(
1-12またはJAN-DEC) - 曜日の範囲指定(例:
MON-FRI)がサポートされています - 曜日のカンマ区切り(例:
MON,TUE,WED)もサポートされています
Maintenance Windowsのcron式の例
| パターン | cron式の例 | 説明 |
|---|---|---|
| 毎日特定時刻 | cron(15 10 ? * * *) |
毎日10:15に実行 |
| 平日のみ | cron(15 10 ? * MON-FRI *) |
平日の10:15に実行 (※State Managerでは不可) |
| 特定曜日(複数) | cron(0 3 ? * MON,WED,FRI *) |
月・水・金の3:00に実行 (※State Managerでは不可) |
| 月の第n曜日 | cron(0 2 ? * THU#3 *) |
毎月第3木曜日の2:00に実行 |
| 毎月最終日 | cron(0 2 L * ? *) |
毎月最終日の2:00に実行 |
| 月の最終X曜日 | cron(15 10 ? * 6L *) |
毎月最終金曜日の10:15に実行 |
| 特定月のみ | cron(0 0 1 JAN,JUL ? *) |
1月と7月の1日0:00に実行 (※State Managerでは不可) |
違いまとめ
| 項目 | State Manager | Maintenance Windows |
|---|---|---|
| 必須フィールド数 | 5つ | 6つ |
| 月(Month)フィールド | 非対応 | 対応(1-12, JAN-DEC) |
| 曜日の範囲指定 | 非対応 | 対応(MON-FRIなど) |
| 曜日のカンマ区切り | 非対応 | 対応(MON,TUE,WEDなど) |
#(第n曜日) |
対応 | 対応 |
L(最終日/最終曜日) |
対応 | 対応 |
| rate式の制約 | 30分以上31日以下 | 制約なし |
どう使い分ける?
State Managerを選ぶケース
- マネージドノードの設定を継続的に維持したい場合
- シンプルなスケジュール(毎日、毎週特定曜日など)で十分な場合
Maintenance Windowsを選ぶケース
- 複雑なスケジュール(平日のみ、特定の月のみなど)が必要な場合
実際に困るケース
State Managerのcron式の制約により、以下のようなケースで困ることがあります。
パターン1: 平日のみ実行したい
「平日の深夜2時にのみSSM Run Commandを実行したい」という要件があった場合、
State Managerでは曜日の範囲指定ができないため、平日5日分の関連付けを個別に作成する必要があります。
# Maintenance Windowsなら可能
cron(0 2 ? * MON-FRI *)
# State Managerでは不可能(曜日範囲指定ができない)
# 代替案: 5つの関連付けを作成する必要がある
cron(0 2 ? * MON *)
cron(0 2 ? * TUE *)
cron(0 2 ? * WED *)
cron(0 2 ? * THU *)
cron(0 2 ? * FRI *)
パターン2: 特定の月にのみ実行したい
「半期に一度(1月と7月)の1日深夜にパッチ当てしたい」という要件があった場合、
State Managerでは月を指定できないため、素直にMaintenance Windowsを使った方が良さそうです。
# Maintenance Windowsなら可能
cron(0 0 1 JAN,JUL ? *)
パターン3: 四半期末に実行したい
「四半期末(3月、6月、9月、12月)の最終営業日に実行したい」という要件があった場合、
State Managerでは月を指定できないため、素直にMaintenance Windowsを使った方が良さそうです。
# Maintenance Windowsなら可能(最終金曜日の例)
cron(0 22 ? MAR,JUN,SEP,DEC 6L *)
備考: Quick SetupとState Managerの関係
Quick Setupを使ってPatch Managerのパッチポリシーを設定する場合、裏側でState Managerの関連付けが作成されます。
つまり、Quick SetupでPatch Managerのパッチポリシーを作成する場合、本記事で説明したState Managerのcron式の制約を受けることになります…。
実際に作成してみると、Quick Setupの作成まではできますが、その後裏側で作成されるCloudFormationが以下のようなエラーでデプロイが失敗します。
Resource handler returned message: "Invalid request provided: Schedule expression cron(0 2 ? * MON-FRI *) is currently not accepted. Supported expressions are every half, 1, 2, 4, 8 or 12 hour(s), every specified day and time of the week, or a specific day in a specific week of the month Supported examples are: cron(0 0/30 * 1/1 * ? *), cron(0 0 0/4 1/1 * ? *), cron(0 0 10 ? * SUN *), cron(0 0 10 ? * * *), cron(0 0 ? * TUE#2 *) (Service: Ssm, Status Code: 400, Request ID: 65753e4d-1ff9-424a-8d19-0f8f8ab72d59) (SDK Attempt Count: 1)" (RequestToken: af025d2c-99db-f1af-b0ba-bc4e3de44078, HandlerErrorCode: InvalidRequest)
さいごに
以上、SSM State ManagerとSSM Maintenance Windowsで利用できるサポートされているcron式の違いについてでした。
同じSystems Managerの機能でも、cron式のサポート範囲が異なるというのは意外と見落としがちなポイントです。
スケジュール設定でエラーが出た際は、まずこの違いを確認してみてください。
この記事が誰かのお役に立てば幸いです。







