cronuru
Dialect

AWS EventBridge Cron

AWS EventBridge uses a 6-field cron format derived from Quartz — minute, hour, day-of-month, month, day-of-week, year — with a mandatory `?` placeholder in one of the two day fields. All expressions evaluate in UTC; per-rule timezones are not supported. Minimum interval is 1 minute.

Quick reference

Fields
minute hour day-of-month month day-of-week year
Minute range
0–59
Hour range
0–23
Day-of-month range
1–31 or ? L W
Month range
1–12 or JAN–DEC
Day-of-week range
1–7 (Sun=1, Sat=7) or SUN–SAT, plus ? L #
Year range
1970–2199
Seconds
Not supported (use EventBridge Scheduler's rate expression for sub-minute)
Default timezone
UTC only (no per-rule timezone for legacy EventBridge rules; EventBridge Scheduler supports timezones)
Minimum interval
1 minute
Expression syntax
`cron(...)` wrapper required in EventBridge rules

Examples

Expression Description
0 0 * * ? * Daily at midnight UTC
*/5 * * * ? * Every 5 minutes
0 9 ? * MON-FRI * Weekdays at 09:00 UTC
0 0 L * ? * Last day of every month at midnight
0 0 ? * 1#1 * First Sunday of every month at midnight (Sun=1, #1=first)
0 12 1,15 * ? * Noon on the 1st and 15th of every month
0 0 1 1 ? 2030 Midnight on January 1st, 2030 (year-specific)

Gotchas

  • **The `?` is mandatory.** Exactly one of day-of-month and day-of-week must be `?` — EventBridge rejects expressions where both are specific values. `0 9 * * MON *` is invalid; write `0 9 ? * MON *`.
  • Day-of-week numbering: Sunday is 1 (not 0 like Unix). Weekday range is `2-6` (Mon-Fri) or `MON-FRI`. Use name form whenever possible — avoids the off-by-one bug.
  • Always UTC. To run at 9 AM Pacific, you'd need 17:00 UTC during standard time and 16:00 UTC during daylight time. There's no native DST handling for classic EventBridge rules — use EventBridge Scheduler (newer service) if timezone-aware scheduling matters.
  • Expressions must be wrapped in `cron(...)`. The full schedule string in a CloudFormation template or Terraform resource is `cron(*/5 * * * ? *)`, not `*/5 * * * ? *`.
  • Year field is required even if you want "any year" — use `*`. EventBridge will reject a 5-field expression.

Used by

  • AWS EventBridge Scheduler
  • AWS Lambda scheduled invocations (via EventBridge rules)
  • Amazon ECS scheduled tasks
  • AWS CodePipeline scheduled triggers
  • AWS Glue scheduled crawlers and jobs

AWS EventBridge cron is essentially a stripped-down Quartz (no seconds, year required). The ? placeholder and Sun=1 numbering are the most common porting bugs when copying expressions from Linux crontab or Kubernetes CronJob.

References

Frequently asked questions

Why does AWS EventBridge use 6 fields instead of 5?
EventBridge derived its syntax from Java's Quartz Scheduler, which has 6 fields (or 7 with year). EventBridge keeps the year field at the end but drops the seconds field at the start. The result is `minute hour day-of-month month day-of-week year` — 6 fields total.
What does `cron(0 0 * * ? *)` mean?
Minute `0`, hour `0` (midnight), day-of-month `*` (any), month `*` (any), day-of-week `?` (placeholder), year `*` (any). So the rule fires daily at 00:00 UTC. The `?` in day-of-week is required because day-of-month is set to `*` — EventBridge needs exactly one of those fields to be `?` or a specific value.
Can EventBridge schedule a job at a non-UTC time?
The classic EventBridge rules cron expressions are always UTC. The newer EventBridge Scheduler service supports per-schedule timezones via the `ScheduleExpressionTimezone` parameter. If you need timezone-aware scheduling, migrate from rules to Scheduler.
What's the minimum interval for EventBridge cron?
1 minute. For sub-minute scheduling, EventBridge Scheduler offers `rate()` expressions like `rate(30 seconds)` (minimum 30 seconds for some target types). Classic EventBridge rules cron is capped at 1-minute granularity.
Can I use Unix cron syntax in EventBridge?
Not directly — EventBridge requires 6 fields with year, and uses `?` instead of one of the two day fields. A Unix expression like `*/5 * * * *` becomes `*/5 * * * ? *` in EventBridge: drop the requirement that day-of-week be a specific value by setting it to `?`, then add `*` as the year.