diff --git a/packages/@aws-cdk/aws-lambda-event-sources/README.md b/packages/@aws-cdk/aws-lambda-event-sources/README.md index 5d1287d0ace7f..452fba4bed43a 100644 --- a/packages/@aws-cdk/aws-lambda-event-sources/README.md +++ b/packages/@aws-cdk/aws-lambda-event-sources/README.md @@ -113,8 +113,12 @@ import * as sns from '@aws-cdk/aws-sns'; import { SnsEventSource } from '@aws-cdk/aws-lambda-event-sources'; const topic = new sns.Topic(...); +const deadLetterQueue = new sqs.Queue(this, 'deadLetterQueue'); -lambda.addEventSource(new SnsEventSource(topic)); +lambda.addEventSource(new SnsEventSource(topic, { + filterPolicy: { ... }, + deadLetterQueue: deadLetterQueue +})); ``` When a user calls the SNS Publish API on a topic that your Lambda function is diff --git a/packages/@aws-cdk/aws-lambda-event-sources/lib/sns.ts b/packages/@aws-cdk/aws-lambda-event-sources/lib/sns.ts index cefd7fc20c286..e2f03ca2da4da 100644 --- a/packages/@aws-cdk/aws-lambda-event-sources/lib/sns.ts +++ b/packages/@aws-cdk/aws-lambda-event-sources/lib/sns.ts @@ -2,14 +2,23 @@ import * as lambda from '@aws-cdk/aws-lambda'; import * as sns from '@aws-cdk/aws-sns'; import * as subs from '@aws-cdk/aws-sns-subscriptions'; +/** + * Properties forwarded to the Lambda Subscription. + */ +export interface SnsEventSourceProps extends subs.LambdaSubscriptionProps { +} + /** * Use an Amazon SNS topic as an event source for AWS Lambda. */ export class SnsEventSource implements lambda.IEventSource { - constructor(readonly topic: sns.ITopic) { + private readonly props?: SnsEventSourceProps; + + constructor(readonly topic: sns.ITopic, props?: SnsEventSourceProps) { + this.props = props; } public bind(target: lambda.IFunction) { - this.topic.addSubscription(new subs.LambdaSubscription(target)); + this.topic.addSubscription(new subs.LambdaSubscription(target, this.props)); } } diff --git a/packages/@aws-cdk/aws-lambda-event-sources/test/test.sns.ts b/packages/@aws-cdk/aws-lambda-event-sources/test/test.sns.ts index 12224e95b6040..2c82ea19c42e0 100644 --- a/packages/@aws-cdk/aws-lambda-event-sources/test/test.sns.ts +++ b/packages/@aws-cdk/aws-lambda-event-sources/test/test.sns.ts @@ -1,5 +1,6 @@ import { expect, haveResource } from '@aws-cdk/assert'; import * as sns from '@aws-cdk/aws-sns'; +import * as sqs from '@aws-cdk/aws-sqs'; import * as cdk from '@aws-cdk/core'; import { Test } from 'nodeunit'; import * as sources from '../lib'; @@ -47,4 +48,67 @@ export = { test.done(); }, + + 'props are passed to subscription'(test: Test) { + // GIVEN + const stack = new cdk.Stack(); + const fn = new TestFunction(stack, 'Fn'); + const topic = new sns.Topic(stack, 'T'); + const queue = new sqs.Queue(stack, 'Q'); + const props: sources.SnsEventSourceProps = { + deadLetterQueue: queue, + filterPolicy: { + Field: sns.SubscriptionFilter.stringFilter({ + whitelist: ['A', 'B'], + }), + }, + }; + + // WHEN + fn.addEventSource(new sources.SnsEventSource(topic, props)); + + // THEN + expect(stack).to(haveResource('AWS::Lambda::Permission', { + 'Action': 'lambda:InvokeFunction', + 'FunctionName': { + 'Fn::GetAtt': [ + 'Fn9270CBC0', + 'Arn', + ], + }, + 'Principal': 'sns.amazonaws.com', + 'SourceArn': { + 'Ref': 'TD925BC7E', + }, + })); + + expect(stack).to(haveResource('AWS::SNS::Subscription', { + 'Endpoint': { + 'Fn::GetAtt': [ + 'Fn9270CBC0', + 'Arn', + ], + }, + 'Protocol': 'lambda', + 'TopicArn': { + 'Ref': 'TD925BC7E', + }, + 'FilterPolicy': { + 'Field': [ + 'A', + 'B', + ], + }, + 'RedrivePolicy': { + 'deadLetterTargetArn': { + 'Fn::GetAtt': [ + 'Q63C6E3AB', + 'Arn', + ], + }, + }, + })); + + test.done(); + }, };