【问题标题】:Re-using an existing SNS Topic in a Cloudformation template在 Cloudformation 模板中重新使用现有的 SNS 主题
【发布时间】:2020-09-11 19:23:18
【问题描述】:

我有一个 SAM cloudformation 模板:

Transform: AWS::Serverless-2016-10-31
Description: Create SNS with a sub

Parameters:
    NotificationEmail:
        Type: String
        Description: Email address to subscribe to SNS topic

Resources:
    NotificationTopic:
        Type: AWS::SNS::Topic
        DeletionPolicy: Retain
        Properties:
            TopicName: sam-test-sns
            Subscription:
                - Endpoint: !Ref NotificationEmail
                  Protocol: email

Outputs:
    SNSTopic:
        Value: !Ref NotificationTopic

所以我想保留主题 sam-test-sns,因为已经有几个订阅者,并且我不希望订阅者在我拆除服务并带来备份。

使用 Retain 拆除服务可以保持话题围绕,所以这很好。但是当我尝试deploy 模板时,它会失败,因为它已经存在。

那么,使用现有 SNS 主题的正确方法是什么?

【问题讨论】:

  • 你如何尝试重用它?相同的堆栈,不同的堆栈?
  • 你已经完成了一半,保留你输入的retain参数,但同时也改变SNS名称,这样它就可以创建一个新的资源,同时离开现有的
  • 在同一个堆栈中重新使用它。我不想更改 SNS 名称并创建新资源。我想使用现有的。

标签: amazon-web-services amazon-cloudformation amazon-sns


【解决方案1】:

在移除堆栈后将“Ec2NotificationTopic”资源保留在模板中但保留主题,将指示 CloudFormation 在(重新)创建堆栈时也创建主题,这将始终失败。

由于您只是引用现有主题,因此您应该从模板中删除资源并将对它的引用替换为 ARN/名称。

【讨论】:

  • 所以我不想手动更改 Cloudformation 模板。
  • 完全没有,或者只是在每次部署之前都没有?如果一次性更改没问题,您可能还可以使用条件来创建新资源或引用现有资源,请参阅此示例:docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/…
【解决方案2】:

输出完成后,您将导出变量。我将假设您希望将此资源放在另一个堆栈中。

首先您需要导出值,例如

Outputs:
    SNSTopic:
        Value: !Ref NotificationTopic
    Export:
        Name: Fn::Sub: "${AWS::StackName}-SNSTopic"

将参数添加到您的新堆栈SNSStackName,您将在其中传入 SNS 堆栈名称(在当前区域内)。

然后从你的新堆栈中引用你需要像下面这样调用输出值:

Fn::ImportValue:
     Fn::Sub: "${SNSStackName}-SNSTopic"

【讨论】:

  • 我不希望它在另一个堆栈中。但也许要获得我想要的行为,需要将其分离到另一个堆栈中......
猜你喜欢
  • 2018-09-06
  • 2021-07-20
  • 2018-11-01
  • 1970-01-01
  • 2017-12-14
  • 2018-03-01
  • 2021-05-14
  • 2018-06-03
  • 1970-01-01
相关资源
最近更新 更多