AWS
AWS EventBridge Patterns: Building Event-Driven Architectures
Learn how to implement event-driven architectures using AWS EventBridge, including patterns, best practices, and real-world examples
February 20, 2024
DevHub Team
4 min read
AWS EventBridge (formerly CloudWatch Events) is a serverless event bus service that makes it easy to connect applications using data from your own applications, SaaS applications, and AWS services. This guide explores common EventBridge patterns and best practices.
%%{init: {'theme': 'base', 'themeVariables': { 'background': 'transparent', 'primaryColor': '#FF9900', 'primaryTextColor': '#232F3E', 'lineColor': '#147EB4' }}}%%
flowchart LR
subgraph Sources["Event Sources"]
direction TB
AWS["fa:fa-cloud AWS Services"]
SaaS["fa:fa-plug SaaS Apps"]
Custom["fa:fa-code Custom Apps"]
end
subgraph EventBridge["Amazon EventBridge"]
direction TB
DefaultBus["Default Event Bus"]
PartnerBus["Partner Event Bus"]
CustomBus["Custom Event Bus"]
Rules["Event Rules & Filters"]
end
subgraph Targets["Service Targets"]
direction TB
Compute["Compute Services"]
subgraph ComputeDetails[" "]
direction TB
Lambda["fa:fa-function Lambda"]
ECS["fa:fa-docker ECS/Fargate"]
end
Messaging["Messaging Services"]
subgraph MessagingDetails[" "]
direction TB
SNS["fa:fa-comment-alt SNS"]
SQS["fa:fa-envelope SQS"]
end
Integration["Integration Services"]
subgraph IntegrationDetails[" "]
direction TB
StepFunctions["fa:fa-sitemap Step Functions"]
APIGateway["fa:fa-globe API Gateway"]
end
end
AWS --> DefaultBus
SaaS --> PartnerBus
Custom --> CustomBus
DefaultBus --> Rules
PartnerBus --> Rules
CustomBus --> Rules
Rules --> Compute
Rules --> Messaging
Rules --> Integration
%% Styling
classDef sourceNode fill:#FF9900,stroke:#FF9900,color:#232F3E,stroke-width:2px
classDef busNode fill:#232F3E,stroke:#232F3E,color:#FFFFFF,stroke-width:2px
classDef targetNode fill:#147EB4,stroke:#147EB4,color:#FFFFFF,stroke-width:2px
classDef groupStyle fill:transparent,stroke:#147EB4,stroke-width:2px
class AWS,SaaS,Custom sourceNode
class DefaultBus,PartnerBus,CustomBus,Rules busNode
class Lambda,ECS,SNS,SQS,StepFunctions,APIGateway targetNode
class Sources,EventBridge,Targets,ComputeDetails,MessagingDetails,IntegrationDetails groupStyle
Common EventBridge Patterns
1. Scheduled Tasks
const AWS = require('aws-sdk'); const eventbridge = new AWS.EventBridge(); // Create a scheduled rule const params = { Name: 'DailyBackupRule', ScheduleExpression: 'cron(0 0 * * ? *)', // Run daily at midnight State: 'ENABLED', Targets: [{ Id: 'BackupLambda', Arn: 'arn:aws:lambda:region:account-id:function:backup-function' }] }; eventbridge.putRule(params).promise();
2. Event Pattern Matching
{ "source": ["aws.s3"], "detail-type": ["AWS API Call via CloudTrail"], "detail": { "eventSource": ["s3.amazonaws.com"], "eventName": ["PutObject", "DeleteObject"], "requestParameters": { "bucketName": ["my-important-bucket"] } } }
3. Cross-Account Event Routing
// Set up cross-account event bus permissions const permissionParams = { Action: 'events:PutEvents', Principal: '111122223333', // Target account ID StatementId: 'CrossAccountAccess' }; eventbridge.putPermission(permissionParams).promise();
Integration Patterns
1. API Integration
import boto3 import json eventbridge = boto3.client('events') def lambda_handler(event, context): # Send event to EventBridge response = eventbridge.put_events( Entries=[ { 'Source': 'custom.myapp', 'DetailType': 'order.created', 'Detail': json.dumps({ 'orderId': '12345', 'amount': 99.99, 'customer': 'john.doe' }), 'EventBusName': 'default' } ] ) return response
2. SaaS Integration
// Configure partner event source const partnerParams = { Name: 'zendesk-events', EventBusName: 'partner-events-bus' }; eventbridge.createPartnerEventSource(partnerParams).promise();
Error Handling and Dead Letter Queues
Resources: EventRule: Type: AWS::Events::Rule Properties: Name: MyEventRule EventPattern: source: - custom.myapp Targets: - Arn: !GetAtt MyLambda.Arn Id: ProcessEvents DeadLetterConfig: Arn: !GetAtt DLQueue.Arn RetryPolicy: MaximumRetryAttempts: 3 MaximumEventAgeInSeconds: 3600
Monitoring and Debugging
1. CloudWatch Metrics
import boto3 cloudwatch = boto3.client('cloudwatch') # Get EventBridge invocation metrics response = cloudwatch.get_metric_statistics( Namespace='AWS/Events', MetricName='Invocations', Dimensions=[ { 'Name': 'RuleName', 'Value': 'MyEventRule' } ], StartTime='2024-02-01T00:00:00Z', EndTime='2024-02-15T00:00:00Z', Period=3600, Statistics=['Sum'] )
2. Event Pattern Testing
const testEvent = { version: '0', id: 'test-event', 'detail-type': 'order.created', source: 'custom.myapp', account: '123456789012', time: '2024-02-20T12:00:00Z', region: 'us-east-1', detail: { orderId: '12345', amount: 99.99 } }; const testParams = { Event: JSON.stringify(testEvent), EventPattern: JSON.stringify(eventPattern) }; eventbridge.testEventPattern(testParams).promise();
Best Practices
-
Event Schema Management
- Use consistent event schemas
- Document event patterns
- Version your events
-
Performance Optimization
- Use specific event patterns
- Implement retry policies
- Monitor event age
-
Security Considerations
- Use IAM roles and policies
- Encrypt sensitive data
- Audit event access
-
Cost Management
- Monitor event usage
- Use appropriate event buses
- Clean up unused rules
Troubleshooting Guide
Common issues and solutions:
-
Event Not Triggering
- Verify event pattern syntax
- Check IAM permissions
- Review CloudWatch Logs
-
Target Invocation Failures
- Monitor DLQ messages
- Check target configuration
- Review retry policies
-
Performance Issues
- Analyze event latency
- Review throttling metrics
- Check event bus quotas
References
- AWS EventBridge Documentation - Official documentation
- Event Patterns - Pattern syntax guide
- EventBridge Quotas - Service limits
- EventBridge Schemas - Schema registry
- EventBridge Security - Security best practices
- EventBridge API Reference - API documentation
- EventBridge Targets - Target configuration
- EventBridge Monitoring - Monitoring guide
EventBridge
Serverless
Integration
Architecture