如何使用AWS CloudFormation为SNS订阅指定“原始消息传递”?

muz*_*off 6 amazon-web-services aws-cloudformation devops

我有一个AWS CloudFormation模板,该模板创建一个SNS主题和一个预订:

"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"
                }]
            }
        }
Run Code Online (Sandbox Code Playgroud)

我需要指定“原始邮件传递”订阅属性。如何在AWS CloudFormation中做到这一点?

tia*_*ack 5

现在,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"
    }
}
Run Code Online (Sandbox Code Playgroud)

然后:

{
    ...
    "AcceptedTopicSubscription": {
        "TopicArn": { "Ref": "AcceptedTopic" },
        "Endpoint": {
            "Fn::GetAtt": ["SomeQueue", "Arn"]
        },
        "Protocol": "Sqs",
        "RawMessageDelivery": "true"
    }
}
Run Code Online (Sandbox Code Playgroud)


Adi*_*tya 3

截至撰写本文时,AWS CloudFormation 本身并不支持该功能。作为替代方案,您可以创建 Lambda 支持的自定义资源来绕过此限制并使用该属性来设置该属性set-subscription-attributes。以下是一些有助于实现这一目标的有用资源: