Невозможно создать подписку SQS на тему SNS через Cloudformation в LocalStack
С помощью localstack
Я пытаюсь создать шаблон, который делает следующее:
- Создать тему SNS
- Создать очередь SQS
- Создайте подписку, которая подписывает очередь 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
который не поддерживается (см. здесь). Довольно раздражает...