serverless
Version:
Serverless Framework - Build web, mobile and IoT applications with serverless architectures using AWS Lambda, Azure Functions, Google CloudFunctions & more
200 lines (165 loc) • 5.44 kB
Markdown
<!--
title: Serverless Framework - AWS Lambda Events - SNS
menuText: SNS
menuOrder: 7
description: Setting up AWS SNS Events with AWS Lambda via the Serverless Framework
layout: Doc
-->
<!-- DOCS-SITE-LINK:START automatically generated -->
### [Read this on the main serverless docs site](https://www.serverless.com/framework/docs/providers/aws/events/sns)
<!-- DOCS-SITE-LINK:END -->
# SNS
In the following example we create a new SNS topic with the name `dispatch` which is bound to the `dispatcher` function. The function will be called every time a message is sent to the `dispatch` topic.
```yml
functions:
dispatcher:
handler: dispatcher.dispatch
events:
- sns: dispatch
```
You're also able to add the same SNS topic to multiple functions:
```yml
functions:
dispatcher:
handler: dispatcher.dispatch
events:
- sns: dispatch
dispatcher2:
handler: dispatcher2.dispatch
events:
- sns: dispatch
```
This will run both functions for a message sent to the dispatch topic.
## Using a pre-existing topic
If an `arn:` is specified, the framework will give permission to the topic to invoke the function and subscribe the function to the topic.
```yml
functions:
dispatcher:
handler: dispatcher.dispatch
events:
- sns: arn:xxx
```
```yml
functions:
dispatcher:
handler: dispatcher.dispatch
events:
- sns:
arn: arn:xxx
```
Or with intrinsic CloudFormation function like `Fn::Join`, `Fn::GetAtt`, or `Fn::Ref` (or their shorthand counterparts).
**Note:** The arn can be in a different region to enable cross region invocation
```yml
functions:
dispatcher:
handler: dispatcher.dispatch
events:
- sns:
arn:
Fn::Join:
- ':'
- - 'arn:aws:sns'
- Ref: 'AWS::Region'
- Ref: 'AWS::AccountId'
- 'MyCustomTopic'
topicName: MyCustomTopic
```
If your SNS topic doesn't yet exist but is defined in the serverless.yml file you're editing, you'll need to use `Fn::Ref` or `!Ref` to get the ARN. Do not build a string as in the above example!
```yml
functions:
dispatcher:
handler: dispatcher.dispatch
events:
- sns:
arn: !Ref SuperTopic
topicName: MyCustomTopic
resources:
Resources:
SuperTopic:
Type: AWS::SNS::Topic
Properties:
TopicName: MyCustomTopic
```
**Note:** If an `arn` string is specified but not a `topicName`, the last substring starting with `:` will be extracted as the `topicName`. If an `arn` object is specified, `topicName` must be specified as a string, used only to name the underlying Cloudformation mapping resources. You can take advantage of this behavior when subscribing to multiple topics with the same name in different regions/accounts to avoid collisions between Cloudformation resource names.
```yml
functions:
hello:
handler: handler.run
events:
- sns:
arn: arn:aws:sns:us-east-1:00000000000:topicname
topicName: topicname-account-1-us-east-1
- sns:
arn: arn:aws:sns:us-east-1:11111111111:topicname
topicName: topicname-account-2-us-east-1
```
## Setting a display name
This event definition ensures that the `aggregator` function gets called every time a message is sent to the
`aggregate` topic. `Data aggregation pipeline` will be shown in the AWS console so that the user can understand what the
SNS topic is used for.
```yml
functions:
aggregator:
handler: aggregator.handler
events:
- sns:
topicName: aggregate
displayName: Data aggregation pipeline
```
## Setting a filter policy
This event definition creates an SNS topic which subscription uses a filter policy. The filter policy filters out messages that don't have attribute key `pet` with value `dog` or `cat`.
```yml
functions:
pets:
handler: pets.handler
events:
- sns:
topicName: pets
filterPolicy:
pet:
- dog
- cat
```
## Setting a redrive policy
This event definition creates an SNS topic that sends messages to a Dead Letter Queue (defined by its ARN) when the associated lambda is not available. In this example, messages that aren't delivered to the `dispatcher` Lambda (because the lambda service is down or irresponsive) will end in `myDLQ`.
```yml
functions:
dispatcher:
handler: dispatcher.handler
events:
- sns:
topicName: dispatcher
redrivePolicy:
deadLetterTargetArn: arn:aws:sqs:us-east-1:11111111111:myDLQ
```
To define the Dead Letter Queue, you can alternatively use the the resource name with `deadLetterTargetRef`
```yml
functions:
dispatcher:
handler: dispatcher.handler
events:
- sns:
topicName: dispatcher
redrivePolicy:
deadLetterTargetRef: myDLQ
resources:
Resources:
myDLQ:
Type: AWS::SQS::Queue
Properties:
QueueName: myDLQ
```
Or if you want to use values from other stacks, you can
also use `deadLetterTargetImport` to define the DLQ url and arn with exported values
```yml
functions:
dispatcher:
handler: dispatcher.handler
events:
- sns:
topicName: dispatcher
redrivePolicy:
deadLetterTargetImport:
arn: MyShared-DLQArn
url: MyShared-DLQUrl
```