Невозможно создать подписку SQS на тему SNS через Cloudformation в LocalStack

С помощью localstack Я пытаюсь создать шаблон, который делает следующее:

  1. Создать тему SNS
  2. Создать очередь SQS
  3. Создайте подписку, которая подписывает очередь SQS на тему SNS.

мой docker-compose файл выглядит так:

version: '3'

services:

  localstack:
    image: localstack/localstack
    container_name: localstack
    environment:
      - SERVICES=sns,sqs,cloudformation
      - DEBUG=1
      - PORT_WEB_UI=${PORT_WEB_UI- }
      - HOSTNAME=localstack
      - AWS_DEFAULT_REGION=eu-west-2
      - AWS_ACCESS_KEY_ID=XX
      - AWS_SECRET_ACCESS_KEY=XX
    ports:
      - "4575:4575"
      - "4576:4576"
      - "4581:4581"
      - "8080:8080"
    volumes:
      - ./config/formation.yml:/usr/stuff/formation.yml
      - ./config/init.sh:/docker-entrypoint-initaws.d/init.sh

мой init.sh файл выглядит так:

#!/bin/bash
aws cloudformation create-stack --stack-name fincorestack --template-body file:///usr/stuff/formation.yml --endpoint-url=http://localstack:4581

И, наконец, мой файл Cloudformation выглядит так:

AWSTemplateFormatVersion: '2010-09-09'
Description: 'Test'
Resources:
  MySnsTopic:
    Type: AWS::SNS::Topic
    Properties:
      TopicName: MySnsTopic
  MySnsTopicSubscription:
    Type: AWS::SNS::Subscription
    Properties:
      Protocol: sqs
      TopicArn: !Ref MySnsTopic
      Endpoint: !GetAtt
        - MySqsQueue
        - QueueArn
  MySqsQueue:
    Type: AWS::SQS::Queue
    Properties:
      QueueName: MySqsQueue

Это приводит к очень расплывчатой внутренней ошибке 500. Так как это localstack и я знаю, что арны довольно статичны, я попытался заменить содержимое yml файл для подписок TopcArn а также Endpoint со следующим:

TopicArn: arn:aws:sns:eu-west-2:123456789012:MySnsTopic
Endpoint: arn:aws:sqs:elasticmq:000000000000:MySqsQueue

На этот раз я не получаю сообщение об ошибке, но подписка не создается. Из отладочного вывода localstack Я вижу это:

И подписка не создается. Эта функция не поддерживается в Cloudformation реализация localstack или я что-то не так делаю?

4 ответа

Использование докера с localstack в кли ...

запустите свой локальный стек

создать тему:

      AWS_ACCESS_KEY_ID=x AWS_SECRET_ACCESS_KEY=x aws --endpoint-url=http://dc-localstack:4566 --region us-east-1 sns create-topic --name jensTopic`

отклик :

      {
    "SubscriptionArn": "arn:aws:sns:us-east-1:000000000000:jensTopic:9bf7628e-ee36-49c1-8216-ed5cf5aea1ed"
}

создать очередь:

      AWS_ACCESS_KEY_ID=x AWS_SECRET_ACCESS_KEY=x aws --endpoint=http://dc-localstack:4566 --region us-east-1 sqs create-queue --queue-name jensQueue

получить атрибут arn очереди:

      AWS_ACCESS_KEY_ID=x AWS_SECRET_ACCESS_KEY=x aws --endpoint-url=http://dc-localstack:4566 --region us-east-1 sqs get-queue-attributes --queue-url http://localhost:4566/queue/jensQueue --attribute-names QueueArn

отклик:

      {
    "Attributes": {
        "QueueArn": "arn:aws:sqs:us-east-1:000000000000:jensQueue"
    }
}

подписаться в очередь на тему:

      AWS_ACCESS_KEY_ID=x AWS_SECRET_ACCESS_KEY=x aws --endpoint-url=http://dc-localstack:4566 --region us-east-1 sns subscribe --topic-arn "arn:aws:sns:us-east-1:000000000000:jensTopic" --protocol sqs --notification-endpoint "arn:aws:sqs:us-east-1:000000000000:jensQueue"

санитарная проверка:

      AWS_ACCESS_KEY_ID=x AWS_SECRET_ACCESS_KEY=x aws --endpoint-url=http://dc-localstack:4566 --region us-east-1 sns list-subscriptions

отклик:

      {
    "Subscriptions": [
        {
            "SubscriptionArn": "arn:aws:sns:us-east-1:000000000000:jensTopic:9bf7628e-ee36-49c1-8216-ed5cf5aea1ed",
            "Owner": "",
            "Protocol": "sqs",
            "Endpoint": "arn:aws:sqs:us-east-1:000000000000:jensQueue",
            "TopicArn": "arn:aws:sns:us-east-1:000000000000:jensTopic"
        }
    ]
}

Я думаю QueueArn не является атрибутом AWS::SQS::Queue, Это должно быть просто Arn,

Теперь это исправлено: https://github.com/localstack/localstack/issues/1191

Несмотря на то что TopcArn а также Endpoint все еще нужно жестко запрограммировать.

Найден обходной путь, поэтому постить на случай, если кому-то еще это понадобится У меня такое ощущение, что создание подписок как ресурса просто не поддерживается localstack поэтому вместо этого я создаю их при определении ресурса темы SNS. Изменение yml файл ниже сделал трюк:

AWSTemplateFormatVersion: '2010-09-09'
Description: 'Test'
Resources:
  MySqsQueue:
    Type: AWS::SQS::Queue
    Properties:
      QueueName: MySqsQueue

  MySqsQueue:
    Type: AWS::SNS::Topic
    Properties:
      TopicName: MySqsQueue
      Subscription:
        - Protocol: sqs
          Endpoint:
            "Fn::GetAtt": ["MySqsQueue", "Arn"]
          RawMessageDelivery: 'true'

РЕДАКТИРОВАТЬ:

К сожалению, создание подписок таким способом не позволяет устанавливать атрибуты. В моем случае мне нужно RawMessageDelivery=true который не поддерживается (см. здесь). Довольно раздражает...

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