localstack - Localstack SNS:无法向 ElasticMq 发送消息
问题描述
我有 2 个应用程序:
1 个应用程序使用ElasticMq
队列来收听消息。第二个应用程序发布有关SNS
主题的消息。
我可以订阅该主题的ElasticMq
队列。SNS
但是,当我在主题上发布时,即使订阅成功local stack
,也无法将消息发送给。elasticmq
awslocal sns list-subscriptions-by-topic --topic-arn arn:aws:sns:us-east-1:123456789012:classification-details-topic
{
"Subscriptions": [
{
"SubscriptionArn": "arn:aws:sns:us-east-1:123456789012:classification-details-topic:ea470c5a-c352-472e-9ae0-a1386044b750",
"Owner": "",
"Protocol": "sqs",
"Endpoint": "http://elasticmq-service:9324/queue/test",
"TopicArn": "arn:aws:sns:us-east-1:123456789012:classification-details-topic"
}
]
}
以下是我收到的错误消息:
awslocal sns 发布 --topic-arn arn:aws:sns:us-east-1:123456789012:classification-details-topic --message "我的消息"
调用 Publish 操作时出错 (InvalidParameter):调用 SendMessage 操作时出错 (AWS.SimpleQueueService.NonExistentQueue):AWS.SimpleQueueService.NonExistentQueue; 请参阅 SQS 文档。
我elasticmq
在本地堆栈上订阅错了吗?
我正在使用 docker-compose 文件运行 localstack
version: '2.1'
services:
localstack:
image: localstack/localstack
ports:
- "4567-4584:4567-4584"
- "${PORT_WEB_UI-8001}:${PORT_WEB_UI-8080}"
environment:
- SERVICES=${SERVICES- }
- DEBUG=${DEBUG- }
- DATA_DIR=${DATA_DIR- }
- PORT_WEB_UI=${PORT_WEB_UI- }
- LAMBDA_EXECUTOR=${LAMBDA_EXECUTOR- }
- KINESIS_ERROR_PROBABILITY=${KINESIS_ERROR_PROBABILITY- }
- DOCKER_HOST=unix:///var/run/docker.sock
volumes:
- "${TMPDIR:-/tmp/localstack}:/tmp/localstack"
- "/var/run/docker.sock:/var/run/docker.sock"
networks:
default:
external:
name: my_network
我使用相同的 docker 网络“my_network”将 elasticmq 和其他服务作为不同 docker-compose 的一部分
以下是完整的 docker-compose。我尝试通过将条目组合到一个 docker-compose 文件中来复制它。
重现步骤
version: '3'
services:
elasticmq:
build: ./elasticmq
ports:
- '9324:9324'
networks:
- my_network
dns:
- 172.16.198.101
localstack:
image: localstack/localstack
ports:
- "4567-4584:4567-4584"
- "${PORT_WEB_UI-8001}:${PORT_WEB_UI-8080}"
environment:
- SERVICES=${SERVICES- }
- DEBUG=${DEBUG- }
- DATA_DIR=${DATA_DIR- }
- PORT_WEB_UI=${PORT_WEB_UI- }
- LAMBDA_EXECUTOR=${LAMBDA_EXECUTOR- }
- KINESIS_ERROR_PROBABILITY=${KINESIS_ERROR_PROBABILITY- }
- DOCKER_HOST=unix:///var/run/docker.sock
volumes:
- "${TMPDIR:-/tmp/localstack}:/tmp/localstack"
- "/var/run/docker.sock:/var/run/docker.sock"
links:
- elasticmq:elasticmq-service
networks:
- my_network
dns:
- 172.16.198.101
networks:
my_network:
driver: bridge
ipam:
config:
- subnet: 172.16.198.0/24
在此之后可以运行以下一组命令
awslocal sqs create-queue --queue-name test --endpoint http://elasticmq:9324/
awslocal sns create-topic --name test-topic
awslocal sns subscribe --topic-arn arn:aws:sns:us-east-1:123456789012:test-topic --protocol sqs --notification-endpoin http://elasticmq-service:9324/queue/test
解决方案
根据您的评论,我猜测您的 2 个docker-compose
文件的网络设置不正确。
为简单起见,我将合并elasticmq
上面的服务并重docker-compose
试(如果您发布第二个docker-compose
和确切的aws
命令来创建订阅,有人可以在本地尝试)。
如果您真的想保留 2 个单独docker-compose
的文件,那么如果上述方法有效,那么至少您可以指出您的问题。恐怕我对设置不太熟悉,但这个答案可能会有所帮助。
编辑:
感谢您提供更多详细信息。我有一个docker-compose
适合我的简化版本。首先,根据这个,您需要创建一个配置文件来设置elasticmq
实例的主机名,因为它不会获取container_name
from docker-compose
(类似于我在下面设置的HOSTNAME
环境变量,LocalStack
如您将看到的)。这个名为elasticmq.conf
(在名为 的文件夹中config
)的文件的内容是:
include classpath("application.conf")
node-address {
host = elasticmq
}
queues {
test-queue {}
}
有了这个,以下docker-compose
发布消息没有任何错误:
version: '3'
services:
elasticmq:
image: s12v/elasticmq
container_name: elasticmq
ports:
- '9324:9324'
volumes:
- ./config/elasticmq.conf:/etc/elasticmq/elasticmq.conf
localstack:
image: localstack/localstack
container_name: localstack
environment:
- SERVICES=sns
- DEBUG=1
- PORT_WEB_UI=${PORT_WEB_UI- }
- HOSTNAME=localstack
ports:
- "4575:4575"
- "8080:8080"
awscli:
image: garland/aws-cli-docker
container_name: awscli
depends_on:
- localstack
- elasticmq
environment:
- AWS_DEFAULT_REGION=eu-west-2
- AWS_ACCESS_KEY_ID=xxx
- AWS_SECRET_ACCESS_KEY=xxx
command:
- /bin/sh
- -c
- |
sleep 20
aws --endpoint-url=http://localstack:4575 sns create-topic --name test_topic
aws --endpoint-url=http://localstack:4575 sns subscribe --topic-arn arn:aws:sns:eu-west-2:123456789012:test_topic --protocol http --notification-endpoint http://elasticmq:9324/queue/test-queue
aws --endpoint-url=http://localstack:4575 sns publish --topic-arn arn:aws:sns:eu-west-2:123456789012:test_topic --message "My message"
和输出:
诚然,此时我没有检查elasticmq
消息是否被消耗,但我把它留给你。
推荐阅读
- javascript - Youtube API 密钥配额在使用有问题的密钥之前超过了
- python - Squish 测试:通过 Squish 获取活动窗口或顶部窗口
- python - python包安装不保存?
- python - 当 pip 卸载不起作用时,如何卸载库?
- php - 从地址创建超链接
- flutter - 反转图像颜色
- mysql - Combine one table with meta data in another table
- python - 用 Pandas 列中的句点替换空格
- docker - 有没有办法在谷歌云构建的 yaml 构建配置文件中的同一步骤中分离不同的参数?
- ios - Transporter 错误 IOS 应用程序图标 1024x1024 丢失