Как указать "Необработанную доставку сообщений" для подписки 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
вместо. Вот некоторые полезные ресурсы для достижения этой цели: