What Is Event-Driven Architecture in AWS? Patterns & Examples

Most AWS architectures eventually hit the same problem: one action in one service needs to trigger work in several others, and you do not want those services to know about each other. Event-driven architecture solves this by replacing direct service calls with events. A service emits “order placed” and walks away. Everything that needs to react does so independently.

This page explains the model clearly, compares the AWS services that power it (EventBridge, SNS, SQS, Kinesis, Lambda, and Step Functions), and helps you choose patterns for your actual system. Service-specific deep dives are linked throughout.

Simple explanation

Think of a newspaper publisher. The publisher prints the news and distributes it. Every subscriber gets a copy and decides what to do with it: clip an article, file it, or ignore it. The publisher does not know who subscribed or what they do with the paper.

Event-driven architecture works the same way. A service (the publisher) emits an event when something happens. Other services (the subscribers) react however they need to. The publisher has no idea who is listening, and new subscribers can be added at any time without touching the publisher.

Why this matters in AWS

AWS is built around managed services that each do one thing well: Lambda runs code, DynamoDB stores data, S3 stores files. Those services need to work together, but wiring every service directly to every other creates a fragile, tightly coupled web that is hard to change.

Event-driven architecture breaks that coupling with a few key capabilities:

  • Decoupling: Producers and consumers evolve independently. Adding a new consumer requires no change to the producer.
  • Fan-out: One event triggers multiple downstream services simultaneously. That is exactly what SNS and EventBridge are designed for.
  • Buffering: SQS absorbs traffic spikes so a slow or temporarily unavailable consumer does not back-pressure or crash the producer.
  • Async processing: Work that does not need an immediate response (sending emails, syncing analytics, calling third-party systems) moves to background consumers so the main request path stays fast.
  • Native integrations: EventBridge has direct integrations with over 200 AWS services, so you can route events without writing custom glue code.

How event-driven architecture works in AWS

Every event-driven system follows the same basic flow, regardless of which AWS services you use:

  1. Producer emits an event. An order service writes to DynamoDB and publishes an order.placed event to EventBridge. The producer’s job is done. It does not wait or care what happens next.
  2. Routing/broker layer receives the event. EventBridge, SNS, SQS, or Kinesis receives the event and determines where it should go.
  3. Rules, topics, queues, or streams distribute the event. EventBridge rules filter by content and route to Lambda, SQS, or SNS targets. SNS topics push to all subscribers simultaneously. SQS queues hold the event until a consumer is ready. Kinesis streams buffer high-volume events for ordered processing at scale.
  4. Consumers process the event. Each consumer (typically a Lambda function, ECS task, or EC2 instance) handles the event independently of all others.
  5. Retries, DLQs, and observability handle failure paths. If a consumer fails, the service retries automatically. After the configured retry limit, the event routes to a dead-letter queue (DLQ) for investigation. Distributed tracing with AWS X-Ray ties the full event path together across services.

Events vs commands

This distinction is central to designing event-driven systems well.

ConceptDefinitionDirectionAWS example
EventA fact about something that happenedBroadcast: sender does not know who reactsorder.placed published to EventBridge
CommandA request to do something specificDirected: sender knows the receiverLambda calls an API: “send confirmation email to user@example.com

Commands create tight coupling because the sender must know about the receiver. Events create loose coupling because the sender knows nothing about who reacts, or whether anyone reacts at all. In event-driven architecture, you default to events and reserve direct calls for cases where you genuinely need a response.

Fire alarm analogy

A fire alarm is an event. It broadcasts “fire detected” to anyone listening. It does not know who will react, how many people hear it, or whether anyone evacuates. A manager calling each employee individually and saying “please leave the building now” is a command. Same goal, fundamentally different coupling. Events work exactly the same way.

Core AWS building blocks

These six services are the foundation of most AWS event-driven architectures. They are frequently combined in the same design.

ServiceWhat it doesBest forKey trade-offRole in EDA
Amazon EventBridgeEvent bus that routes events based on content rulesRule-based routing between AWS services, SaaS apps, and custom appsHigher per-event latency than SNS direct delivery; not designed for ultra-high-throughput streamingCentral event router and broker
Amazon SNSPub/sub messaging: one message pushed to many subscribers simultaneouslyFan-out: one event triggers multiple independent consumers at oncePush delivery; no built-in backpressure; messages are not stored for replayFan-out layer
Amazon SQSDurable message queue: consumers pull messages at their own paceBuffering, decoupling slow consumers, absorbing traffic spikesPull model; no built-in fan-out; standard queues do not guarantee delivery orderBuffer and backpressure layer between producer and consumer
Amazon KinesisOrdered data stream: multiple consumers independently replay records at their own positionHigh-volume continuous data: clickstreams, logs, telemetry, financial ticksShard management adds operational overhead; ordering is only guaranteed within a shardHigh-throughput ordered streaming layer
AWS LambdaServerless compute triggered directly by events from EventBridge, SNS, SQS, Kinesis, S3, and many othersProcessing events without managing servers15-minute maximum execution time; cold starts add latency; not suited for long-running or stateful workPrimary event consumer
AWS Step FunctionsManaged workflow engine that orchestrates multi-step processes with state, retries, and branchingBusiness-critical multi-step workflows that need visibility and error handlingAdds a central orchestrator dependency; more setup than pure event choreographyOrchestration layer for complex workflows

When to use event-driven architecture

These scenarios are strong signals that event-driven architecture is the right fit:

  • One event needs multiple consumers. Placing an order should trigger inventory updates, email confirmations, fraud checks, and analytics updates simultaneously. Event-driven fan-out is the clean solution here.
  • The producer should not wait for downstream work. If the user does not need to wait for an email to send or a record to sync, moving that work async keeps the main request path fast.
  • Downstream systems may be slow or fail independently. SQS and Kinesis buffer events so a slow or failing consumer does not back-pressure or crash the producer.
  • You need buffering or async scaling. Event queues absorb traffic spikes. Consumers scale independently based on queue depth.
  • You want to add new consumers without changing the producer. A new analytics service, notification channel, or audit log can subscribe to existing events without touching the code that emits them.
  • You are integrating with SaaS or third-party systems. EventBridge has native integrations with Stripe, Datadog, Zendesk, and other SaaS providers, making it a clean bridge between AWS and external systems without custom glue code.

When NOT to use event-driven architecture

Don’t make async your default

The most common EDA mistake is treating event-driven architecture as the right choice for every integration and everything else as legacy. Async adds latency, silent failures, and real operational complexity. For simple systems or simple flows, a direct function call is cleaner, faster to build, and much easier to debug.

Beyond that general caution, these situations specifically call for a different approach:

  • You need a synchronous response. “Is this username available?” needs an immediate answer. Emitting an event and waiting for a reply event is complex and slow. Use a direct API call.
  • Your system is small and simple. Two services calling each other directly are easier to understand, test, and debug than the same two services wired through an event bus. Add EDA when the coupling cost actually hurts.
  • You need strict consistency. EDA is inherently eventual. There is always a window where different parts of the system see different data. Some domains (financial transactions, booking systems) require strong consistency that pure EDA makes harder to achieve.
  • Your team does not have observability and retry discipline in place. EDA failures are silent by default. If your team is not yet comfortable with structured logging and distributed tracing, the operational complexity will outweigh the architectural benefits.
  • Idempotency is not designed in from the start. Most AWS event services use at-least-once delivery. If your team will not build idempotent consumers, bugs from duplicate processing are inevitable.

EventBridge vs SNS vs SQS vs Kinesis

This is the question most beginners struggle with because these services overlap. The decision comes down to a few concrete factors.

Use EventBridge when you need content-based routing: you want different events to go to different targets based on the event payload or source. EventBridge is also the right choice for integrating with AWS service events (EC2 state changes, S3 object creation, CodePipeline status updates) and SaaS providers. Think of it as a smart router.

Use SNS when one event must reach multiple subscribers at the same time. SNS pushes the message to all subscribers immediately. All subscribers receive all messages on a topic by default (you can narrow this with filter policies). Think of it as a megaphone.

Use SQS when you need buffering and backpressure. SQS holds messages until a consumer picks them up, absorbs traffic spikes, and protects slow or intermittently available consumers. Think of it as a ticket queue: the venue processes one person at a time at its own pace, no matter how many people are waiting outside. See the SNS vs SQS comparison for the full breakdown.

Use Kinesis when you have high-volume, continuous data where ordering matters and multiple consumers need to read the same records independently. Kinesis Data Streams retains records for 24 hours by default, extendable to 7 days with standard extended retention or up to 365 days with long-term data retention. Each consumer maintains its own independent read position, which is fundamentally different from SQS where each message is consumed once. Think of it as a distributed, replayable log.

Common production pattern

These services are frequently combined. A typical SNS-to-SQS fan-out pattern: EventBridge routes incoming events by type to an SNS topic, which fans out to a dedicated SQS queue per consumer team. Each team processes at their own pace with their own DLQ. This is one of the most common patterns in production AWS architectures.

Choreography vs orchestration

Once you have multiple services reacting to events, you face a design choice: who coordinates the overall flow?

Choreography means no central coordinator. Each service reacts to an event, does its work, and may emit a new event. The order service emits order.placed. The inventory service reacts, reserves stock, and emits stock.reserved. The shipping service reacts to that and schedules delivery. The flow emerges from each service doing its part.

Choreography keeps services genuinely decoupled and is simple to start. The cost is observability: when the order gets stuck, you have to trace through logs across multiple services to find out why. There is no single place that knows the state of the full flow.

Orchestration means a central coordinator. AWS Step Functions drives the process: it calls the inventory service, waits for a result, then calls shipping. The state machine is the single source of truth for where the workflow stands. Failed steps are visible, retries are configurable, and branching logic is explicit in one place.

Jazz band vs orchestra

Choreography is a jazz band: each musician listens and responds to the others, no conductor required. It is fluid and decoupled when it works. Orchestration is a classical orchestra: the conductor drives each section through every movement. You always know exactly where in the piece you are. Most production systems need both styles in different parts of the architecture.

The practical guidance:

  • Use choreography (EventBridge, SNS) for loosely coupled notifications where each consumer reacts independently: fan-out side effects, analytics, non-critical notifications.
  • Use orchestration (Step Functions) for business-critical multi-step workflows such as order fulfillment, payment processing, and user onboarding, where you need visibility, error handling, and the ability to answer “where exactly did this fail and why?”

Most production systems use both. The event-driven systems design guide covers deeper patterns for combining the two approaches.

Practical AWS example: order processing

Here is a realistic event-driven order processing system built with AWS services:

  1. A customer submits an order via an API Gateway endpoint.
  2. A Lambda function validates the order, writes it to DynamoDB, and publishes an order.placed event to EventBridge. The Lambda’s job is done.
  3. EventBridge matches the event against three rules and routes it to three targets in parallel:

    • An SQS queue for the inventory service (deduct stock)
    • An SQS queue for the email service (send receipt)
    • A Kinesis stream for the analytics pipeline (write to the data lake)
  4. Each SQS queue triggers its own Lambda consumer, which processes the event independently of the others.
  5. If the inventory Lambda fails, SQS retries automatically with backoff. After the configured retry limit, the message moves to a DLQ. A CloudWatch alarm on the DLQ notifies the on-call engineer.
  6. X-Ray traces the full path from the API Gateway invocation through EventBridge to each downstream consumer, giving end-to-end visibility in one trace.

Adding a fraud-detection service requires only a new EventBridge rule pointing to a new Lambda. The order Lambda does not change at all.

{
  "source": ["myapp.orders"],
  "detail-type": ["order.placed"],
  "detail": {
    "amount": [{ "numeric": [">", 100] }]
  }
}

This EventBridge rule routes only orders over $100 to a priority processing queue. It is useful for tiered fulfillment or fraud review on high-value orders.

Common mistakes

At-least-once delivery will find your bugs

Most AWS event services deliver each message at least once, not exactly once. Your consumer will receive duplicates in production. Build idempotent consumers first, not later. A non-idempotent consumer that charges a card or decrements inventory will do it twice, at the worst possible moment.

  1. Non-idempotent consumers. A consumer that decrements inventory on every event delivery will double-deduct on retries. Design consumers so that processing the same event twice produces the same result as processing it once.

  2. Overusing async for everything. Not every integration benefits from being event-driven. Read requests, input validation, and user-facing APIs are usually better served synchronously. Async adds latency, complexity, and failure modes that are only worth the cost when decoupling or buffering genuinely matter.

  3. Poor event schema design. Events that carry internal implementation details (database row IDs, internal state flags) couple your consumers to your internals. Design event schemas around business concepts, and version them explicitly so schema changes do not silently break downstream consumers.

  4. Ignoring ordering requirements. Standard SQS and SNS do not guarantee message ordering. If your consumer assumes events arrive in the order they were emitted, you will have subtle bugs. Use SQS FIFO queues or Kinesis when ordering matters.

  5. Weak observability and no DLQ. When a consumer fails in an event-driven system, the failure is silent by default. Without distributed tracing, DLQ monitoring, and structured logging, you will not know events are being dropped until a business process visibly breaks. Set up observability before you go to production.

  6. Coupling events too tightly to implementation. An event named user-db-row-inserted leaks your storage model. An event named user.registered describes a business fact. Consumers should not need to know how the producer stores data internally.

Best practices checklist

  • Idempotency: Every consumer must handle duplicate events without side effects. Use deduplication keys or conditional writes in DynamoDB to enforce this.
  • Retries: Configure retry counts and backoff policies on SQS, EventBridge, and Lambda event source mappings. Understand your retry behavior before going live.
  • Dead-letter queues: Attach a DLQ to every SQS queue and every Lambda event source mapping. Monitor DLQ depth with CloudWatch alarms so failures do not go unnoticed.
  • Schema consistency: Define a standard event envelope (source, detail-type, timestamp, detail). Use the EventBridge Schema Registry or a shared schema repository to keep this consistent across teams.
  • Event naming: Use past-tense business facts: order.placed, payment.received, user.registered. Avoid names that expose internal implementation details.
  • Tracing and logging: Enable AWS X-Ray on Lambda and API Gateway. Emit structured logs with correlation IDs so you can trace a single event across all the services that handled it.
  • Ownership boundaries: Each event type should have a clear owning service. Consumers subscribe to events and should not silently re-route or re-emit them without a clear ownership handoff.
  • Keep some flows synchronous: User-facing APIs, validations, and queries are often better served with direct calls. Reserve async for work that genuinely benefits from decoupling or buffering.

Frequently asked questions

What is event-driven architecture in AWS?

Event-driven architecture (EDA) is a design pattern where services communicate by emitting and reacting to events instead of calling each other directly. In AWS, services like EventBridge, SNS, SQS, and Kinesis act as brokers between producers (which emit events) and consumers (which react to them). This decoupling lets services scale, fail, and evolve independently.

When should I use EventBridge vs SNS vs SQS?

Use EventBridge when you need content-based routing so events go to different targets based on their attributes. Use SNS when you need to fan out one event to multiple subscribers simultaneously. Use SQS when you need reliable buffering between a producer and a consumer, especially when the consumer might be slower or unavailable. They are commonly combined: EventBridge routes to SNS, which fans out to SQS queues for each consumer.

Is event-driven architecture the same as serverless?

No. Event-driven architecture is a communication pattern where services react to events instead of calling each other directly. Serverless is a compute model where you run code without managing servers. They pair well together because Lambda is a natural event consumer, but each is independent. You can build event-driven systems with EC2 instances, containers, or any other compute model.

When should I use Step Functions instead of pure events?

Use Step Functions (orchestration) when you need a visible, controllable workflow with defined steps, error handling, retries, and branching logic. Pure event choreography works well for loosely coupled reactions, but becomes hard to trace across multiple services. If a business process must complete in a specific order, or you need to know exactly where it failed, Step Functions is the right tool.

How do retries, DLQs, ordering, and idempotency affect design?

All four are linked. Most AWS event services use at-least-once delivery, so events can arrive more than once and your consumers must be idempotent (safe to process the same event twice). Retries are automatic for most services, but repeated failures route to a dead-letter queue (DLQ) for inspection. Ordering is only guaranteed within a Kinesis shard or an SQS FIFO queue. Standard SQS and SNS do not guarantee order. Design for these realities from the start, not as an afterthought.

Last verified: 11 May 2026 Cloud services change frequently. Verify details against official documentation before making infrastructure decisions.