首页 文章

SNS CloudFormation

提问于
浏览
2

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

这个微服务做了一些工作并向SNS主题发布消息 . 其他微服务订阅了这个主题 .

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

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

  • 这会是一个好方法吗?

  • 如果没有,推荐的方式是什么?

3 回答

  • 0

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

    既然您正在使用的无服务器框架如何工作,您可以通过在模板中为SNS主题指定 TopicName 属性来保留SNS主题ARN('s only when one doesn' t指定 TopicName 是当CloudFormation出现并随机分配时name,否则使用用户指定的名称) .

    话虽这么说,你的情景对我来说似乎有点不自然 . 如果您尚未通过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

  • 0

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

  • 0

    如果您需要动态链接到您的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主题,则可以在下次部署时更新其他堆栈的参数 .

相关问题