如何使用 AWS CloudFormation 为 SNS 订阅指定“原始消息传递”?
Posted
技术标签:
【中文标题】如何使用 AWS CloudFormation 为 SNS 订阅指定“原始消息传递”?【英文标题】:Howto specify 'Raw Message Delivery' for an SNS subscription using AWS CloudFormation? 【发布时间】:2016-02-13 23:44:36 【问题描述】:我有一个创建 SNS 主题和订阅的 AWS CloudFormation 模板:
"AcceptedTopic":
"Type": "AWS::SNS::Topic",
"Properties":
"DisplayName": "Fn::Join": ["", ["Accepted-", "Ref": "Env"]],
"TopicName": "Fn::Join": ["", ["Accepted-", "Ref": "Env"]],
"Subscription": [
"Endpoint": "Fn::GetAtt" : [ "SomeQueue" , "Arn" ],
"Protocol": "sqs"
]
我需要指定“原始消息传递”订阅属性。我如何在 AWS CloudFormation 中做到这一点?
【问题讨论】:
在亚马逊论坛发现有人抱怨同样的问题:forums.aws.amazon.com/thread.jspa?threadID=132373 【参考方案1】:现在 AWS CloudFormation 通过AWS::SNS::Subscription 支持它。因此,不要将订阅添加为主题的属性,而是添加上面链接的订阅资源。
但需要注意的是,如果您已经使用该订阅创建了一个主题并且现在正在尝试添加该属性,那么它会因无效参数错误而惨遭失败。 原因是它正在考虑将模板中添加的独立订阅作为新资源并尝试创建它。除了手动删除该订阅之外,我还没有找到解决此问题的好方法,这在生产环境中不是很好的做法。
我的解决方案是将其分为两个步骤。首先,从主题中移除属性订阅并添加订阅资源。然后,为订阅资源添加新属性。
第一:
"AcceptedTopic":
"Type": "AWS::SNS::Topic",
"Properties":
"DisplayName":
"Fn::Join": ["", ["Accepted-", "Ref": "Env"]]
,
"TopicName":
"Fn::Join": ["", ["Accepted-", "Ref": "Env"]]
"AcceptedTopicSubscription":
"TopicArn": "Ref": "AcceptedTopic" ,
"Endpoint":
"Fn::GetAtt": ["SomeQueue", "Arn"]
,
"Protocol": "Sqs"
然后:
...
"AcceptedTopicSubscription":
"TopicArn": "Ref": "AcceptedTopic" ,
"Endpoint":
"Fn::GetAtt": ["SomeQueue", "Arn"]
,
"Protocol": "Sqs",
"RawMessageDelivery": "true"
【讨论】:
【参考方案2】:在撰写本文时,AWS CloudFormation 本身并不支持该功能。作为替代方案,您可以创建一个 Lambda 支持的自定义资源来绕过此限制,并改为使用 set-subscription-attributes
设置该属性。以下是一些有助于实现这一目标的有用资源:
【讨论】:
以上是关于如何使用 AWS CloudFormation 为 SNS 订阅指定“原始消息传递”?的主要内容,如果未能解决你的问题,请参考以下文章
如何从 aws cloudformation 模板为特定资源类型创建堆栈
如何使用 CloudFormation 创建具有集成 RDS 的 AWS Elasticbeanstalk 应用程序?
如何使用 AWS CloudFormation 创建 Amazon VPC?
如何将 AWS CloudWatch 仪表板转换为 CloudFormation 模板