RIO Events Bus
The single custom Amazon EventBridge bus that carries every RIO domain event. One bus per environment.
Overview
RIO uses one custom EventBridge bus per environment — dev-rio-events, qa-rio-events,
prod-rio-events. It is created a single time in rio-infra
(infrastructure/template.yaml:328-331, logical id RioEventBus) and exported as the stack output
RioEventBusName (template.yaml:508).
Every other service stack receives the bus name as an EventBusName CloudFormation parameter rather
than creating its own bus. No repository in the platform declares a second AWS::Events::EventBus.
How consumers subscribe
Because there is one bus, subscribers filter on the event’s source and detail-type fields rather
than on separate streams. Each event page in this catalog records its exact source and detail-type
so you can write a matching rule.
Sources published to this bus
source | Publishing service | Repository |
|---|---|---|
rio.core | Identity & Hierarchy Service | rio-identity-service |
rio.api.hierarchy_change | Identity & Hierarchy Service (hierarchy fan-out) | rio-identity-service |
rio.commit | Commit (Revenue Planning) Service | rio-commit-service |
rio.platform | Data Ingestion Service (audit family) | rio-ingestion-service |
rio.glue.crm_sync | Data Ingestion Service (hierarchy) | rio-ingestion-service |
rio.activity | Activity Signal Service | rio-deal-desk |
rio.core.activity | Activity Signal Service (email pipeline) | rio-deal-desk |
rio.notification.api | Notification Service (FastAPI) | rio-platform-notification-service |
rio.forecast-notification | Notification Service (forecast Lambda) | rio-platform-notification-service |
rio.platform.notification | Notification Service (dispatch Lambda) | rio-platform-notification-service |
Naming rules
Per .claude/rules/eventbridge.md, custom events on this bus must use a lowercase dotted source
and a space-separated Title Case detail-type (for example User Created, not UserCreated).
Values nested inside detail must be lowercase so EventBridge’s exact-match filtering works without
equals-ignore-case.