in apigw-sns-sqs-lambda-cdk/cdk/lib/cdk-apigw-sns-sqs-lambda-stack.ts [16:84]
constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
const topic = new sns.Topic(this, 'topic')
const subscriberQueueOne = new sqs.Queue(this, 'SubscriberQueueOne');
topic.addSubscription(new subscriptions.SqsSubscription(subscriberQueueOne));
const workerLambdaTypeOne = new lambda.Function(this, 'workerLambdaTypeOneHandler',{
runtime: lambda.Runtime.NODEJS_14_X,
handler: 'app.handler',
code: lambda.Code.fromAsset(path.join(__dirname, '../src')),
events: [new SqsEventSource(subscriberQueueOne)]
});
const subscriberQueueTwo = new sqs.Queue(this, 'SubscriberQueueTwo');
topic.addSubscription(new subscriptions.SqsSubscription(subscriberQueueTwo));
const workerLambdaTypeTwo = new lambda.Function(this, 'workerLambdaTypeTwoHandler',{
runtime: lambda.Runtime.NODEJS_14_X,
handler: 'app.handler',
code: lambda.Code.fromAsset(path.join(__dirname, '../src')),
events: [new SqsEventSource(subscriberQueueTwo)]
});
const gatewayExecutionRole: any = new iam.Role(this, "GatewayExecutionRole", {
assumedBy: new iam.ServicePrincipal("apigateway.amazonaws.com"),
inlinePolicies: {
"PublishMessagePolicy": new iam.PolicyDocument({
statements: [new iam.PolicyStatement({
actions: ["sns:Publish"],
resources: [topic.topicArn]
})]
})
}
});
const api = new apigateway.RestApi(this, 'RestApi');
api.root.addMethod('POST',
new apigateway.AwsIntegration({
service: 'sns',
integrationHttpMethod: 'POST',
path: `${cdk.Aws.ACCOUNT_ID}/${topic.topicName}`,
options: {
credentialsRole: gatewayExecutionRole,
passthroughBehavior: apigateway.PassthroughBehavior.NEVER,
requestParameters: {
"integration.request.header.Content-Type": `'application/x-www-form-urlencoded'`,
},
requestTemplates: {
"application/json": `Action=Publish&TopicArn=$util.urlEncode('${topic.topicArn}')&Message=$util.urlEncode($input.body)`,
},
integrationResponses: [
{
statusCode: "200",
responseTemplates: {
"application/json": `{"status": "message added to topic"}`,
},
},
{
statusCode: "400",
selectionPattern: "^\[Error\].*",
responseTemplates: {
"application/json": `{\"state\":\"error\",\"message\":\"$util.escapeJavaScript($input.path('$.errorMessage'))\"}`,
},
}
],
}
}),{ methodResponses: [{ statusCode: "200" }, { statusCode: "400" }] }
);
}