为什么Node.js AWS-SDK在创建本地队列时返回错误的SQS队列URL

为什么Node.js AWS-SDK在创建本地队列时返回错误的SQS队列URL,node.js,amazon-web-services,docker,amazon-sqs,elastic-mq,Node.js,Amazon Web Services,Docker,Amazon Sqs,Elastic Mq,我正在本地开发机器上使用ElasticMQ模拟AWS SQS。我在Docker容器中运行ElasticMQ,使用Docker osx dev在Linux虚拟机上托管Docker容器。这意味着我在VM的IP上访问本地ElasticMQ实例,而不是本地主机IP 当我尝试使用下面的代码在EMQ中创建一个队列时,它在localhost处返回一个队列URL,而不是托管docker容器的VM的IP var AWS = require('aws-sdk'); var config = { endpoint

我正在本地开发机器上使用ElasticMQ模拟AWS SQS。我在Docker容器中运行ElasticMQ,使用Docker osx dev在Linux虚拟机上托管Docker容器。这意味着我在VM的IP上访问本地ElasticMQ实例,而不是本地主机IP

当我尝试使用下面的代码在EMQ中创建一个队列时,它在localhost处返回一个队列URL,而不是托管docker容器的VM的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
。如果我将URL中的“localhost”替换为实际的IP地址,我可以使用该URL成功地访问队列,这表明它确实是创建的,但这是一个相当恶劣的黑客行为。要更正此问题,我需要在上面的代码中更改什么

更新:无效端点
在使用ElasticMQ模拟容器出现另一个问题后,我又回到了这个问题。这次它是docker compose文件的一部分,另一个容器通过它的docker主机名访问它。SQS不接受带有下划线的主机名。由于下划线很常见,这会影响大多数人的docker compose文件。如果收到关于无效终结点的错误消息,请尝试在compose文件中使用连字符而不是下划线重命名容器(即将失败,一切正常)。

您面临的问题是ElasticMq正在公开其运行的容器的主机和端口。这是我以前遇到过的一个问题,通过创建一个自定义Docker容器来修复它,该容器允许您以编程方式设置主机和端口

我已经写了一篇关于如何修复它的文章,但本质上你需要做的是:

  • 使用我的自定义图像
    tddmonkey/elasticmq
  • 创建容器时,设置
    NODE\u HOST
    NODE\u PORT
    环境变量
最终,这方面的命令行是:


$docker run-e NODE\u HOST=`docker machine ip default`-e NODE\u PORT=8000-p 8000:9324 tddmonkey/elasticmq

非常感谢您的快速回答!现在看来效果很好。关于这个问题;你知道有没有一种简单的方法可以将虚拟机的所有端口转发到本地主机,以避免在设置端点等时查找虚拟机的IP地址?我猜你说的是能够使用
localhost
而不是虚拟机IP地址?如果是这样的话,那么它并不像端口转发VM端口那么简单,您还需要localhost转发这些端口上的所有通信。老实说,我怀疑这样做是否值得,因为您的生产代码应该是可配置的,可以接受不同的目标IPsCool,我通过环境变量/配置文件设置端点等,所以很容易根据需要进行更改。只是想知道有没有“银弹”,谢谢。今天真的需要这个。