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

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

当我尝试使用下面的代码在EMQ中创build一个队列时,它会在localhost返回一个队列URL,而不是托pipedocker容器的虚拟机的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 。 如果我用实际的IP地址replaceURL中的“localhost”,我可以成功地访问这个URL的队列,表明它确实被创build了,但这是一个非常讨厌的黑客行为。 在上面的代码中需要更改什么来纠正这个问题?

您正面临的问题是ElasticMq正在公开所运行的容器的主机和端口。这是我之前遇到的一个问题,通过创build一个定制的Docker容器来修复它,让您以编程方式设置主机和端口。

我已经写了一篇关于如何解决这个问题的博客文章 ,但实质上你需要做的是:

  • 使用我的自定义图像tddmonkey/elasticmq
  • 创build容器时设置NODE_HOSTNODE_PORT环境variables。

最终你的命令行是这样的:

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