A serverless offline plugin that enables aws eventBridge events
Install the plugin
npm install serverless-offline-aws-eventbridge --save
Let serverless know about the plugin, also note the order when combined with serverless webpack and offline
plugins:
- serverless-webpack
- serverless-offline
- serverless-offline-aws-eventbridge
Configuring the plugin
custom:
serverless-offline-aws-eventbridge:
port: 4010 # port to run the eventbridge mock server on
debug: false # flag to show debug messages
account: '' # account id that gets passed to the event
convertEntry: false # flag to convert entry to match cloudwatch
Checkout the documentation for AWS eventbridge in serverless framework and the AWS SDK for publishing and subscribing to events.
Scheduled events are also supported. When a cron fires the event object that is sent along is an empty object.
A simple example configuration in serverless with a Lambda function that publishes an event and a Lambda that subscribes to the event.
functions:
publishEvent:
handler: events.publish
events:
- http:
path: publish
method: get
consumeEvent:
handler: events.consume
events:
- eventBridge:
eventBus: marketing
pattern:
source:
- acme.newsletter.campaign
scheduledEvent:
handler: events.scheduled
events:
- eventBridge:
eventBus: marketing
# run every 5 minutes
schedule: "cron(0/5 * * * ? *)"
The events handler with two functions (publish and consume)
import AWS from 'aws-sdk';
export const publish = async () => {
try {
const eventBridge = new AWS.EventBridge({
endpoint: 'http://127.0.0.1:4010',
accessKeyId: "YOURKEY",
secretAccessKey: "YOURSECRET",
region: "eu-west-1"
});
await eventBridge.putEvents({
Entries: [
{
EventBusName: 'marketing',
Source: 'acme.newsletter.campaign',
DetailType: 'UserSignUp',
Detail: `{ "E-Mail": "[email protected]" }`,
},
]
}).promise();
return { statusCode: 200, body: 'published' };
} catch (e) {
console.error(e);
return { statusCode: 400, body: 'could not publish' };
}
}
export const consume = async (event, context) => {
console.log(event);
/*
{
EventBusName: 'marketing',
Source: 'acme.newsletter.campaign',
DetailType: 'UserSignUp',
Detail: `{ "E-Mail": "[email protected]" }`,
}
* If 'convertEntry' flag is true, out output will be
{
version: "0",
id: "xxxxxxxx-xxxx-xxxx-xxxx-1234443234563",
source: "acme.newsletter.campaign",
account: "",
time: "2020-06-19T16:37:00Z",
region: "us-east-1",
resources: [],
detail: {
{
"E-Mail": "[email protected]"
}
}
}
*/
return { statusCode: 200, body: JSON.stringify(event) };
}
export const scheduled = async (event, context) => {
console.log('scheduled event');
return { statusCode: 200, body: 'scheduled event' };
}
This plugin was created using node 12.16.1 and serverless framework core 1.67.0.
This plugin was inspired by the serverless-offline-sns plugin