aws eventbridge cloud

AWS EventBridge: Cron vs Rate Expressions — When to Use Each

by Sinthuyan  · April 6, 2026

AWS EventBridge supports two scheduling expression formats: rate() for simple recurring intervals and cron() for calendar-based schedules. Choosing the right format upfront saves you from rewriting rules when business requirements inevitably add "but only on weekdays" or "except in July."

Rate Expressions

Rate expressions are the simpler option. They define a fixed interval between invocations: rate(5 minutes), rate(1 hour), rate(1 day). The singular form is required for a value of 1 — rate(1 minute), not rate(1 minutes). The minimum interval is 1 minute.

Use rate expressions when: the exact time of day doesn't matter, you only need a recurring interval, and the rule will never need weekday or month restrictions. Health checks, polling jobs, and cache warmers are good candidates. Once you need "run at 9 AM but not on weekends," a rate expression can't do it — switch to cron.

EventBridge Cron Fields

EventBridge cron uses six fields: minutes, hours, day-of-month, month, day-of-week, year. There is no seconds field (unlike Quartz), but there is a mandatory year field (unlike standard Unix cron). The year range is 1970–2199.

The year field makes EventBridge cron useful for one-off scheduled events: cron(0 10 15 4 ? 2027) runs exactly once at 10:00 AM UTC on April 15, 2027. This is a common pattern for compliance cutoffs, product launches, or one-time data migrations where you want the scheduler to fire a Lambda at a precise future date without setting a reminder.

The ? Constraint

EventBridge enforces a constraint that exactly one of day-of-month or day-of-week must be ?. Unlike standard cron (which applies OR logic when both are set), EventBridge rejects expressions where both fields are non-wildcard. You cannot schedule a job "on the 1st and also on Mondays."

Common valid patterns:

  • cron(0 2 * * ? *) — every day at 2:00 AM UTC
  • cron(0 9 ? * MON-FRI *) — weekdays at 9:00 AM UTC
  • cron(0 0 1 * ? *) — first day of every month at midnight UTC
  • cron(0 18 L * ? *) — last day of every month at 6:00 PM UTC

All Times Are UTC

EventBridge Rules (the older product) evaluate all expressions in UTC with no native timezone support. If your job must run at 9 AM New York time, you need to calculate the UTC offset and document it explicitly: 14:00 UTC = 9 AM EST, 13:00 UTC = 9 AM EDT — and you need to update the rule when clocks change twice a year.

EventBridge Scheduler (the newer product) solves this with a per-schedule ScheduleExpression Timezone field. If you're starting a new project, prefer EventBridge Scheduler over EventBridge Rules for any time-sensitive schedule.

Production Examples

  • Nightly database backup at 2 AM UTC: cron(0 2 * * ? *)
  • Weekday business report at 9 AM UTC: cron(0 9 ? * MON-FRI *)
  • End-of-month settlement job: cron(0 23 L * ? *)
  • Quarterly data archive (first day of Q1, Q2, Q3, Q4): cron(0 1 1 1,4,7,10 ? *)

Common Mistake

Setting both DOM and DOW to non-wildcard values fails validation with the error "Support for specifying both a day-of-week and a day-of-month parameter is not supported." The fix is always to replace one of them with ?. If the current expression uses * in both, replace the one you don't need with ?.

Related Guides