AWS CDK 将多个 Lambda 订阅到同一个 SNS 队列

问题描述

我想执行 here 中列出的第一种方法,为了在更新单个 S3 存储桶时触发各种 lambda 函数运行,我会在两者之间放置一个 SNS 队列。

目前我将每个 Lambda 作为一个堆栈,我更愿意保持这种方式,特别是因为我有单独的管道阶段,我无论如何都需要分开。但是,我希望能够让它们都共享相同的 SNS 队列。这样做的最佳方法是什么?

根据我的想法,最好的方法是创建一个“sns 队列堆栈”来创建主题,然后将该主题传递到每个 lambda 堆栈并以这种方式订阅 lambda 函数,但我仍然不确定部署此 sns 队列堆栈的最佳方式。

关于在 CDK 中使用部署管道,这对我来说是最令人困惑的。我有多个管道阶段,每个阶段都有多个部署组和所述部署组中的多个 lambda 堆栈。我应该如何添加这个堆栈以确保它被正确部署?

我猜测我会在所有其他堆栈之前将它添加到第一个部署组的第一个阶段,然后它应该适用于每个其他阶段,但我不确定这是否是一种方式工作。

解决方法

我们可以使用两种方法。

单个 CDK 项目中的多个堆栈:

我们在同一个项目中有多个堆栈的单个 CDK 项目。例如,我们有 1 个包含 SNS 主题的堆栈,每个 lambda 及其 SNS 订阅有 1 个堆栈。我们可以在堆栈中使用 sns 主题名称,例如记录的 here

const snsStack = new MySnsStack(app,'my-sns-stack');

// each stack takes property topic as input,which behind the scenes perform cloudformation export and import.
 new MyLambdaOne(app,'Stack2',{
  topic: snsStack.topic
});
 new MyLambdaTwo(app,{
  topic: snsStack.topic
});

我们需要做的就是 cdk deploy 并且堆栈按正确的顺序排列和部署。即首先是 sns 堆栈,然后是基于引用的其余 lambda 堆栈。

多个 CDK 项目:

我们每个 cdk 项目有 1 个堆栈。所以,我们有多个 CDK 项目需要维护。然后,我们必须使用 cfnOutput 从第一个堆栈手动导出主题 Arn,并使用 Fn.ImportValue 在其他堆栈中导入主题 arn。 然后我们需要分别运行多个部署 cdk deploy MySnsStackcdk deploy MyLambdaStack 等。首先是 sns 堆栈,其余的并行。