EventBridgeのCron設定でハマったところと解決方法をメモしておきます。
目次
EventBridge
EC2を定期的に実行させたいときに起動、それ以外シャットダウンという運用をしており、AWSサービスの1つである、EventBridgeを利用しています。
EventBridgeでは、Cron式を設定してスケジュールを決めているのですが、設定するのにはまったところをメモしておきます。
書式
cron(分 時間 日付 月 曜日 年)
書式は上記の通りです。
日付と曜日は片方のみ指定可能
crontabであれば設定できるようですが、EventBridgeではそのような指定はできないようです。(少なくともコンソールでの登録では)。そして少しクセもあります。
例えば「毎日の12:00」とするケース、
×:間違い
cron(00 12 * * * *)
〇:正解
cron(00 12 * * ? *)
これはAWSのルールスケジュール式の定義に、
cron 式の日フィールドと曜日フィールドを同時に指定することはできません。一方のフィールドに値 (または *) を指定する場合、もう一方のフィールドで ? (疑問符) を使用する必要があります。
引用:ルールのスケジュール式/AWS
と記載があります。
日付・時刻・曜日はUTC基準
日付、時刻については「ローカルタイム」の表示にできるのでイメージしやすいので間違うことはないでしょう。問題は曜日指定です。
前提として、曜日は値として日曜日を基準に、「1~7」あるいは「SUN~SAT」のどちらかの値を利用可能です。
例えば「日曜日の朝3時」
×:間違い
cron(00 18 * * 1 *)
〇:正解
cron(00 18 * * 7 *)
日曜日(1)のはずなのに、土曜日(7)を指定?
これは日本とUTC、つまり世界標準時の時差が原因です。よって曜日を指定する際は下記のような考慮が必要です。
UTC | | | JST | | |
---|
FROM | TO | 曜日 | FROM | TO | 曜日 |
---|
00:00 | 14:59 | N | 09:00 | 23:59 | N |
15:00 | 23:59 | N | 00:00 | 08:59 | N+1 |
日本時間はUTC+9なので、数値は-9すればOK。これはまあわかりやすい。
そして曜日ですが、上図のように日本時間の「00:00~08:59」というのは微妙なゾーンであり、この間の時間帯というのはまだUTC的には前日です。
つまり日本の日曜日のつもりで指定したのに、UTC基準なので実は火曜日になっていることになります。
ややこしいのですが、日本時間00:00~08:59の間を指定する際は、下記のようにすればOKです。
JST | 日本時間 | | |
---|
曜日 | From | To | Cron |
---|
日 | 00:00 | 08:59 | 7 |
日 | 09:00 | 23:59 | 1 |
月 | 00:00 | 08:59 | 1 |
月 | 09:00 | 23:59 | 2 |
火 | 00:00 | 08:59 | 2 |
火 | 09:00 | 23:59 | 3 |
水 | 00:00 | 08:59 | 3 |
水 | 09:00 | 23:59 | 4 |
木 | 00:00 | 08:59 | 4 |
木 | 09:00 | 23:59 | 5 |
金 | 00:00 | 08:59 | 5 |
金 | 09:00 | 23:59 | 6 |
土 | 00:00 | 08:59 | 6 |
土 | 09:00 | 23:59 | 7 |
例えば「月曜から金曜の朝3時」と指定する場合は
×:間違い
cron(00 18 ? * 2-6 *)
〇:正解
cron(00 18 ? * 1-5 *)
となります。
まとめ
これで基本的なAWSにおけるCron式は設定できます。
式はレビューできますので、いろいろ試してみるのも手です。
また設定で引っかかった所があれば更新します。
コメント