首页 > 解决方案 > AWS CDK 将多个 Lambda 订阅到同一个 SNS 队列

问题描述

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

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

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

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

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

标签: amazon-web-servicesaws-lambdaamazon-cloudformationaws-cdk

解决方案


我们可以使用两种方法。

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

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

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, 'Stack2', {
  topic: snsStack.topic
});

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

多个 CDK 项目:

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


推荐阅读