SNS + CloudFormation

Posted

技术标签:

【中文标题】SNS + CloudFormation【英文标题】: 【发布时间】:2017-03-27 05:49:01 【问题描述】:

我正在使用 AWS CloudFormation 为微服务构建堆栈。我的 AWS CloudFormation 模板创建资源,例如:Lambda 函数、SNS 主题和 API 网关。

这个微服务会做一些工作并将消息发布到 SNS 主题。其他微服务订阅此主题。

我面临的问题是,当我升级我的微服务的 CloudFormation 模板(有时我需要重新部署它并重新创建所有资源)时,SNS 主题更改了它的ARN。因此,所有使用此主题的微服务也需要更改。

我想我可以为 SNS 主题创建一个单独的 CloudFormation 模板(每个微服务有多个模板)。

这是一个好方法吗? 如果不是,推荐的方法是什么?

【问题讨论】:

你能分享你的模板吗?或者分享发生这种情况时您正在更改的内容? 在这种情况下,我正在升级无服务器框架版本。所以我知道它会删除并重新创建堆栈。 如何在发布者和订阅者堆栈之间共享 SNS 主题? 【参考方案1】:

根据 AWS CloudFormation 文档,一个 SNS 主题有 3 个可用属性,只有更改第三个属性(即TopicName)才会导致替换 SNS 资源(并导致生成新的 ARN)。

由于您正在对 CloudFormation 堆栈中的资源进行核对,然后重新创建它们(您提到这就是您使用的无服务器框架的工作方式),您可以通过指定 TopicName 属性来保留 SNS 主题 ARN模板中的 SNS 主题(只有在未指定 TopicName 时才会出现 CloudFormation 并分配一个随机名称,否则它使用用户指定的名称)。

话虽如此,你的场景对我来说确实有点不自然。如果您尚未通过 CloudFormation 管理对该主题的订阅,我建议您这样做,并且如果 SNS 主题 ARN 发生变化,它应该会自动为您在替换的 SNS 主题上创建 SNS 订阅。

参考: http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sns-topic.html

http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sns-subscription.html

【讨论】:

【参考方案2】:

@p.magalhaes - 理想情况下,您不应该删除堆栈并再次创建它,而应该更新 cloudformation 堆栈。如果你更新你的堆栈,它不会删除 SNS 主题,因为它不会有任何变化。但是,如果您有删除和创建堆栈的特定需求,您可以使用嵌套堆栈为所有组件创建单独的堆栈(参考 - https://aws.amazon.com/blogs/devops/use-nested-stacks-to-create-reusable-templates-and-support-role-specialization/)

【讨论】:

【参考方案3】:

如果您需要动态链接到您的 SNS 主题的 ARN,您应该在您的 Lambda 资源中创建一个环境变量并引用您的主题的 ARN,如下所示:

AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Resources: MyTopic: Type: AWS::SNS::Topic MyLambdaFunction: Type: AWS::Lambda::Function Properties: Handler: index.handler Runtime: nodejs8.10 Code: ./path/to/index.js Role: [Role ARN here] MemorySize: 128 Timeout: 3 Environment: Variables: SNS_TOPIC: !Ref MyTopic

如果多个堆栈需要访问您的 SNS 主题,我建议为您的 SNS 主题创建一个单独的堆栈,然后将主题 ARN 作为参数放入其他模板中,并类似地引用该参数,如下所示:

AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Parameters: MyTopicArn: Type: String Resources: MyLambdaFunction: Type: AWS::Lambda::Function Properties: Handler: index.handler Runtime: nodejs8.10 Code: ./path/to/index.js Role: [Role ARN here] MemorySize: 128 Timeout: 3 Environment: Variables: SNS_TOPIC: !Ref MyTopicArn

这样,如果您必须替换您的 SNS 主题,您可以在下次部署时更新其他堆栈的参数。

【讨论】:

以上是关于SNS + CloudFormation的主要内容,如果未能解决你的问题,请参考以下文章

Serverless 订阅其他区域的 SNS

SNS + CloudFormation

SNS网站成功原因剖析_完结

Terraform:通知 SNS 的 CloudWatch 事件

SQS 和 SNS 对比分析

SNS/P2P:百科