Orchestrate AWS without the EventBridge tangle.

Trigger S3, Lambda, Glue, EMR, DynamoDB, and Athena from one flow. S3 events fan out without EventBridge rules, EMR Serverless dispatches on backlog, Lambda chains into Glue and Athena, cross-account ops run through stsRole, all in one execution history.

One execution across S3, Lambda, EMR, Glue, and DynamoDB.

AWS gives you the services. Kestra wires them together without EventBridge rule sprawl, without Step Functions JSON, and without Lambda functions whose only purpose is to call the next Lambda. The IAM model, the data, and the compute all stay in your account.

S3 triggers fan out by prefix and regex, no EventBridge rules

s3.Trigger polls a bucket on an interval, applies prefix and regex filters, downloads matched objects to Kestra internal storage, and fires the flow once per file. Optional move or delete after processing prevents reprocessing. The EventBridge to Lambda to Step Functions chain collapses into one trigger and one flow, with the routing logic readable in the flow YAML.

Lambda dispatch from any event source, not just S3 or API Gateway

lambda.Invoke calls a Lambda by ARN or name with a JSON payload. Trigger from Kafka, Slack, dbt completion, ServiceNow webhook, anything Lambda's native triggers cannot reach without a glue function. The response body is stored in internal storage and the task fails on functionError. Pair with retry policies for transient throttling.

EMR and EMR Serverless dispatched from backlog signals

emr.CreateClusterAndSubmitSteps launches a transient cluster, runs initial steps, and optionally waits for terminal state. emr.SubmitSteps appends jobs to a running cluster. emr.DeleteCluster tears it down. EMR Serverless covers the steady-state side with CreateServerlessApplicationAndStartJob. Backlog-driven autoscale becomes a flow: SQS depth threshold breaches, the flow spins a Spark job.

Cross-account ops via stsRole, one flow spans accounts

Every AWS task accepts stsRoleArn, stsRoleSessionName, stsRoleExternalId. Chain ops across accounts in one flow: drop a file in the dev-account S3 bucket, run a Glue job in the staging-account, write the output to a prod-account DynamoDB table. No federation setup, no separate flows per account, no shared long-lived credentials.

Native tasks for data services, no Glue Workflows or Step Functions

athena.Query runs SQL and fetches results to internal storage. glue.StartJobRun, GetJobRun, StopJobRun handles Glue lifecycle. dynamodb.GetItem, PutItem, Query, Scan, DeleteItem are first-class operations. Chain Athena to dbt to Snowflake to Slack without Step Functions JSON or three separate orchestrators.

EventBridge as a target, not the orchestrator

eventbridge.PutEvents writes events to a custom bus when a flow step finishes. Other consumers (downstream Lambdas, third-party SaaS, on-call paging) get notified. The flow does not depend on EventBridge rules for its own routing, routing lives in the flow YAML. Decouple the publish from the orchestration.

How AWS teams use Kestra around the platform

Patterns engineering teams run in production today. Each one shows the flow end to end, with the real plugin classes in play.

Event-driven

Route incoming S3 files by prefix to different downstream paths

s3.Trigger polls the bucket. Files under /raw/orders/ route to a dbt build that transforms the order data. Files under /raw/clicks/ route to a Lambda that cleanses the clickstream and forwards it to Kinesis. Both paths emit an SNS message when complete and notify Slack. The EventBridge plus two Lambdas plus a Step Function pattern collapses into one flow definition.

One trigger, two downstream paths

Prefix-driven routing in the flow, not in an EventBridge rule. Adding a third prefix path is a YAML edit, not a CloudFormation stack update.

Move-after-processing prevents duplicates

s3.Trigger optionally moves or deletes processed files. The next poll skips them automatically.

Audit trail covers the chain

One execution links the original file, the routing decision, the downstream task output, the SNS message, and the Slack notification.

s3 trigger
prefix + regex
route on prefix
If task
dbt build (orders)
branch a
lambda cleanse
branch b
sns publish
completion
notify
Slack with file URI
Data ops

Watch SQS depth, spin up EMR Serverless when the backlog demands it

A scheduled flow runs every 5 minutes. It reads the SQS queue depth from CloudWatch and the active EMR Serverless job count. If the queue is above a threshold and no job is running, emr.CreateServerlessApplicationAndStartJob spins a Spark job that drains the backlog. emr.GetJobRun polls until SUCCEEDED. Below threshold, the flow exits. Backlog-driven autoscale without DataDog watcher plus Lambda controller plus retry logic.

Backlog-aware, not time-aware

The flow spins compute only when the queue actually has work. Quiet weekends do not spin idle clusters.

Serverless first, transient cluster second

EMR Serverless for steady-state batches. emr.CreateClusterAndSubmitSteps for one-off heavy runs that need custom node types.

Single-active guard

The flow checks for an active job before starting a new one. No accidental parallel runs from overlapping schedule fires.

every 5 min
schedule
check sqs depth
CloudWatch query
above threshold?
If gate
start spark job
EMR Serverless
poll until done
GetJobRun
notify
Slack with run id
Cross-account

Rotate IAM access keys across accounts with a gate before prod

A weekly flow iterates a list of AWS accounts. Per account, the flow assumes a rotation role via stsRoleArn, creates a new access key with cli.AwsCLI, writes the new key to AWS Secrets Manager in the target account, and marks the old key inactive. The flow Pauses before reaching the prod account. A named reviewer resumes, the prod rotation runs, and the old key is scheduled for deletion 24 hours later by a follow-up flow.

Per-account role assumption

Each iteration assumes a different stsRoleArn. No long-lived credentials in the flow, no federation tax.

Named reviewer before prod

The Pause task records who approved the prod rotation and when. The audit log links to the execution.

Old keys deleted on a 24-hour delay

A follow-up flow scheduled at execution time deletes the old keys, after the rotation has been verified.

weekly schedule
cron
fetch accounts
from inventory
ForEach account
non-prod first
assume role
stsRoleArn
rotate key
create + mark old inactive
approval gate
before prod
rotate prod
after resume
Pipeline

Glue ETL, Athena validation, DynamoDB write, all one execution

glue.StartJobRun kicks off the daily ETL job that lands curated data in the analytics S3 bucket. glue.GetJobRun polls every minute until SUCCEEDED. athena.Query runs a validation SQL against the output and returns the row count. An If task gates: if row count is within the expected range, dynamodb.PutItem writes the daily aggregate to the metrics table. Slack notifies with the row count and the bucket URI.

Three AWS services, one flow

Glue, Athena, DynamoDB all chained directly. No Step Functions, no Glue Workflows, no glue Lambda.

Validation gates the write

If the Athena row count is outside the expected window, DynamoDB is not updated and on-call gets paged.

Per-step retries on transient errors

Each task carries its own retry policy. A Glue throttling error retries the Glue step only, not the whole flow.

scheduled
nightly
glue ETL
StartJobRun
poll glue
until SUCCEEDED
athena validate
row count query
in range?
If gate
dynamodb write
metrics aggregate
notify
Slack with row count
Kestra was the only tool that combined true multi-tenant isolation, metadata-driven orchestration, and easy integration with our existing AWS and Databricks environments. It provided the foundation we needed to scale confidently.
Director of Engineering, Acxiom

Blueprints for AWS orchestration.

One blueprint per use case above. Copy the YAML, set your AWS credentials in Kestra secrets, point at your resources, ship it.

S3 file landed, fan out by prefix
EMR Serverless backlog autoscale
Glue ETL, Athena validation, DynamoDB write

Route incoming S3 objects to dbt or Lambda based on prefix

s3.Trigger polls the bucket. An If task routes /raw/orders/ to dbt build and /raw/clicks/ to a Lambda. Both paths publish to SNS on completion and notify Slack.

Explore Blueprints

Watch SQS depth on a schedule, spin Spark only when needed

Every 5 minutes, the flow reads SQS queue depth via CloudWatch. If above threshold, it starts an EMR Serverless Spark job and polls until SUCCEEDED. Below threshold, the flow exits. No idle compute on quiet weekends.

Explore Blueprints

Daily pipeline across three AWS services in one execution

Starts a Glue job, polls until SUCCEEDED, runs an Athena validation query, gates a DynamoDB write on the row count. Failed validation pages on-call instead of writing bad data.

Explore Blueprints

Kestra vs AWS orchestration alternatives

Capability
Step Functions + Lambda glue
EventBridge rules + Lambda fan-out
Custom code on EC2 / ECS
S3 trigger with prefix/regex filter and fan-out
s3.Trigger with action MOVE or DELETE on processed files
S3 notification to Lambda to Step Function, three resourcesS3 to EventBridge to rule to Lambda, four resourcesCustom poller code
Lambda dispatch from non-AWS event sources
lambda.Invoke from any Kestra trigger
API Gateway + Lambda + Step Function entryPub/Sub or webhook to EventBridge to LambdaCustom HTTP listener
Approval gate before a service call
Pause + resume, named reviewer logged
Step Function Wait + custom approval LambdaNot nativeCustom approval UI
EMR Serverless on backlog signal
CloudWatch query + If + StartServerlessJobRun in one flow
Step Function with custom watcher LambdaEventBridge schedule + Lambda controllerCustom watcher service
Cross-account ops via stsRole on every task
stsRoleArn property on each AWS task
Custom role-assume Lambda stepCross-account EventBridge bus + per-account rulesCustom assume-role code
Glue + Athena + DynamoDB in one flow
Native plugin tasks, outputs flow forward
Step Function with three LambdasThree EventBridge rules + glue logicCustom code
Chain AWS with non-AWS tools (dbt, Slack, GitHub)
Outputs flow into any plugin task
Lambda glue for each external callEventBridge to API Destinations + custom logicCustom integrations
Self-hosted, air-gapped, OSS edition
Self-hosted by default, OSS edition free
AWS-managed onlyAWS-managed onlySelf-hosted
Vendor lock-in
AWS plugin is one of 1300+; portable orchestration
Step Functions ASL is AWS-onlyEventBridge rules are AWS-onlyCustom code, portable but unsupported

AWS & Kestra: common questions

Find answers to your questions right here, and don't hesitate to Contact Us if you couldn't find what you're looking for.

See How

Ready to coordinate AWS without the EventBridge tangle?

Fan out S3 events to dbt and Lambda from one trigger. Spin EMR Serverless on backlog. Rotate IAM keys across accounts with a prod gate. Chain Glue, Athena, and DynamoDB in one execution history. Open source, self-hosted, event-driven.