Cloud Parts

Amazon EventBridge Scheduler

EventBridge’s serverless scheduler: millions of one-time or recurring schedules, each of which calls an AWS API at a set time in any time zone.

Type
Managed service on AWS
Made by
Amazon Web Services
License
Proprietary
Facts checked
6 October 2026

What it is

A schedule is a small stored resource with three parts: when, what and how. “When” is a schedule expression: rate(15 minutes) for a fixed interval, a six-field cron(...) expression for calendar patterns such as the last Friday of each month, or at(2026-11-02T09:00:00) for a single run. Cron and one-time schedules are evaluated in any IANA time zone, with daylight saving time handled for you. “What” is a target: Scheduler assumes an IAM execution role you give it and calls one AWS API with your input as the request. “How” covers the delivery settings: an optional flexible window, a retry policy and a dead-letter queue.

Targets come in two forms. Templated targets cover a short list of common calls, such as Lambda Invoke, SQS SendMessage, SNS Publish, Step Functions StartExecution, EventBridge PutEvents and ECS RunTask, so you only pass the resource’s ARN. The universal target takes an ARN like arn:aws:scheduler:::aws-sdk:ec2:stopInstances and a JSON request body, which reaches more than 270 services and 6,000 API operations without a glue function in between. Read-only calls (anything starting with get, list, describe, query and similar) are excluded.

Schedules fire with one-minute precision: a run set for 1:00 happens between 1:00:00 and 1:00:59, or anywhere inside a flexible window of up to 1,440 minutes if you set one. Delivery is at least once. If the target fails, Scheduler retries with exponential backoff, by default for up to 24 hours and 185 attempts, then drops the event or sends it to an SQS dead-letter queue with the error attached.

Why teams pick it

  • Built for per-user timers: 10 million schedules per Region by default, adjustable to billions, so a reminder or trial expiry per customer needs no polling table
  • Real time zones: cron and one-time schedules follow IANA zones and daylight saving time, where the legacy scheduled rules run only in UTC
  • Calls almost any AWS API directly, with retries, a dead-letter queue and flexible windows to spread load on the target
  • Pay per call: 14 million invocations a month free, then $1.00 per million in US East, US West (Oregon) and Ireland

Watch out for

  • One-minute precision at best, so it isn’t a fit for sub-minute timing
  • At-least-once delivery: a target can run twice, so it should be idempotent
  • Targets are AWS API calls only, with a 256 KB input; an outside HTTPS endpoint has to be reached through an event bus or a function
  • Finished one-time schedules still count against the quota unless you set ActionAfterCompletion to DELETE; invocations above the default 1,000 per second (500 in other Regions) are delayed, not dropped

Alternatives

What all event buses have in common →

How it fits with other technologies

A self-deleting reminder, and a weekday job that calls the EC2 API · bash

aws scheduler create-schedule-group --name billing

# one run at 9:00 Berlin time; retried for up to an hour, then sent to a DLQ; deleted after it runs
aws scheduler create-schedule --name invoice-42-reminder --group-name billing \
  --schedule-expression 'at(2026-11-02T09:00:00)' \
  --schedule-expression-timezone 'Europe/Berlin' \
  --flexible-time-window '{"Mode": "OFF"}' \
  --action-after-completion DELETE \
  --target '{"Arn": "arn:aws:lambda:us-east-1:111122223333:function:send-reminder",
    "RoleArn": "arn:aws:iam::111122223333:role/scheduler-invoke",
    "Input": "{\"invoiceId\": 42}",
    "RetryPolicy": {"MaximumRetryAttempts": 10, "MaximumEventAgeInSeconds": 3600},
    "DeadLetterConfig": {"Arn": "arn:aws:sqs:us-east-1:111122223333:reminder-dlq"}}'

# universal target: stop dev instances at 19:00 New York time on weekdays, within a 10-minute window
aws scheduler create-schedule --name stop-dev-instances \
  --schedule-expression 'cron(0 19 ? * MON-FRI *)' \
  --schedule-expression-timezone 'America/New_York' \
  --flexible-time-window '{"Mode": "FLEXIBLE", "MaximumWindowInMinutes": 10}' \
  --target '{"Arn": "arn:aws:scheduler:::aws-sdk:ec2:stopInstances",
    "RoleArn": "arn:aws:iam::111122223333:role/scheduler-ec2",
    "Input": "{\"InstanceIds\": [\"i-0abc123def4567890\"]}"}'

Scheduler or a scheduled rule?#

EventBridge still has the older way to run things on a timer: a rule on the default event bus with a schedule instead of an event pattern. AWS’s docs now call these rules a legacy feature and recommend Scheduler.

EventBridge SchedulerScheduled rule (legacy)
Lives onIts own API; no event bus neededThe default event bus only
Expressionsrate(), cron() and one-time at()rate() and cron()
Time zoneAny IANA zone, with daylight saving timeUTC only
How many10 million schedules per Region by defaultShares the bus’s rule quota: 300 rules by default in most Regions
TargetsOne per schedule: a templated target or any non-read AWS APIUp to five per rule from the event bus target list, including API destinations (HTTPS endpoints)
PrecisionWithin the minute, or a flexible windowOne minute, with a possible delay of several seconds
  • A scheduled rule is still the simpler choice when the job is a single cron entry that needs to call an outside HTTPS API, because rules can target API destinations directly.

Delivery settings#

Each schedule carries its own delivery settings, so a nightly report and a payment reminder can fail in different ways.

Flexible time window

1 to 1,440 min

Set Mode to FLEXIBLE and a maximum window, and Scheduler invokes the target somewhere inside it. Thousands of schedules set for the same minute then spread out instead of hitting the target at once. OFF means fire within the scheduled minute.

Retry policy

default 24 h, 185 tries

MaximumRetryAttempts (0 to 185) and MaximumEventAgeInSeconds (60 to 86,400) bound how long Scheduler keeps retrying a failed call with exponential backoff.

Dead-letter queue

SQS standard

When retries run out, Scheduler sends a JSON record of the attempt, with the error code and message, to a standard SQS queue (FIFO queues aren’t supported). Without one, the event is dropped.

Context attributes

Placeholders such as <aws.scheduler.scheduled-time>, <aws.scheduler.execution-id> and <aws.scheduler.attempt-number> in the input are filled in at each run, so a target can tell a retry from a first attempt.

Action after completion

since Aug 2023

DELETE removes a one-time schedule after its run, or a recurring one after its last run before EndDate. Without it, finished schedules pile up against the quota.

Schedule groups

500 per Region

Every account has a default group. Groups carry tags for access control and cost allocation, and deleting a group deletes all its schedules.

See it in a real stack

No architecture uses Amazon EventBridge Scheduler yet. Drop it into the playground and wire it up yourself.Open playground →
Where it came from2016–2026

AWS has let you run things on a timer since January 2016, when CloudWatch Events launched and could “emit events on a schedule”. Those scheduled events became EventBridge scheduled rules: a rate or cron expression evaluated in UTC, on the default bus only, each one using up a rule from a quota of a few hundred. That suited a handful of cron jobs. It didn’t suit applications that needed a timer per user or per order, so, as AWS put it, many customers bought off-the-shelf tools or built their own schedulers.

On November 10, 2022 AWS launched EventBridge Scheduler in nine Regions as a separate API inside EventBridge. Schedules were their own resources rather than rules, with one-time at() expressions, time zones and daylight saving time, flexible windows, retries, dead-letter queues and a universal target that could call thousands of AWS APIs. The launch post, by Marcia Villalba, compared 1 million schedules per account with 300 scheduled rules, and gave examples such as task reminders sent through SNS, starting and stopping thousands of EC2 instances around store hours in each time zone, and ending a SaaS customer’s access when a subscription lapses.

Since then AWS has added 18 more Regions (March 2023), automatic deletion of finished schedules (August 2023) and PrivateLink access (March 2025). By 2026 the default had grown to 10 million schedules per Region, CreateSchedule allowed 5,000 requests per second in 11 large Regions, and a May 2026 update added 619 more SDK API actions as targets. EventBridge’s docs now call scheduled rules a legacy feature.

Why it’s built this way

Schedules as their own resources, not rules on a bus
A scheduled rule uses up the bus’s rule quota and lives on the default bus. Making each schedule a separate resource, with no bus involved, let one account hold millions of them, which per-user timers need.
A universal target instead of a fixed target list
AWS noted that home-grown schedulers were often limited in what they could trigger. Calling any AWS SDK action with an execution role means a schedule can stop an instance or start a pipeline without a Lambda function in between.
Flexible time windows
Many schedules set for the same minute would hit a target at once. Letting a schedule run anywhere in a window disperses the calls and reduces the load on downstream services.
At-least-once delivery with long retries
Scheduler retries for up to a day by default and can hand failures to a dead-letter queue, so a target that is briefly down or throttling still gets the call. The price is that the target may see it twice.

Timeline

  1. 2016

    CloudWatch Events launches with events on a schedule, later EventBridge scheduled rules

  2. 2022

    EventBridge Scheduler launches on November 10 in nine Regions

  3. 2023

    18 more Regions in March; automatic deletion after completion in August

  4. 2025

    AWS PrivateLink support for calling Scheduler from a VPC

  5. 2026

    Default CreateSchedule rate rises to 5,000 per second; 619 more SDK actions as targets

Sources17 · facts checked 6 October 2026

Improve this page on GitHub