问题 是否可以在不创建主题的情况下使用CloudFormation创建SNS订阅?


是否可以在AWS CloudFormation JSON模板中创建“订阅”资源,而无需创建新的 AWS::SNS::Topic

在我的例子中,主题是在CloudFormation脚本之外创建的,我想创建一些订阅,涉及在脚本中创建的资源。

I.E.

   "DbfExtractQueue": {
        "Type": "AWS::SQS::Queue"
    },

    "EtlSubscription": {
        "Type": "AWS::SNS::Subscription",
        "Properties": {
            "Endpoint": { "Fn::GetAtt": ["DbfExtractQueue", "Arn"] },
            "Protocol": "sqs",
            "TopicArn": { "Ref": "EtlNotificationTopicARN" }
        }
    },

EtlNotificationTopicARN被传递到脚本中并表示SNS主题ARN。


2714
2017-09-05 06:55


起源

这是观察者模式101:主体不应该对观察者有任何了解。 CloudFormation不支持它的事实让我翻白眼。 - giorgiosironi


答案:


正如你已经发现的那样 AWS CloudFormation 没有提供预期的 AWS::SNS::Subscription 资源(还)我不知道这可能通过任何其他方式,不幸的是 - 猜测的理由是,无论是在模板内管理还是在外部管理,但你的用例是合理的,我看不出根本原因这应该不可用(也许他们会在某些时候添加它,AWS通常会随着时间的推移扩展他们的API以解决这种不一致/缺失)。


0
2017-09-05 20:46



好的很酷,谢谢你的确认。我最终使用了一些ruby API调用来将队列连接到主题,但就像你说的那样,在某些时候看到它会很好。干杯! - stefanlz


现在可以在2016年11月直接在原生CloudFormation中执行此操作:

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

以上文档中的示例。

YAML:

MySubscription:
  Type: AWS::SNS::Subscription
  Properties:
    Endpoint: test@email.com
    Protocol: email
    TopicArn: !Ref 'MySNSTopic'

JSON:

"MySubscription" : {
  "Type" : "AWS::SNS::Subscription",
  "Properties" : {
    "Endpoint" : "test@email.com",
    "Protocol" : "email",
    "TopicArn" : {"Ref" : "MySNSTopic"}
  }
}

9
2017-11-22 22:45



如果你想在订阅上设置rawMessageDelivery你运气不好我想因为在创建订阅时没有办法指定它,并且资源没有返回它的arn以便能够在之后设置它。似乎唯一的方法是使用自定义lambda函数,如果你想使用rawMessageDelivery。如果不使用自定义lambda函数,您是否知道任何方法? - luk2302


由于CloudFormation支持具有Lambda函数的自定义资源类型,因此现在可以使用。

我在这里使用CloudFormation模板创建了一个要点: https://gist.github.com/martinssipenko/4d7b48a3d6a6751e7464.js


3
2017-11-06 14:18



虽然此链接可能会回答这个问题,但最好在此处包含答案的基本部分并提供参考链接。如果链接页面发生更改,则仅链接答案可能会变为无效。 - Mamoun Benghezal
我相信链接应该是 gist.github.com/martinssipenko/4d7b48a3d6a6751e7464 - giorgiosironi