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.