All expression building, validation, and next-run calculations happen locally in your browser. No schedule data, no timezone lookups, and no expression strings are sent to CodeAva servers. The tool is safe to use with sensitive schedule patterns and internal infrastructure timing.
Why AWS EventBridge schedule syntax trips developers up
AWS EventBridge schedule expressions look similar to the cron strings developers already know from Linux, but they are not the same format. AWS uses six fields instead of five, adds a Year field that Linux cron does not have, and enforces a strict day-field rule that has no Linux equivalent: when you specify a value in Day-of-month, you must put ? in Day-of-week, and vice versa. Violating this rule produces an “Invalid expression” error in the AWS Console, and it is by far the most common scheduling mistake developers make when moving to AWS.
Beyond syntax, the two AWS scheduling services behave differently. Legacy EventBridge scheduled rules evaluate all expressions in UTC — there is no timezone configuration. The modern EventBridge Scheduler service supports timezone-aware schedules, which means a cron(0 8 ? * MON *) expression attached to a schedule in Africa/Johannesburg fires at 08:00 local time, not 08:00 UTC. Understanding which service you are using changes whether the timezone offset matters for your next-run calculations.
This tool is AWS-first, not a generic cron parser with AWS labels. It validates AWS-specific rules, uses AWS field ordering, and surfaces EventBridge Scheduler timezone context wherever relevant so you can build correctly without consulting the AWS documentation for every expression.
What is the difference between AWS EventBridge cron and Linux cron?
The core structure is similar — both use positional fields to describe recurring schedules — but the AWS format adds a sixth Year field and enforces the ? rule for day fields. AWS also wraps the expression in a cron(...) or rate(...) wrapper. The Sunday value differs: AWS uses 1 for Sunday; Linux uses 0. A Linux cron string cannot be pasted directly into AWS without modification.
AWS EventBridge schedule expression cheat sheet
| Goal | AWS cron expression | AWS rate expression |
|---|---|---|
| Every 5 minutes | cron(0/5 * * * ? *) | rate(5 minutes) |
| Every day at midnight UTC | cron(0 0 * * ? *) | rate(1 day) |
| Every Monday at 8 AM | cron(0 8 ? * MON *) | N/A — use cron() |
| Every weekday (Mon–Fri) at 9 AM | cron(0 9 ? * MON-FRI *) | N/A — use cron() |
| 1st of every month at midnight | cron(0 0 1 * ? *) | N/A — use cron() |
| Last day of every month | cron(0 0 L * ? *) | N/A — use cron() |
| Every hour | cron(0 * * * ? *) | rate(1 hour) |
Terraform and CDK integration
AWS schedule expressions are used in Terraform resource blocks, CDK constructs, and AWS CLI commands exactly as generated by this tool — no transformation required.
Terraform — CloudWatch event rule (legacy scheduled rule):
resource "aws_cloudwatch_event_rule" "every_five_mins" {
name = "every-five-minutes"
schedule_expression = "rate(5 minutes)"
}
resource "aws_cloudwatch_event_rule" "every_monday" {
name = "every-monday-8am"
schedule_expression = "cron(0 8 ? * MON *)"
}Terraform — EventBridge Scheduler (modern, timezone-aware):
resource "aws_scheduler_schedule" "every_monday_local" {
name = "every-monday-8am-joburg"
flexible_time_window {
mode = "OFF"
}
schedule_expression = "cron(0 8 ? * MON *)"
schedule_expression_timezone = "Africa/Johannesburg"
target {
arn = aws_lambda_function.my_function.arn
role_arn = aws_iam_role.scheduler_role.arn
}
}The schedule_expression_timezone argument is only available on aws_scheduler_schedule. Legacy aws_cloudwatch_event_rule always evaluates in UTC.
What this tool helps with
Good uses
- Building valid EventBridge Scheduler schedulesconstruct rate() and cron() expressions with live validation so the expression is correct before it is deployed to AWS.
- Avoiding 'Invalid expression' errors in the AWS Consolethe day-field conflict guard catches the most common AWS cron mistake — specifying both Day-of-month and Day-of-week without a ? in one of them — before deployment.
- Previewing next execution times across timezonessee the next 5 scheduled runs in the schedule timezone, UTC, and local browser time so distributed teams can agree on when a job actually fires.
- Using schedule expressions in Terraform, CDK, or AWS CLIcopy the expression directly or as a Terraform schedule_expression value, paste into IaC code, and avoid manual string construction errors.
- Choosing between rate() and cron()rate() is simpler and timezone-agnostic for regular intervals; cron() is required for calendar-specific timing. The tool guides the choice with inline explanations.
- Translating UTC cron expressions to local team timelegacy EventBridge rules use UTC; modern EventBridge Scheduler supports timezone configuration. Preview the difference side by side before committing to a schedule.
Limitations to know
- Linux cron validationthis tool validates AWS EventBridge syntax. Linux cron uses 5 fields, SUN=0, no ? rule, and no Year. Use the Cron Parser & Builder for standard Linux cron.
- One-time schedulesEventBridge Scheduler supports at() expressions for one-time schedules. This tool focuses on recurring rate() and cron() expressions; at() is not currently supported.
- Validating expressions that will run in Lambda-internal schedulerssome Lambda frameworks or third-party task schedulers use their own cron syntax. This tool validates AWS EventBridge expressions specifically.
How to build an AWS EventBridge schedule expression
- 1
Choose rate() or cron() mode
Use rate() for simple, regular intervals — every 5 minutes, every hour. Use cron() for calendar-specific schedules where you need to target specific days, times, or dates.
- 2
Enter or build your schedule
In rate() mode, set the value and unit. In cron() mode, fill the 6 AWS fields. Use the preset buttons to start from a tested pattern. Remember: in cron() mode, one of Day-of-month or Day-of-week must be ?.
- 3
Review the validation status
Green means the expression is valid. Amber means it may work but has a potential issue. Red means AWS will reject the expression — the message explains exactly why. Fix the highlighted fields before deploying.
- 4
Check the next-run timeline
Select the timezone your EventBridge Scheduler schedule is configured for. The next 5 run times are shown in that timezone, in UTC, and in your local browser timezone. For legacy scheduled rules, use UTC only.
- 5
Copy and deploy
Copy the expression directly, or use Copy as Terraform value to get the full assignment string. Share the URL to send the exact schedule configuration to a colleague for review.
Common issues and how to fix them
AWS Console: 'Invalid expression — cron expression is invalid'
The most likely cause is a day-field conflict: both Day-of-month and Day-of-week have specific values. Set one to ? (question mark). For example: cron(0 8 ? * MON *) runs every Monday at 8 AM with Day-of-month set to ?.
Schedule fires at the wrong time
Check whether you are using EventBridge Scheduler (supports timezone configuration) or a legacy scheduled rule (always UTC). If the expression is attached to a Scheduler schedule with a configured timezone, the time fields are interpreted in that timezone, not UTC.
Pasting a Linux cron string into AWS fails
AWS cron uses 6 fields; Linux cron uses 5. Add a Year field (use * for any year) and ensure one of Day-of-month or Day-of-week is ?. Also note: AWS uses SUN=1 while Linux uses SUN=0 — adjust day-of-week values accordingly.
rate(1 minutes) is rejected or rate(5 minute) is rejected
AWS enforces singular/plural in rate() expressions. Use rate(1 minute) — singular for value 1. Use rate(5 minutes) — plural for values greater than 1. The validator flags this mismatch.
Year field causes an 'Invalid expression' error
The AWS-supported year range is 1970–2199. Using a year outside this range, or using a Linux-style expression without the Year field, will fail. Use * for any year if you want the expression to recur indefinitely.
cron(0 8 * * MON *) is rejected — I want weekdays
When Day-of-week is set to MON (or any specific value), Day-of-month must be ?. Change it to: cron(0 8 ? * MON *). Using * in both Day-of-month and Day-of-week means 'every day' — it does not allow you to specify a particular day of the week.