* Cron Dialect
AWS EventBridge (6 Fields)
* Quick Answer
AWS EventBridge (formerly CloudWatch Events) supports two expression formats: cron() for calendar-based schedules and rate() for simple recurring intervals. The cron() format is a 6-field variant requiring a year field and the ? operator in either DOM or DOW. All times are UTC with no timezone support — a critical operational consideration for global applications.
Field Reference
This dialect uses 6 fields. Fields are listed left to right as they appear in the expression.
| Position | Field | Range | Special Chars | Notes |
|---|---|---|---|---|
| 1 | Minute | 0–59 | * , - / | |
| 2 | Hour | 0–23 | * , - / | UTC only. No timezone conversion available. |
| 3 | Day of Month | 1–31 | * , - / ? L W | Use ? if DOW is specified. L = last day of month. W = nearest weekday. |
| 4 | Month | 1–12 | * , - / | Named: JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC. |
| 5 | Day of Week | 1–7 (SUN=1) | * , - / ? L # | SUN=1, MON=2, TUE=3, WED=4, THU=5, FRI=6, SAT=7. Named values also valid. |
| 6 | Year | 1970–2199 | * , - / | Required. Use * for all years on recurring schedules. |
Special Characters
AWS uses the same special character set as Quartz: ? (no specific value, required in DOM or DOW), L (last day of month or last weekday of month), W (nearest weekday), and # (Nth weekday). The key difference from Quartz is that ? is mandatory — AWS will reject an expression where both DOM and DOW contain specific values or both contain *. Always use ? in the field you are not constraining.
Examples
Every day at 12:00 PM UTC
Midday Lambda invocations, noon UTC data exports, daily price feeds.
Weekdays at 8:00 AM UTC
Business-hours Lambda functions, morning report triggers, market-open processing.
First day of every month at midnight UTC
Monthly billing Lambda, S3 data archiving, monthly SES digest.
Last day of every month at midnight UTC
Month-end close, final monthly snapshot, EOM data exports.
Every 5 minutes
Simple polling patterns — health checks, queue draining, lightweight monitoring.
Every hour
Hourly Lambda functions, periodic cache refresh, hourly aggregations.
Monitor your EventBridge schedules in production
Get alerted the moment this cron job fails, is late, or doesn't run. BetterStack tracks execution, duration, and output — no infrastructure required.
Common Gotchas
UTC only — no timezone support in cron()
AWS EventBridge cron expressions always execute in UTC. If you want a job at 9 AM New York time (UTC-5), you must write cron(0 14 ? * MON-FRI *). During daylight saving, you need to update the expression manually — or use EventBridge Scheduler (a newer service) which supports IANA timezone strings.
? is mandatory, not optional
Unlike Quartz where ? is conventional, AWS enforces it. An expression with * in both DOM and DOW (e.g. cron(0 12 * * * *)) will be rejected with a validation error. You must use ? in exactly one of the two fields.
DOW numbering: SUN=1, not SUN=0
AWS uses 1-based DOW numbering starting from Sunday (SUN=1, SAT=7), the same as Quartz. A standard cron '5' means Friday; in AWS cron(…? * 5 *) means Thursday. Using named values (MON, TUE, etc.) avoids this confusion entirely.
rate() does not guarantee exact alignment
A rate(1 hour) rule fires approximately every hour from the time the rule was created or last enabled, not necessarily on the hour boundary. If you need alignment to clock hours (e.g. exactly :00 each hour), use cron(0 * * * ? *) instead.
Minimum rate is 1 minute; maximum cron precision is 1 minute
AWS EventBridge does not support sub-minute schedules. rate(30 seconds) is invalid. The finest granularity is rate(1 minute) or cron(*/1 * * * ? *). For sub-minute Lambda invocations, consider a separate orchestration pattern.
Porting from Standard Cron
Converting from standard 5-field to AWS cron(): wrap in cron(), append a * year field, change DOW values by adding 1 (0-based Sunday becomes 1), and add ? to whichever of DOM or DOW you are not specifying. Standard '0 12 * * *' becomes cron(0 12 * * ? *). Standard '0 9 * * 1-5' (Mon-Fri) becomes cron(0 9 ? * MON-FRI *) — using named values sidesteps the numbering shift.
How This Dialect Differs from Standard Cron
AWS EventBridge cron expressions use 6 fields: Minutes, Hours, Day-of-month, Month, Day-of-week, Year. The Year field (1970–2199) is mandatory. Day-of-month and Day-of-week are mutually exclusive — one must always be ? (no specified value). The W (nearest weekday) and L (last) special characters are supported. AWS uses 1–7 for Sunday–Saturday in the Day-of-week field (Sunday = 1), unlike standard cron where Sunday = 0 or 7. Standard cron expressions require the Year field and ? adjustment before use in EventBridge.
| Aspect | Standard Cron | AWS |
|---|---|---|
| Field count | 5 fields | 6 fields |
| Seconds precision | No | No |
| Year field | No | Optional / Required |
| Special chars beyond * , - / | None | L W ? |
| DOM / DOW conflict rule | OR combination | Mutually exclusive — one must be ? |