EventBridge (CloudWatch Events)
Amazon EventBridge (formerly CloudWatch Events) allows you to respond to state changes in your AWS resources and custom events.
Event Structure
class EventBridgeEvent:
version: str # Event version
id: str # Unique event ID
detail_type: str # Type of event (e.g., "Scheduled Event")
source: str # Event source (e.g., "aws.events")
account: str # AWS account ID
time: str # Event timestamp
region: str # AWS region
resources: List[str] # Affected AWS resources
detail: Dict[str, Any] # Event-specific details
Usage Examples
Scheduled Tasks
from lambda_universal_router import Router
from lambda_universal_router.events import EventBridgeEvent
router = Router()
@router.eventbridge()
def daily_cleanup(event: EventBridgeEvent, context):
if event.detail_type == "Scheduled Event":
print(f"Running daily cleanup at {event.time}")
# Perform cleanup tasks
AWS Service Events
@router.eventbridge()
def handle_ec2_changes(event: EventBridgeEvent, context):
if event.source == "aws.ec2" and event.detail_type == "EC2 Instance State-change Notification":
instance_id = event.detail.get('instance-id')
state = event.detail.get('state')
print(f"Instance {instance_id} changed to state: {state}")
Custom Events
@router.eventbridge()
def handle_custom_events(event: EventBridgeEvent, context):
if event.source == "my.application":
if event.detail_type == "UserSignup":
handle_new_user(event.detail)
elif event.detail_type == "OrderPlaced":
process_order(event.detail)
Cross-Account Events
@router.eventbridge()
def handle_multi_account(event: EventBridgeEvent, context):
print(f"Event from account: {event.account}")
print(f"In region: {event.region}")
print(f"Affected resources: {event.resources}")
Common Event Types
- Scheduled Events
{ "version": "0", "id": "53dc4d37-cffa-4f76-80c9-8b7d4a4d2eaa", "detail-type": "Scheduled Event", "source": "aws.events", "account": "123456789012", "time": "2019-10-08T16:53:06Z", "region": "us-east-1", "resources": ["arn:aws:events:us-east-1:123456789012:rule/MyScheduledRule"], "detail": {} }
- AWS Service Events
{ "version": "0", "id": "7bf73129-1428-4cd3-a780-95db273d1602", "detail-type": "EC2 Instance State-change Notification", "source": "aws.ec2", "account": "123456789012", "time": "2019-11-11T21:29:54Z", "region": "us-east-1", "resources": ["arn:aws:ec2:us-east-1:123456789012:instance/i-1234567890abcdef0"], "detail": { "instance-id": "i-1234567890abcdef0", "state": "running" } }
- Custom Events
{ "version": "0", "id": "6a7e8feb-b491-4cf7-a9f1-bf3703467718", "detail-type": "OrderPlaced", "source": "my.application", "account": "123456789012", "time": "2019-12-02T17:22:43Z", "region": "us-east-1", "resources": [], "detail": { "orderId": "12345", "amount": 123.45 } }
Best Practices
- Event Pattern Matching
- Check both
source
anddetail-type
- Use type hints for better code completion
- Handle unknown event types gracefully
- Check both
- Error Handling
@router.eventbridge() def handle_events(event: EventBridgeEvent, context): try: if event.detail_type == "Scheduled Event": process_scheduled_task() else: log_unknown_event(event) except Exception as e: handle_error(e, event)
- Logging
@router.eventbridge() def handle_events(event: EventBridgeEvent, context): print(f"Processing {event.detail_type} from {event.source}") print(f"Event details: {event.detail}")