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的主要内容,如果未能解决你的问题,请参考以下文章