Почему Node.js AWS-SDK возвращает неправильный URL-адрес очереди SQS при создании локальной очереди

Я использую ElasticMQ для имитации AWS SQS на моей локальной машине разработчика. Я запускаю ElasticMQ в контейнере Docker, используя docker-osx-dev для размещения контейнера Docker на виртуальной машине Linux. Это означает, что я обращаюсь к локальному экземпляру ElasticMQ по IP-адресу виртуальной машины, а не по локальному IP-адресу.

Когда я пытаюсь создать очередь в EMQ, используя приведенный ниже код, он возвращает URL-адрес очереди на локальном хосте, а не IP-адрес виртуальной машины, в которой находится контейнер докера.

var AWS = require('aws-sdk');
var config = {
  endpoint: new AWS.Endpoint('http://192.168.59.103:9324'),
  accessKeyId: 'na',
  secretAccessKey: 'na',
  region: 'us-west-2'
}
var sqs = new AWS.SQS(config);
var params = {
  QueueName: 'test_queue'
};
sqs.createQueue(params, function(err, data) {
  if (err) {
    console.log(err);
  } else {
    console.log(data.QueueUrl);
  }
});

В настоящее время этот код возвращает: http://localhost:9324/queue/test_queue, но он должен вернуться http://192.168.59.103:9324/queue/test_queue, Если я заменим "localhost" в URL-адресе фактическим IP-адресом, я смогу получить доступ к очереди с этим URL-адресом, что означает, что он действительно был создан, но это довольно неприятный хак. Что мне нужно изменить в приведенном выше коде, чтобы исправить эту проблему?

Обновление: недопустимая конечная точка. Я вернулся к этому после того, как возникла другая проблема с использованием контейнера моделирования ElasticMQ. На этот раз он был частью файла docker-compose, и другой контейнер обращался к нему по его имени хоста docker. SQS не будет принимать имена хостов с подчеркиванием в них. Это будет мешать большинству людей создавать файлы Docker, поскольку подчеркивания являются общими. Если вы получите сообщение об ошибке о недопустимых конечных точках, попробуйте переименовать ваш контейнер в файле компоновки с дефисом вместо подчеркивания (т http://sqs_local:9324/ потерпит неудачу, http://sqs-local:9324/ будет в порядке),

1 ответ

Решение

Проблема, с которой вы столкнулись, заключается в том, что ElasticMq отображает хост и порт контейнера, в котором он работает. Это проблема, с которой я столкнулся раньше, и исправил ее, создав собственный контейнер Docker, который позволяет программно устанавливать хост и порт.

Я написал сообщение в блоге о том, как это исправить, но по сути, вам нужно сделать следующее:

  • Используйте мое собственное изображение tddmonkey/elasticmq
  • Установить NODE_HOST а также NODE_PORT переменные окружения при создании контейнера.

В конечном итоге ваша командная строка для этого:

$ docker run -e NODE_HOST=`docker-machine ip default` -e NODE_PORT=8000 -p 8000:9324 tddmonkey/elasticmq

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