EventBus
The EventBus
construct is a higher level CDK construct that makes it easy to create an EventBridge Event Bus. You can create a bus that has a list of rules and targets. And you can publish messages to it from any part of your serverless app.
You can have two types of targets; Function targets (with a Lambda function) or Queue targets (with an SQS queue). See the examples for more details.
Examples
Using the minimal config
import { EventBus } from "sst/constructs";
new EventBus(stack, "Bus", {
rules: {
myRule: {
pattern: { source: ["myevent"] },
targets: {
myTarget1: "src/function1.handler",
myTarget2: "src/function2.handler",
},
},
},
});
Note that, myRule
here is simply a key to identify the rule.
Configuring rules
Lazily adding rules
Add rules after the EventBus has been created.
const bus = new EventBus(stack, "Bus", {
rules: {
myRule: {
pattern: { source: ["myevent"] },
targets: {
myTarget1: "src/target1.main",
myTarget2: "src/target2.main",
},
},
},
});
bus.addRules(stack, {
myRule2: {
pattern: { source: ["myevent"] },
targets: {
myTarget3: "src/target3.main",
myTarget4: "src/target4.main",
},
},
});
Lazily adding targets
const bus = new EventBus(stack, "Bus", {
rules: {
myRule: {
pattern: { source: ["myevent"] },
targets: {
myTarget1: "src/target1.main",
},
},
},
});
bus.addTargets(stack, "myRule", {
myTarget2: "src/target2.main",
});
Configuring the Rule
Configure the internally created CDK Rule
instance.
new EventBus(stack, "Bus", {
rules: {
myRule: {
ruleName: "MyRule",
pattern: { source: ["myevent"] },
targets: {
myTarget1: "src/target1.main",
myTarget2: "src/target2.main",
},
},
},
});
Configuring Function targets
Adding targets
You can directly pass in the path to the Function
.
new EventBus(stack, "Bus", {
rules: {
myRule: {
pattern: { source: ["myevent"] },
targets: {
myTarget1: "src/target1.main",
},
},
},
});
Specifying function props for all targets
You can extend the minimal config, to set some function props and have them apply to all the rules.
new EventBus(stack, "Bus", {
defaults: {
function: {
timeout: 20,
environment: { tableName: table.tableName },
permissions: [table],
},
},
rules: {
myRule: {
pattern: { source: ["myevent"] },
targets: {
myTarget1: "src/target1.main",
myTarget2: "src/target2.main",
},
},
},
});
Configuring an individual target
Configure each Lambda function separately.
new EventBus(stack, "Bus", {
rules: {
myRule: {
pattern: { source: ["myevent"] },
targets: {
myTarget1: {
function: {
srcPath: "src/",
handler: "target1.main",
environment: { tableName: table.tableName },
permissions: [table],
},
},
},
},
},
});
Note that, you can set the defaultFunctionProps
while using the function
per target. The function
will just override the defaultFunctionProps
. Except for the environment
, the layers
, and the permissions
properties, that will be merged.
new EventBus(stack, "Bus", {
defaults: {
function: {
timeout: 20,
environment: { tableName: table.tableName },
permissions: [table],
},
},
rules: {
myRule: {
pattern: { source: ["myevent"] },
targets: {
myTarget1: {
function: {
handler: "src/target1.main",
timeout: 10,
environment: { bucketName: bucket.bucketName },
permissions: [bucket],
},
},
myTarget2: "src/target2.main",
},
},
},
});
So in the above example, the target1
function doesn't use the timeout
that is set in the defaultFunctionProps
. It'll instead use the one that is defined in the function definition (10 seconds
). And the function will have both the tableName
and the bucketName
environment variables set; as well as permissions to both the table
and the bucket
.
Configuring the target
Configure the internally created CDK Target
.
import { RuleTargetInput } from "aws-cdk-lib/aws-events";
new EventBus(stack, "Bus", {
rules: {
myRule: {
pattern: { source: ["myevent"] },
targets: {
myTarget1: {
function: "src/target1.main",
cdk: {
target: {
retryAttempts: 20,
message: RuleTargetInput.fromEventPath("$.detail"),
},
},
},
},
},
},
});
In the example above, the function is invoked with the contents of the detail
property on the event, instead of the envelope - i.e. the original payload put onto the EventBus.
Attaching permissions for all targets
Allow all the targets in the entire EventBus to access S3.
const bus = new EventBus(stack, "Bus", {
rules: {
myRule: {
pattern: { source: ["myevent"] },
targets: {
myTarget1: "src/target1.main",
myTarget2: "src/target2.main",
},
},
},
});
bus.attachPermissions(["s3"]);
Attaching permissions for a specific target
Allow one of the targets to access S3.
const bus = new EventBus(stack, "Bus", {
rules: {
myRule: {
pattern: { source: ["myevent"] },
targets: {
myTarget1: "src/target1.main",
myTarget2: "src/target2.main",
},
},
},
});
bus.attachPermissionsToTarget("myRule", 0, ["s3"]);
Here we are referring to the rule using the rule key, myRule
.
Configuring Queue targets
Specifying the Queue directly
You can directly pass in a Queue
.
const myQueue = new Queue(stack, "MyQueue");
new EventBus(stack, "Bus", {
rules: {
myRule: {
pattern: { source: ["myevent"] },
targets: {
myTarget1: myQueue,
},
},
},
});
Configuring the target
Configure the internally created CDK Target
.
new EventBus(stack, "Bus", {
rules: {
myRule: {
pattern: { source: ["myevent"] },
targets: {
myTarget1: {
type: "queue",
queue: myQueue,
cdk: {
target: {
messageGroupId: "group1",
},
},
},
},
},
},
});
Configuring Log Group targets
import { LogGroup } from "aws-cdk-lib/aws-logs";
new EventBus(stack, "Bus", {
rules: {
myRule: {
pattern: { source: ["myevent"] },
targets: {
myTarget1: {
type: "log_group",
cdk: {
logGroup: LogGroup.fromLogGroupName(stack, "Logs", "/my/target/log"),
}
},
},
},
},
});
Receiving AWS events
When an AWS service in your account emits an event, it goes to your account’s default event bus.
import * as events from "aws-cdk-lib/aws-events";
new EventBus(stack, "Bus", {
cdk: {
eventBus: events.EventBus.fromEventBusName(stack, "ImportedBus", "default"),
},
rules: {
myRule: {
pattern: { source: ["aws.codebuild"] },
targets: {
myTarget1: "src/target1.main",
myTarget2: "src/target2.main",
},
},
},
});
Advanced examples
Configuring the EventBus
Configure the internally created CDK EventBus
instance.
new EventBus(stack, "Bus", {
cdk: {
eventBus: {
eventBusName: "MyEventBus",
},
},
rules: {
myRule: {
pattern: { source: ["myevent"] },
targets: {
myTarget1: "src/target1.main",
myTarget2: "src/target2.main",
},
},
},
});
Importing an existing EventBus
Override the internally created CDK EventBus
instance.
import * as events from "aws-cdk-lib/aws-events";
new EventBus(stack, "Bus", {
cdk: {
eventBus: events.EventBus.fromEventBusName(
stack,
"ImportedBus",
eventBusArn
),
},
rules: {
myRule: {
pattern: { source: ["myevent"] },
targets: {
myTarget1: "src/target1.main",
myTarget2: "src/target2.main",
},
},
},
});
Using existing Lambda functions as targets
import * as lambda from "aws-cdk-lib/aws-lambda";
new EventBus(stack, "Bus", {
rules: {
myRule: {
pattern: { source: ["myevent"] },
targets: {
myTarget: {
cdk: {
function: lambda.Function.fromFunctionName(
stack,
"ITarget",
"my-function"
),
},
},
},
},
},
});
Sharing an EventBus across stacks
You can create the EventBus construct in one stack, and add rules in other stacks. To do this, return the EventBus from the stack function
import { EventBus, App, StackContext } from "sst/constructs";
export function MainStack({ stack }: StackContext) {
const bus = new EventBus(stack, "Bus", {
rules: {
myRule: {
pattern: { source: ["myevent"] },
targets: {
myTarget1: "src/target1.main",
myTarget2: "src/target2.main",
},
},
},
});
return {
bus,
};
}
Then import the auth construct into another stack with use
and call addRules
. Note that the AWS resources for the added routes will be created in AnotherStack
.
import { EventBus, StackContext } from "sst/constructs";
import { MainStack } from "./MainStack";
export function AnotherStack({ stack }: StackContext) {
const { bus } = use(MainStack);
bus.addRules(stack, {
myRule2: {
targets: {
myTarget3: "src/target3.main",
myTarget4: "src/target4.main",
},
},
});
}
Constructor
new EventBus(scope, id, props)
Parameters
- scope Construct
- id string
- props EventBusProps
EventBusProps
defaults?
Type :
defaults.function?
Type : FunctionProps
The default function props to be applied to all the Lambda functions in the EventBus. The
environment
,
permissions
and
layers
properties will be merged with per route definitions if they are defined.
new EventBus(stack, "Bus", {
defaults: {
function: {
timeout: 20,
}
},
});
defaults.retries?
Type : number
Enable retries with exponential backoff for all lambda function targets in this eventbus
new EventBus(stack, "Bus", {
retries: 20
});
rules?
Type : Record<string, EventBusRuleProps>
The rules for the eventbus
new EventBus(stack, "Bus", {
rules: {
myRule: {
pattern: { source: ["myevent"] },
targets: {
myTarget: "src/function.handler"
},
},
},
});
cdk?
Type :
cdk.eventBus?
Type : IEventBus | EventBusProps
Override the internally created EventBus
new EventBus(stack, "Bus", {
cdk: {
eventBus: {
eventBusName: "MyEventBus",
},
}
});
cdk.id?
Type : string
Allows you to override default id for this construct.
Properties
An instance of EventBus
has the following properties.
eventBusArn
Type : string
The ARN of the internally created
EventBus
instance.
eventBusName
Type : string
The name of the internally created
EventBus
instance.
id
Type : string
cdk
Type :
cdk.eventBus
Type : IEventBus
The internally created CDK
EventBus
instance.
Methods
An instance of EventBus
has the following methods.
addRules
addRules(scope, rules)
Parameters
- scope Construct
- rules Record<string, EventBusRuleProps>
Add rules after the EventBus has been created.
bus.addRules(stack, {
myRule2: {
pattern: { source: ["myevent"] },
targets: {
myTarget3: "src/function3.handler"
myTarget4: "src/function4.handler"
},
},
});
addTargets
addTargets(scope, ruleKey, targets)
Parameters
- scope Construct
- ruleKey string
- targets Record<string, Queue | string | Function | EventBusFunctionTargetProps | EventBusQueueTargetProps | EventBusLogGroupTargetProps>
Add targets to existing rules.
bus.addRules(stack, "myRule", {
myTarget1: "src/function1.handler"
myTarget2: "src/function2.handler"
});
attachPermissions
attachPermissions(permissions)
Parameters
- permissions Permissions
Add permissions to all event targets in this EventBus.
bus.attachPermissions(["s3"]);
attachPermissionsToTarget
attachPermissionsToTarget(ruleKey, targetName, permissions)
Parameters
- ruleKey string
- targetName string
- permissions Permissions
Add permissions to a specific event bus rule target
const bus = new EventBus(stack, "Bus", {
rules: {
myRule: {
pattern: { source: ["myevent"] },
targets: {
myTarget1: "src/function1.handler"
myTarget2: "src/function2.handler"
},
},
},
});
bus.attachPermissionsToTarget("myRule", 0, ["s3"]);
bind
bind(constructs)
Parameters
- constructs Array<BindingResource>
Binds the given list of resources to all event targets in this EventBus.
bus.bind([STRIPE_KEY, bucket]);
bindToTarget
bindToTarget(ruleKey, targetName, constructs)
Parameters
- ruleKey string
- targetName string
- constructs Array<BindingResource>
Binds the given list of resources to a specific event bus rule target
const bus = new EventBus(stack, "Bus", {
rules: {
myRule: {
pattern: { source: ["myevent"] },
targets: {
myTarget1: "src/function1.handler"
myTarget2: "src/function2.handler"
},
},
},
});
bus.bindToTarget("myRule", 0, [STRIPE_KEY, bucket]);
getRule
getRule(key)
Parameters
- key string
Get a rule
bus.getRule("myRule");
subscribe
subscribe(type, target, props)
Parameters
- type string | Array<string>
- target string | Function | FunctionProps
- props
props.retries?
Type : number
subscribe(scope, type, target, props)
Parameters
- scope Construct
- type string | Array<string>
- target string | Function | FunctionProps
- props
props.retries?
Type : number
EventBusRuleProps
Used to configure an EventBus rule
pattern?
Type :
pattern.detail?
Type :
Fields to match on the detail field
new EventBus(stack, "Bus", {
rules: {
myRule: {
pattern: { detail: { FOO: 1 } },
},
},
});
pattern.detailType?
Type : Array<string>
A list of detailTypes to filter on
new EventBus(stack, "Bus", {
rules: {
myRule: {
pattern: { detailType: ["foo"] },
},
},
});
pattern.source?
Type : Array<string>
A list of sources to filter on
new EventBus(stack, "Bus", {
rules: {
myRule: {
pattern: { source: ["myevent"] },
},
},
});
targets?
Type : Record<string, Queue | string | Function | EventBusFunctionTargetProps | EventBusQueueTargetProps | EventBusLogGroupTargetProps>
Configure targets for this rule.
new EventBus(stack, "Bus", {
rules: {
myRule: {
targets: {
myTarget1: "src/function.handler",
myTarget2: new Queue(stack, "MyQueue"),
}
},
},
});
cdk?
Type :
cdk.rule?
Type : Omit<RuleProps, "eventBus" | "targets">
Configure the internally created CDK
Rule
instance.
new EventBus(stack, "Bus", {
rules: {
myRule: {
cdk: {
rule: {
ruleName: "my-rule",
enabled: false,
},
},
targets: {
myTarget1: "src/lambda.handler",
},
},
},
});
EventBusQueueTargetProps
Used to configure an EventBus queue target
new EventBus(stack, "Bus", {
rules: {
myRule: {
targets: {
myTarget: {
type: "queue",
queue: new Queue(stack, "Queue")
}
}
},
},
});
queue
Type : Queue
The queue to trigger
type
Type : "queue"
String literal to signify that the target is a queue
cdk?
Type :
cdk.target?
Type : SqsQueueProps
EventBusFunctionTargetProps
Used to configure an EventBus function target
new EventBus(stack, "Bus", {
rules: {
myRule: {
targets: {
myTarget: { function: "src/function.handler" },
}
},
},
});
function?
Type : string | Function | FunctionProps
The function to trigger
retries?
Type : number
Number of retries
type?
Type : "function"
String literal to signify that the target is a function
cdk?
Type :
cdk.function?
Type : IFunction
cdk.target?
Type : LambdaFunctionProps
EventBusLogGroupTargetProps
Used to configure an EventBus log group target
new EventBus(stack, "Bus", {
rules: {
myRule: {
targets: {
myTarget: {
type: "log_group",
cdk: {
logGroup: LogGroup.fromLogGroupName(stack, "Logs", "/my/target/log"),
}
}
}
},
},
});
type
Type : "log_group"
String literal to signify that the target is a log group
cdk
Type :
cdk.logGroup
Type : ILogGroup
cdk.target?
Type : LogGroupProps