Возможно ли создать SNS-подписку с CloudFormation без создания темы?

Возможно ли создать ресурс "Subscription" в шаблоне JSON CloudSormation AWS без создания нового AWS::SNS::Topic?

В моем случае тема создается за пределами CloudFormation script, и я хотел бы создать некоторые подписи к ней, используя ресурсы, созданные в script.

т.е.

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

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

EtlNotificationTopicARN передается в script и представляет собой SNN-тему ARN.

Ответ 1

Как вы уже обнаружили, AWS CloudFormation не предоставляет ожидаемый ресурс AWS::SNS::Subscription (пока), и я не знаю об этом возможно, любыми другими способами, к сожалению - угадайте, что оба они управляются внутри шаблона или извне, но ваш случай использования звучит, и я не вижу фундаментальной причины, почему это не должно быть доступно (возможно, они добавят это в какой-то момент, AWS обычно расширяет свои API со временем, чтобы устранить такие несоответствия/пропуски).

Ответ 2

Теперь можно сделать это непосредственно в native CloudFormation по состоянию на ноябрь 2016 года:

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

Образцы из приведенной выше документации.

YAML:

MySubscription:
  Type: AWS::SNS::Subscription
  Properties:
    Endpoint: [email protected]
    Protocol: email
    TopicArn: !Ref 'MySNSTopic'

JSON:

"MySubscription" : {
  "Type" : "AWS::SNS::Subscription",
  "Properties" : {
    "Endpoint" : "[email protected]",
    "Protocol" : "email",
    "TopicArn" : {"Ref" : "MySNSTopic"}
  }
}

Ответ 3

Теперь это возможно, так как CloudFormation поддерживает пользовательские типы ресурсов с функциями Lambda.

Я создал суть здесь с помощью шаблона CloudFormation: https://gist.github.com/martinssipenko/4d7b48a3d6a6751e7464.js