Skip to content

Commit 08cd73b

Browse files
committed
feat(serverless-example): add basic serverless SNS example
1 parent 6eaf3d3 commit 08cd73b

6 files changed

Lines changed: 133 additions & 0 deletions

File tree

examples/serverless/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
.serverless

examples/serverless/README.md

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
# Serverless example
2+
3+
Fictional application running using the [Serverless](https://github.com/serverless/serverless) framework.
4+
5+
**Message Producer**
6+
7+
Small utility that takes a request and publishes a message to an SQS queue.
8+
9+
**Message Consumer**
10+
11+
Lambda function that reads from SQS and processes the data.
12+
13+
14+
## Deploy service
15+
16+
Ensure you have valid AWS credentials in your environment, and then run;
17+
18+
```sh
19+
export AWS_ACCOUNT_ID=1234xxxx5678 # Required by function at runtime
20+
serverless deploy -v
21+
```
22+
23+
## How we set this up
24+
25+
```sh
26+
npm install -g serverless
27+
serverless create --template aws-nodejs --path sqs-publisher
28+
```
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
'use strict';
2+
3+
const AWS = require('aws-sdk');
4+
5+
// Consumer handler, responsible for extracting message from SNS
6+
// and dealing with lambda-related things.
7+
module.exports.handler = (event, context, callback) => {
8+
console.log("Received event from SNS");
9+
10+
event.Records.forEach(e => {
11+
console.log("Event:", JSON.parse(e.Sns.Message));
12+
consumeEvent(e)
13+
});
14+
15+
callback(null, {
16+
event
17+
});
18+
};
19+
20+
// Actual consumer code, has no Lambda/AWS/Protocol specific stuff
21+
// This is the thing we test in the Consumer Pact tests
22+
const consumeEvent = (event) => {
23+
24+
// save in dynamo or something...
25+
console.log('consuming event', event)
26+
27+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
# package directories
2+
node_modules
3+
jspm_packages
4+
5+
# Serverless directories
6+
.serverless
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
'use strict';
2+
3+
const AWS = require('aws-sdk');
4+
5+
const TOPIC_ARN = process.env.TOPIC_ARN;
6+
7+
// Handler is the Lambda and SNS specific code
8+
// The message generation logic is separated from the handler itself
9+
// in the
10+
module.exports.handler = (event, context, callback) => {
11+
const message = createEvent(event);
12+
13+
const sns = new AWS.SNS();
14+
15+
const params = {
16+
Message: message.body,
17+
TopicArn: TOPIC_ARN
18+
};
19+
20+
sns.publish(params, (error, data) => {
21+
if (error) {
22+
callback(error);
23+
}
24+
25+
console.log("Message successfully published to queue")
26+
callback(null, {
27+
message: 'Message successfully published to SNS topic "pact-events"',
28+
event
29+
});
30+
});
31+
32+
callback(null, message);
33+
};
34+
35+
// Separate your producer code, from the lambda handler.
36+
// No Lambda/AWS/Protocol specific stuff in here..
37+
const createEvent = (event) => {
38+
return {
39+
statusCode: 200,
40+
body: JSON.stringify({
41+
message: 'Go Serverless v1.0! Your function executed successfully!',
42+
input: event,
43+
}),
44+
};
45+
};

examples/serverless/serverless.yml

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# Serverless SNS
2+
service: pact-events
3+
4+
provider:
5+
name: aws
6+
runtime: nodejs6.10
7+
iamRoleStatements:
8+
- Effect: "Allow"
9+
Resource: "*"
10+
Action:
11+
- "sns:*"
12+
environment:
13+
ACCOUNT_ID: { "Ref": "AWS::AccountId" }
14+
# TOPIC_ARN: { "Ref": "SNSTopicPactevents" }
15+
TOPIC_ARN: { "Fn::Join": ["", ["arn:aws:sns:us-east-1:", { "Ref": "AWS::AccountId" }, ":pact-events"] ] }
16+
17+
package:
18+
individually: true
19+
20+
functions:
21+
publisher:
22+
handler: publisher/index.handler
23+
consumer:
24+
handler: consumer/index.handler
25+
events:
26+
- sns: pact-events

0 commit comments

Comments
 (0)