1

我有 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
4

1 回答 1

0

根据您的评论,我猜测您的 2 个docker-compose文件的网络设置不正确。

为简单起见,我将合并elasticmq上面的服务并重docker-compose试(如果您发布第二个docker-compose和确切的aws命令来创建订阅,有人可以在本地尝试)。

如果您真的想保留 2 个单独docker-compose的文件,那么如果上述方法有效,那么至少您可以指出您的问题。恐怕我对设置不太熟悉,但这个答案可能会有所帮助。

编辑:

感谢您提供更多详细信息。我有一个docker-compose适合我的简化版本。首先,根据这个,您需要创建一个配置文件来设置elasticmq实例的主机名,因为它不会获取container_namefrom 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消息是否被消耗,但我把它留给你。

于 2019-03-05T18:09:32.013 回答