Как указать "Необработанную доставку сообщений" для подписки SNS с помощью AWS CloudFormation?

У меня есть шаблон 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"
                }]
            }
        }

Мне нужно указать атрибут подписки "Raw Message Delivery". Как я могу сделать это в AWS CloudFormation?

2 ответа

Теперь AWS CloudFormation поддерживает его с помощью AWS:: SNS:: Subscription. Поэтому вместо добавления подписки в качестве свойства темы добавьте ресурс подписки, связанный выше.

Однако следует предостеречь о том, что если вы уже создали тему с этой подпиской и пытаетесь добавить атрибут, она потерпит неудачу с ошибкой недопустимого параметра. Причина в том, что он рассматривает автономную подписку, добавленную в шаблон, как новый ресурс и пытается ее создать. Я не нашел хорошего способа обойти это, кроме удаления этой подписки вручную, что не является хорошей практикой в ​​производственной среде.

Мое решение вокруг этого состоит в том, чтобы разделить это на 2 шага. Сначала удалите подписку о свойствах из темы и добавьте ресурс подписки. Затем добавьте новые атрибуты в ресурс подписки.

Первый:

{
    "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"
    }
}

На момент написания статьи AWS CloudFormation изначально не поддерживала это. В качестве альтернативы, вы можете создать собственный ресурс на основе лямбды, чтобы обойти это ограничение и установить этот атрибут, используя set-subscription-attributes вместо. Вот некоторые полезные ресурсы для достижения этой цели:

Другие вопросы по тегам