概要
- AWSのCloudWatchEventsでスケジュールをcron式で設定する際に詰まったので、Qiitaに残しておく
基本書式
-
例: 2017/1/1 11時11分に実行する場合
11 11 1 1 ? 2017
- 左から
[分] [時] [日] [月] [曜日] [年]
6つの必須フィールドでできている
※普通のcron式だと年はないので注意
- 左から
-
それぞれのフィールドが取る値は下記のようになっている
フィールド 値 ワイルドカード 分 0 - 59 , - * / 時間 0 - 23 , - * / 日 1 - 31 , - * ? / L W 月 1 - 12 または JAN-DEC , - * / 曜日 1 - 7 または SUN - SAT , - * ? / L 年 1970 - 2199 , - * /
ワイルドカード
種類
-
CloudWatchEvensのルールのスケジュール式で使えるワイルドカードは全部で7つ
ワイルドカード 用途 , 同じフィールド内に複数の値を追加できる - 範囲を指定できる * フィールドの持つ値を全てを含む / 増分指定ができる ? 任意を意味する
使えるのはday-of-month(日)フィールドかday-of-week(曜日)フィールドL 月、または週の最終日を指定できる
使えるのはday-of-month(日)フィールドかday-of-week(曜日)フィールドW ◯日に一番近い平日を指定できる
使えるのはday-of-month(日)フィールド
使い方
- ワイルドカードの使い方について、例とともに書いていきます。
同じフィールド内に複数の値を追加できる( , )
例 : 2000年と2017年の1月と2月の1日と10日と15日の0時と12時の1分と30分と59分に実行
1,30,59 0,12 1,10,15 1,2 ? 2000,2017
範囲を指定できる( - )
例 : 1980年から1990年の(毎年)8月から10月の(毎月)15日から20日の(毎日)10時から13時の(毎時)1分から5分に実行
1-5 10-13 15-20 8-10 ? 1980-1990
フィールドの持つ値を全てを含む( * )
例 : 常に毎分実行
* * * * ? *
増分指定ができる( / )
例 : 2000年から10年毎に1月から2ヶ月毎に1日から3日毎に0時から5時間毎に0分から15分毎に実行
0/15 0/5 1/3 1/2 ? 2000/10
月、または週の最終日を指定できる( L )
例1 : 毎月末最終日の0時0分に実行
0 0 L * ? *
例2 : 毎週末最終日の0時0分に実行
0 0 ? * L *
◯日に一番近い平日を指定できる( W )
例 : 毎月15日に最も近い平日の0時0分に実行
0 0 15W * ? *
- 上記cron式は15日が平日か土日かによって実行タイミングが下記のように変わる
- 15日が平日の場合
- 15日に実行される
- 15日が土曜日の場合
- 15日に最も近い平日は14日の金曜日なので、14日に実行される
- 15日が日曜日の場合
- 15日に最も近い平日は16日の月曜日なので、16日に実行される
- 15日が平日の場合
任意を意味する( ? )
-
おそらく曜日のところだけに毎回出てくる
?
にみなさん疑問をお持ちだったことでしょう。ここで解説します。 -
公式のドキュメントにも書いてありますがAWSのCron式には下記のような制限があります。
Cron式の日フィールド及び曜日フィールドを同時に指定することはできません。 一方のフィールドに値を指定すると、 もう一方のフィールドで ? (疑問符) を使用する必要があります。
- ということでこれはもう**こういう決まり**と覚えてください(笑
なので、日付を指定する場合は曜日に?
、曜日を指定する場合は日付に?
を必ず付けてください
- ということでこれはもう**こういう決まり**と覚えてください(笑
例1 : 毎月の1日(曜日は問わない)の0時0分に実行
0 0 1 * ? *
例2 : 毎週の日曜日(日付は問わない)の0時0分に実行
0 0 ? * SUN *
最後に
- AWSのCloudWatchEventsのルールのスケジュールでCron式を設定する際に、ルール作成までしなくても、正しい設定の場合は、以降10回分の実行タイミングが表示されるので、試しにやってみるとわかりやすいと思います!