Home › AWS EventBridge Cron Generator

AWS Cron Jobs: EventBridge Expression Generator

Generate and validate AWS cron expressions for EventBridge, Lambda, Glue, ECS and Batch. AWS uses a 6-field format with a mandatory Year field. All times are UTC. Either day-of-month or day-of-week must be ?.

AWS EventBridge Cron Generator

Build your AWS cron expression below. The generator enforces AWS rules: one of day-of-month or day-of-week must be ?. All times are UTC.

Quick presets

Either Day or Weekday must be ? - AWS EventBridge does not allow both to be set.
* * ? * * *

Runs every minute (UTC)

Use in AWS Console

EventBridge Scheduler rule (wrap with cron()):

cron(* * ? * * *)

AWS CLI / CloudFormation:

ScheduleExpression: "cron(* * ? * * *)"

AWS EventBridge Cron Rules

Always 6 fields

AWS EventBridge requires exactly 6 fields. The 6th field is Year and accepts * for any year or a specific 4-digit year.

Day-of-month OR Day-of-week, never both

You cannot set both Day and Weekday to specific values - one must be ?. If you set Day to 15, Weekday must be ?. If you set Weekday to MON-FRI, Day must be ?.

AWS day-of-week: SUN=1, not 0

AWS EventBridge numbers days 1-7, starting with Sunday=1 (not 0 like Linux cron). Use named values (MON, TUE, WED, THU, FRI, SAT, SUN) to avoid confusion - MON-FRI is clearer than 2-6.

Everything is UTC

AWS EventBridge cron schedules always run in UTC. There is no timezone configuration at the rule level. If you need local time, convert to UTC before writing the expression, or use EventBridge Scheduler which does support timezones.

Minimum interval: 1 minute

EventBridge does not support sub-minute scheduling. For more frequent execution, use a Lambda function that loops internally, or Step Functions.

Cron vs Rate expressions

AWS supports both. rate(5 minutes) is simpler for uniform intervals. Use cron() when you need a specific time of day, specific days, or a schedule that does not fit a simple interval. See the AWS EventBridge Scheduler docs.

Validate before deploying

Invalid AWS cron expressions are rejected at deploy time. Validate first:

AWS Cron Validator

Lambda, Glue, ECS, CDK and Batch

Lambda cron job - daily at 2 AM UTC

cron(0 2 * * ? *)

Glue job - weekdays at 6 AM UTC

cron(0 6 ? * MON-FRI *)

ECS scheduled task - first of month

cron(0 8 1 * ? *)

AWS CDK Schedule.cron()

Schedule.cron({
  minute: '0',
  hour: '2',
  day: '*',
  month: '*'
})

CDK handles the ? rule automatically. Omitted fields default to *.

AWS Batch scheduled job

cron(0 3 ? * MON-FRI *)

AWS Batch uses EventBridge Scheduler to trigger job queues. Same 6-field UTC syntax.

AWS Cron Expression Examples

ExpressionDescriptionNotes
* * * * ? *Every minuteAll UTC times
*/5 * * * ? *Every 5 minutes
0 * * * ? *Every hour
0 0 * * ? *Daily at midnight UTC
0 2 * * ? *Daily at 2:00 AM UTCCommon for Lambda backups
0 9 ? * MON-FRI *Weekdays at 9:00 AM UTC
0 0 1 * ? *First of every month at midnight
0 0 ? * 1 *Every Sunday at midnight UTCSUN=1 in AWS
0 6 ? * MON-FRI *Weekdays at 6 AM UTCCommon for Glue jobs
0 8 1 * ? *First of month at 8 AM UTCMonthly reports
0 */6 * * ? *Every 6 hours
30 8 ? * MON *Every Monday at 8:30 AM UTC

AWS Invalid Cron Expression - Common Errors

Both Day and Weekday set

cron(0 9 15 * FRI *)  # invalid
cron(0 9 15 * ? *)   # correct: day set, weekday ?
cron(0 9 ? * FRI *)  # correct: weekday set, day ?

AWS rejects the expression at rule creation time with an InvalidScheduleException.

Missing Year field

cron(0 9 * * FRI)    # invalid - 5 fields
cron(0 9 ? * FRI *)  # correct - 6 fields

The Year field is mandatory. Always add * as the 6th field unless you need a specific year.

Using Linux day-of-week numbering

cron(0 9 ? * 0 *)    # 0=Sunday in Linux, invalid in AWS
cron(0 9 ? * 1 *)    # 1=Sunday in AWS, correct
cron(0 9 ? * SUN *)  # clearest, no ambiguity

Using * instead of ? when specifying the other field

cron(0 9 * * MON-FRI *)  # ambiguous in AWS
cron(0 9 ? * MON-FRI *)  # correct

When you specify a weekday, the day-of-month field must be ?, not *. AWS treats * and ? differently.