使い方ガイド公開日 読了目安 約11分

EventBridge の cron 式の書き方|? の意味・曜日の数字・日本時間の指定と crontab からの書き換え

AWS で Lambda や ECS のタスクを定期実行するときに使う EventBridge の cron 式は、Linux の crontab と似ているようで、欄の数・? の使い方・曜日の数字・タイムゾーンが少しずつ違います。crontab の感覚で「0 9 * * 1-5」と書くとエラーになり、曜日の数字をそのまま移すと 1 日ずれ、時刻は UTC で読まれて 9 時間ずれる、とつまずきどころが重なります。この記事では、EventBridge の cron 式の 6 つの欄と ? のルール、曜日の数字、L・W・# の使い方、rate 式との違い、ルールと Scheduler での日本時間の扱い、crontab・Kubernetes・Spring・systemd との書き換え表までをまとめます。

EventBridge の cron 式は「6 つの欄」を cron( ) で囲む

EventBridge のスケジュールは、cron( ) か rate( ) のどちらかで書きます。cron( ) の中には、crontab の 5 つの欄に「年」を加えた 6 つの値を空白で区切って並べます。年の欄は省略できないので、年を問わない場合も末尾に * を書きます。

順番欄書ける値使える記号
1 つ目分0〜59, - * /
2 つ目時0〜23, - * /
3 つ目日1〜31, - * ? / L W
4 つ目月1〜12 または JAN〜DEC, - * /
5 つ目曜日1〜7 または SUN〜SAT, - * ? L #
6 つ目年1970〜2199, - * /

たとえば「平日(月〜金)の 0:00(UTC)」は「cron(0 0 ? * MON-FRI *)」です。crontab の「0 0 * * 1-5」と比べると、日の欄が ? になり、曜日が英語の略称になり、最後に年の * が増えています。この 3 点が、crontab から移すときに必ず直す場所です。

? のルール:日か曜日のどちらかを必ず ? にする

EventBridge でいちばんエラーになりやすいのが ? の扱いです。? は「この欄では指定しない(もう片方の欄で決める)」という意味で、日(3 つ目)か曜日(5 つ目)の、ちょうどどちらか一方に書きます。両方を * にすることも、両方を ? にすることもできません。

やりたいこと正しい書き方よくある誤り
毎日 9:00cron(0 9 * * ? *)cron(0 9 * * * *)(両方 *)
平日 9:00cron(0 9 ? * MON-FRI *)cron(0 9 * * MON-FRI *)(日が *)
毎月 1 日 9:00cron(0 9 1 * ? *)cron(0 9 1 * * *)(曜日が *)
毎週月曜 9:00cron(0 9 ? * MON *)cron(0 9 ? * ? *)(両方 ?)

覚え方はシンプルで、「曜日で決めるなら日を ?、日付で決めるなら曜日を ?、毎日なら日を * にして曜日を ?」です。この仕組みのため、crontab のような「日か曜日のどちらか(OR)」も、Spring のような「両方(AND)」も、1 つのルールでは書けません。「毎月 1 日と毎週金曜」のような指定は、日付のルールと曜日のルールの 2 つに分けます。

曜日の数字は 1 が日曜:crontab と 1 つずれる

crontab では 0 が日曜・1 が月曜ですが、EventBridge では 1 が日曜・2 が月曜…7 が土曜です。数字を書き写すと、すべての曜日が 1 日前にずれます。

曜日crontabEventBridge英語の略称
日曜0(7 も可)1SUN
月曜12MON
火曜23TUE
水曜34WED
木曜45THU
金曜56FRI
土曜67SAT
平日(月〜金)1-52-6MON-FRI

crontab の「1-5」をそのまま EventBridge に書くと、日曜〜木曜(SUN-THU)になり、月曜の処理が日曜に動いて金曜には動かない、という分かりにくい不具合になります。EventBridge では MON-FRI のように英語の略称で書くと、数字のずれを気にせずに済むのでおすすめです。

L・W・# で月末・平日・第 n 曜日を書く

EventBridge の cron 式は、crontab では書けない「月末」「第 n ○曜日」などを直接表せます。日次・月次のバッチでよく使うので、代表的な書き方を覚えておくと便利です。

書き方意味式の例2026 年 10 月以降の実行日
日の Lその月の末日cron(0 0 L * ? *)10/31・11/30・12/31・1/31・2/28
日の L-3末日の 3 日前cron(0 9 L-3 * ? *)10/28・11/27・12/28
日の 15W15 日に一番近い平日cron(0 9 15W * ? *)10/15(木)・11/16(月)・12/15(火)
日の LWその月の最終平日cron(0 18 LW * ? *)10/30(金)・11/30(月)・12/31(木)
曜日の 3#2第 2 火曜(3 が火曜)cron(0 10 ? * 3#2 *)10/13・11/10・12/8
曜日の 6L最終金曜(6 が金曜)cron(0 18 ? * 6L *)10/30・11/27・12/25

# と L は曜日の数字と組み合わせるので、ここでも「1 が日曜」のずれに注意が必要です。crontab の感覚で第 2 火曜を「2#2」と書くと、第 2 月曜になります。W は「指定した日が土日なら、同じ月の中で一番近い平日」に動き、月をまたぎません。2026 年 11 月 15 日は日曜なので、15W は翌日の 16 日(月)に動きます。

rate 式との違い:「ごと」は始めた時刻から数える

単純な間隔なら、cron の代わりに rate( ) も使えます。rate(5 minutes)・rate(1 hour)・rate(7 days) のように、数字と単位(minute・hour・day)を書きます。

  • 1 のときは単数形、2 以上は複数形で書く。rate(1 hours) や rate(5 minute) はエラーになる
  • 間隔はルールを作成(または有効化)した時刻から数えるため、「毎時 0 分」のように時刻をそろえることはできない
  • 「毎時 0・15・30・45 分ちょうど」に動かしたいなら、rate(15 minutes) ではなく cron(0/15 * * * ? *) を使う
  • 週や月の単位はないので、毎週・毎月の処理は cron で書く

EventBridge の cron 式では、間隔の始まりを「0/15」のように数字で書くのが一般的です(「*/15」と同じ意味です)。ログの集計など、時刻がそろっていたほうが後で扱いやすい処理は cron、ヘルスチェックのように間隔だけが大事な処理は rate、と使い分けるとよいでしょう。

日本時間で動かす:ルールは UTC、Scheduler はタイムゾーンを選べる

EventBridge には、スケジュールを作る方法が 2 つあります。昔からある「EventBridge ルール(Rules)」と、2022 年に追加された「EventBridge Scheduler」です。cron 式の書き方は同じですが、タイムゾーンの扱いが違います。

EventBridge ルールEventBridge Scheduler
cron 式のタイムゾーンUTC 固定ScheduleExpressionTimezone で指定(Asia/Tokyo など)
平日 9:00(日本時間)の書き方cron(0 0 ? * MON-FRI *)cron(0 9 ? * MON-FRI *)+タイムゾーン Asia/Tokyo
1 回だけの実行できないat(2026-12-01T09:00:00) で指定できる
夏時間のある地域自分で時刻を直す必要があるタイムゾーンに合わせて自動で調整

ルールで日本時間に合わせる場合は、GitHub Actions と同じく 9 時間引いた UTC の時刻を書きます。日本時間の 0〜8 時は前の日の UTC になるので、曜日も 1 つ戻します。たとえば日本時間の平日 8:00 は、UTC の日〜木 23:00 なので「cron(0 23 ? * SUN-THU *)」です。この計算の詳しい手順はGitHub Actions の cron を日本時間で動かす方法で解説しています。新しく作るなら、タイムゾーンを指定できる Scheduler を使うほうが、時差の計算ミスが起きず安全です。

crontab・Kubernetes・Spring・systemd との書き換え表

同じスケジュールを、よく使う仕組みごとの書き方で並べました。時刻はそれぞれの仕組みで指定したタイムゾーンでの時刻です(EventBridge ルールと GitHub Actions は UTC)。

スケジュールcrontab・KubernetesEventBridgeSpring @Scheduledsystemd OnCalendar
毎日 3:3030 3 * * *cron(30 3 * * ? *)0 30 3 * * **-*-* 03:30:00
平日 9:000 9 * * 1-5cron(0 9 ? * MON-FRI *)0 0 9 * * MON-FRIMon..Fri *-*-* 09:00:00
15 分ごと*/15 * * * *cron(0/15 * * * ? *)0 */15 * * * **-*-* *:00/15:00
毎月 1 日 0:000 0 1 * *cron(0 0 1 * ? *)0 0 0 1 * **-*-01 00:00:00
毎月末日 23:00書けない(28-31+判定)cron(0 23 L * ? *)0 0 23 L * **-*~01 23:00:00
第 2 火曜 10:00書けない(8-14+判定)cron(0 10 ? * 3#2 *)0 0 10 ? * TUE#2Tue *-*-08..14 10:00:00
  • Kubernetes CronJob は crontab と同じ 5 つの欄。1.27 以降は spec.timeZone: Asia/Tokyo で日本時間を指定でき、schedule の中に CRON_TZ= を書く方法は使えない
  • Spring は先頭に秒の欄がある 6 つの欄。@Scheduled(cron = "0 0 9 * * MON-FRI", zone = "Asia/Tokyo") のように zone でタイムゾーンを指定できる
  • systemd timer の OnCalendar は「曜日 年-月-日 時:分:秒」の形。~01 は「月末から数えて 1 日目」、つまり末日を表す

cron 式チェッカーでは、書き方の種類に AWS EventBridge を選んで式を貼ると、? の付け忘れや曜日の数字のずれを知らせ、日本語訳と次の実行日時を表示します。crontab の式を入れれば、EventBridge・Kubernetes・Spring・systemd の書き方への書き換えも一度に確認できます。日と曜日の OR の違いが絡む移植は、cron の日と曜日の OR と第 n 曜日・月末の書き方もあわせて確認してください。

よくある質問

EventBridge の cron 式の ? はどういう意味ですか?
「この欄では指定しない」という意味で、日か曜日のどちらか一方に必ず書きます。曜日で決めるなら日を ?、日付で決めるなら曜日を ? にします。毎日なら cron(0 9 * * ? *) のように日を *、曜日を ? にします。両方 * や両方 ? はエラーになります。
EventBridge で日本時間の 9 時に動かすにはどう書きますか?
EventBridge ルールは UTC で読まれるので、9 時間引いて cron(0 0 * * ? *) と書きます。EventBridge Scheduler なら、cron(0 9 * * ? *) と書いてタイムゾーン(ScheduleExpressionTimezone)に Asia/Tokyo を指定すれば、日本時間の 9:00 に動きます。
EventBridge の曜日の数字は何番が月曜ですか?
1 が日曜、2 が月曜…7 が土曜です。crontab(0 が日曜、1 が月曜)とは 1 つずれているので、平日は 2-6 になります。数字の取り違えを防ぐため、MON-FRI のように英語の略称で書くのがおすすめです。
EventBridge で 5 分ごとに実行するには cron と rate のどちらがいいですか?
間隔だけが大事なら rate(5 minutes) が簡単です。ただし rate はルールを作った時刻から数えるため、実行時刻は毎時 0・5・10 分にはそろいません。時刻をそろえたい場合は cron(0/5 * * * ? *) を使います。
EventBridge で crontab の「0 9 * * 1-5」はどう書き換えますか?
日を ?、曜日を MON-FRI(数字なら 2-6)にして、最後に年の * を足し、cron(0 9 ? * MON-FRI *) とします。さらに EventBridge ルールの場合は UTC で読まれるので、日本時間の 9:00 にしたいなら時を 0 にして cron(0 0 ? * MON-FRI *) とします。

この記事で紹介したツール

あわせて読みたい

使い方ガイド約11分

crontab の書き方と早見表|5 つの欄と記号の意味・よく使う例・登録のコマンド

「毎日 3 時にバックアップ」「5 分ごとに監視スクリプト」のような定期実行は、Linux では crontab に 1 行書くだけで設定できます。ただ、「分 時 日 月 曜日」の 5 つの欄と、* , - / という記号の組み合わせは、慣れないうちは読み間違えやすく、1 時間に 60 回動いてしまったり、7 分おきのつもりが 4 分おきになったりといった事故も起きがちです。この記事では、crontab の書き方の基本と記号の意味、そのまま使える早見表、crontab -e・-l・-r の使い方、コマンド部分を書くときの注意点までを、例を中心に解説します。

記事を読む →
使い方ガイド約12分

cron が動かない原因チェックリスト|手動では動くのに失敗する理由とログの確認方法

crontab に書いたはずのバッチが動いていない。ターミナルで手で実行すると成功するのに、cron からだと何も起きない。cron のトラブルは、エラーがどこにも表示されないまま静かに失敗することが多く、原因を探すのに時間がかかりがちです。この記事では、cron が動かないときに確かめる順番を「式」「cron 本体」「ログ」「実行環境」「ファイルと権限」「タイムゾーン」に分けて整理し、手動では動くのに cron だと失敗する典型的な理由と、その直し方をまとめます。

記事を読む →
使い方ガイド約11分

GitHub Actions の cron を日本時間で動かす|UTC 変換の早見表と曜日ずれ・遅延の対策

GitHub Actions の schedule に「0 9 * * 1-5」と書いたのに、ワークフローが動いたのは日本時間の夕方 6 時だった。これは書き間違いではなく、GitHub Actions の cron が必ず UTC(協定世界時)で読まれるためです。この記事では、日本時間(JST)の時刻を UTC の cron 式に直す計算と早見表、朝 0〜8 時を指定したときに起きる「曜日・日付が前の日にずれる」問題、1 行で書けないときの 2 行への分け方、そして schedule が遅れる・動かないときの原因と対策までをまとめます。

記事を読む →