AWS Guide

AWS EventBridge Cron Expression Guide

Everything you need to know about writing, reading, and debugging cron expressions for AWS EventBridge Scheduler — including the 6-field format AWS uses.

2,800+ words 30+ examples Updated April 2026
📋 Table of Contents
  1. What is AWS EventBridge Scheduler?
  2. Cron vs Rate Expressions
  3. The 6-Field AWS Cron Syntax Explained
  4. Field Values, Wildcards & Special Characters
  5. 30 Real AWS EventBridge Cron Examples
  6. AWS Crontab vs Standard Linux Crontab
  7. Common Mistakes & How to Fix Them
  8. Real-World Use Cases
  9. Frequently Asked Questions
  10. Generate Your AWS Cron Expression

What is AWS EventBridge Scheduler?

AWS EventBridge Scheduler — officially called Amazon EventBridge — is Amazon's fully managed, serverless scheduling service. It lets you schedule tasks — running a Lambda function, invoking an API, triggering an ECS task — at a specific time or on a recurring basis, without managing any infrastructure.

Unlike older AWS solutions like CloudWatch Events (which EventBridge replaced), EventBridge Scheduler is purpose-built for scheduling. It supports two types of schedule expressions: rate expressions (simple recurring intervals) and cron expressions (fine-grained, calendar-based control).

If you need your Lambda to run every 5 minutes, a rate expression works. But if you need it to run every Monday at 9:00 AM UTC, except in December — that's where AWS cron expressions shine.

✓ Free Tier
AWS EventBridge Scheduler includes 14 million invocations per month in the free tier. Beyond that, it costs $1 per million invocations — making it extremely affordable for most production workloads.

EventBridge Scheduler can invoke over 270 AWS service targets and more than 6,000 API operations. This means you can schedule not just Lambda, but also SQS, SNS, Step Functions, ECS, Glue, and virtually any AWS service that has an API.

Cron vs Rate Expressions in EventBridge

Before diving into cron syntax, it's worth understanding when to use which:

Rate Expression

Simple repeating intervals. Easy to write but limited control.

rate(5 minutes)
rate(1 hour)
rate(7 days)

✓ Good for: heartbeats, polling, simple cleanup jobs

Cron Expression ← This Guide

Calendar-based precision. Run at exact times, specific days, months.

cron(0 9 ? * MON-FRI *)
cron(30 18 1 * ? *)
cron(0 0 1 1 ? *)

✓ Good for: business logic, reports, billing cycles, backups

Both are wrapped in cron(...) or rate(...) when entered in the AWS console or via CloudFormation/CDK. The cron() wrapper is unique to AWS — standard Linux crontab does not use it.

The 6-Field AWS Cron Syntax Explained

This is the most important thing to understand about AWS EventBridge cron: it uses 6 fields, not 5 like standard Linux/Unix cron. The extra field is a Year field at the end.

cron( Minutes Hours Day-of-month Month Day-of-week Year )
Minutes
0–59
Hours
0–23
Day-of-Month
1–31
Month
1–12
Day-of-Week
1–7 (SUN=1)
Year
1970–2199

Here's a concrete example. This expression runs every weekday (Monday–Friday) at 9:00 AM UTC:

cron(0 9 ? * MON-FRI *)
     │   │   │   │     │        └── Year: every year
     │   │   │   │     └────────── Day-of-week: Monday to Friday
     │   │   │   └──────────────── Month: every month
     │   │   └──────────────────── Day-of-month: ? (not specified)
     │   └──────────────────────── Hours: 9 AM UTC
     └──────────────────────────── Minutes: at :00
⚠ Critical Rule
In AWS EventBridge, you cannot specify both Day-of-month and Day-of-week at the same time. One of them must always be ? (meaning "no specific value"). This is different from standard cron and trips up many developers.

Field Values, Wildcards & Special Characters

AWS EventBridge cron expressions support a rich set of special characters that give you fine-grained control:

CharacterMeaningExampleUse in Fields
*Any/All values* * * * ? * — every minuteAll fields
?No specific value (placeholder)? * MON * — day-of-month not specifiedDay-of-month, Day-of-week only
-Range10-12 — hours 10, 11, 12All fields
,List of valuesMON,WED,FRI — those three daysAll fields
/Step / increment0/15 — every 15 minutes starting at 0All fields except Day-of-week
LLastL in Day-of-month = last day of monthDay-of-month, Day-of-week
WNearest weekday15W — nearest weekday to the 15thDay-of-month only
#Nth day of month2#1 — first Monday of monthDay-of-week only

Month and Day-of-Week Names

AWS EventBridge accepts both numeric values and 3-letter abbreviations for months and days:

Days of WeekValueMonthsValue
SUN1JAN1
MON2FEB2
TUE3MAR3
WED4APR4
THU5MAY5
FRI6JUN6
SAT7JUL–DEC7–12
ℹ️ Note on Sunday
In AWS EventBridge, Sunday = 1 (not 0 like in some Linux cron implementations). Always double-check day numbering when migrating expressions from Linux crontab to AWS.

30 Real AWS EventBridge Cron Examples

Below are production-ready AWS EventBridge cron expressions covering the most common scheduling patterns. Every expression uses the cron() wrapper required by AWS.

Every N Minutes / Hours

cron(0/5 * * * ? *)
Every 5 minutes
common
cron(0/15 * * * ? *)
Every 15 minutes
common
cron(0/30 * * * ? *)
Every 30 minutes
common
cron(0 * * * ? *)
Every hour at :00
common
cron(0 0/6 * * ? *)
Every 6 hours (midnight, 6 AM, noon, 6 PM)
useful
cron(0 0/12 * * ? *)
Twice a day — midnight and noon UTC
useful

Daily Schedules

cron(0 0 * * ? *)
Every day at midnight UTC
popular
cron(0 9 * * ? *)
Every day at 9:00 AM UTC
popular
cron(30 18 * * ? *)
Every day at 6:30 PM UTC
useful
cron(0 23 * * ? *)
Every day at 11 PM UTC (good for end-of-day jobs)
useful

Weekday / Weekend

cron(0 9 ? * MON-FRI *)
Every weekday at 9 AM UTC
popular
cron(0 8 ? * 2-6 *)
Mon–Fri at 8 AM (numeric days)
useful
cron(0 10 ? * SAT,SUN *)
Weekends only at 10 AM UTC
useful
cron(0 9 ? * MON *)
Every Monday at 9 AM — great for weekly reports
popular
cron(0 17 ? * FRI *)
Every Friday at 5 PM UTC
useful

Monthly Schedules

cron(0 0 1 * ? *)
First day of every month at midnight
popular
cron(0 0 L * ? *)
Last day of every month at midnight
useful
cron(0 9 15 * ? *)
15th of every month at 9 AM
useful
cron(0 9 1,15 * ? *)
1st and 15th of every month at 9 AM
useful
cron(0 0 ? * 2#1 *)
First Monday of every month at midnight
advanced
cron(0 0 ? * 6L *)
Last Friday of every month at midnight
advanced

Specific Dates / Years

cron(0 0 1 1 ? *)
New Year's Day — January 1st at midnight every year
useful
cron(0 12 25 12 ? *)
December 25th at noon every year
fun
cron(0 0 1 1 ? 2027)
One-time: January 1, 2027 at midnight
one-time
cron(0 9 1 * ? 2026-2028)
1st of every month at 9 AM, only for 2026–2028
advanced

Quarterly / Annual

cron(0 0 1 1,4,7,10 ? *)
First day of each quarter at midnight
popular
cron(0 9 1 JAN,APR,JUL,OCT ? *)
Same as above with month names
popular
cron(0 0 1 1 ? *)
Once a year — January 1st at midnight
annual

Need a custom AWS cron expression?

Use our free generator — it supports all 6 fields including the AWS-specific Year field, and generates the correct cron() wrapper format automatically.

⚙ Generate AWS Cron Expression Free →

AWS Crontab vs Standard Linux Crontab

If you're coming from Linux cron jobs, there are several important differences you need to know about before writing AWS EventBridge cron expressions. Getting these wrong is the #1 source of errors for developers migrating from traditional cron setups.

FeatureLinux CrontabAWS EventBridge Cron
Number of fields56 (includes Year)
Field orderMin Hour DOM Month DOWMin Hour DOM Month DOW Year
Sunday value0 or 71 (SUN=1, SAT=7)
DOM + DOW conflictBoth can be set simultaneouslyOne must be ?
Wrapper syntaxNo wrapper neededMust use cron()
TimezoneServer local timeUTC by default
Minimum interval1 minute1 minute
Year fieldNot supported1970–2199
L, W, # charactersNot always supportedFully supported

Converting Linux Crontab to AWS EventBridge

Here are the steps to convert a standard Linux crontab expression:

# Standard Linux crontab (5 fields):
0 9 * * 1-5    # 9 AM Mon-Fri (0=Sunday in Linux)

# AWS EventBridge equivalent:
cron(0 9 ? * MON-FRI *)
# Changes made:
# 1. Added ? for Day-of-month (required)
# 2. Changed 1-5 to MON-FRI (AWS SUN=1, so 1-5 in AWS = SUN-THU!)
# 3. Added * for Year at the end
# 4. Wrapped in cron()

Common Mistakes & How to Fix Them

Mistake 1: Specifying Both DOM and DOW

# ❌ WRONG — Both Day-of-month AND Day-of-week are set
cron(0 9 15 * MON *)

# ✅ CORRECT — Use ? for the one you don't need
cron(0 9 15 * ? *)     # 15th of every month
cron(0 9 ? * MON *)    # every Monday

Mistake 2: Forgetting the cron() Wrapper

# ❌ WRONG — Raw expression without wrapper
0 9 ? * MON-FRI *

# ✅ CORRECT — Always wrap in cron()
cron(0 9 ? * MON-FRI *)

Mistake 3: Wrong Sunday Number

# ❌ WRONG — Using 0 for Sunday (Linux style)
cron(0 9 ? * 0-4 *)    # This is SUN-THU in AWS!

# ✅ CORRECT — AWS: SUN=1, MON=2, ..., SAT=7
cron(0 9 ? * 2-6 *)    # Mon-Fri numeric
cron(0 9 ? * MON-FRI *) # Mon-Fri by name (clearer)

Mistake 4: Forgetting UTC Timezone

AWS EventBridge cron expressions run in UTC by default. If your users are in IST (UTC+5:30) and you want the job at 9 AM IST, you need to schedule it at 3:30 AM UTC:

# 9:00 AM IST = 3:30 AM UTC
cron(30 3 ? * MON-FRI *)
ℹ️ EventBridge Timezone Support
EventBridge Scheduler (the newer service) supports specifying a timezone directly in the schedule configuration, so you don't always need to manually convert. EventBridge Rules (the older mechanism) still requires UTC.

Real-World Use Cases for AWS EventBridge Cron

1. Daily Database Backups

# Run every day at 2:00 AM UTC (off-peak hours)
cron(0 2 * * ? *)

Trigger a Lambda that snapshots your RDS database, compresses the dump, and uploads it to S3. Combined with S3 lifecycle policies, this creates a cost-effective automated backup system.

2. Weekly Business Reports

# Every Monday at 6:00 AM UTC — report ready before US business day
cron(0 6 ? * MON *)

Lambda queries your analytics database, generates a PDF or CSV report, and emails it to stakeholders via SES — all before anyone starts their workday.

3. Monthly Billing Cycle Jobs

# First of every month at midnight UTC
cron(0 0 1 * ? *)

Trigger billing calculations, generate invoices, reset monthly usage counters, and send subscription renewal reminders.

4. API Key Rotation (Security)

# Every 90 days: Jan 1, Apr 1, Jul 1, Oct 1 at 1 AM UTC
cron(0 1 1 1,4,7,10 ? *)

Automatically rotate IAM access keys, API keys, and other credentials on a quarterly schedule — a security best practice.

5. End-of-Business Day Cache Flush

# Weekdays at 6 PM UTC (end of US East Coast business day)
cron(0 22 ? * MON-FRI *)

Flush Redis caches, clean up temporary DynamoDB records, or process end-of-day queues to keep your database lean overnight.

6. SaaS Trial Expiry Checks

# Every day at midnight — check for expired trials
cron(0 0 * * ? *)

Scan your user database for trials that expired in the last 24 hours, downgrade their account tier, and send a conversion email.

Frequently Asked Questions

Can AWS EventBridge cron run every second?

No, the minimum resolution for AWS EventBridge Scheduler and CloudWatch Events is 1 minute. If you need sub-minute executions (e.g., every 10 seconds), you will need to trigger a Lambda function every minute and use a loop with sleep() delays inside the code.

How do I write an AWS EventBridge cron in Terraform?

When provisioning infrastructure with Terraform, you use the schedule_expression argument inside the aws_cloudwatch_event_rule or aws_scheduler_schedule resource. You must include the wrapper: schedule_expression = "cron(0 9 ? * MON-FRI *)".

Why is my AWS cron not running at the correct local time?

Standard EventBridge rules evaluate cron expressions in UTC timezone. If you are not using the newer EventBridge Scheduler (which supports timezone selection), you must calculate the UTC offset manually. For example, 9:00 AM IST (UTC+5:30) is 3:30 AM UTC.

Are AWS cron expressions case-sensitive?

No, the day and month abbreviations (like MON, TUE, JAN, FEB) are case-insensitive. However, standard convention is to use uppercase for readability.

Generate Your AWS Cron Expression

Writing AWS cron expressions by hand is error-prone — especially keeping track of the UTC offset, the ? placeholder rule, and the 6-field format. That's exactly why we built CronRead.

Our generator supports the full AWS EventBridge 6-field cron format, gives you human-readable previews ("Runs every Monday at 9:00 AM UTC"), and validates your expression in real time. No more guessing whether your expression is correct before deploying.

🛠 Free AWS Cron Expression Generator

Build, validate, and understand your AWS EventBridge cron expressions instantly. Supports all 6 fields, special characters (L, W, #), and generates the cron() wrapper format.

Open CronRead Generator →

Summary

AWS EventBridge cron expressions give you precise calendar-based control over when your AWS workloads run. The key things to remember are:

1. AWS uses a 6-field format: Minutes Hours Day-of-month Month Day-of-week Year

2. Always wrap your expression in cron()

3. You cannot specify both Day-of-month and Day-of-week — one must be ?

4. Sunday is 1 in AWS (not 0 like Linux). Use named days (MON, TUE…) to avoid confusion.

5. All times are UTC unless you configure a timezone in EventBridge Scheduler.

With these rules in hand and the examples in this guide as a reference, you should be able to write AWS EventBridge cron expressions confidently for any scheduling scenario.

🔧 Other Free Developer Tools

⏱ Cron Generator 🕐 Timestamp Converter 🔑 JWT Decoder 📄 YAML ↔ JSON 🔤 Base64 Encoder 🗄 SQL Explainer