为什么Node.js AWS-开发工具包在创建本地队列时返回错误的 SQS 队列 URL



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

当我尝试使用以下代码在 EMQ 中创建队列时,它会返回本地主机的队列 URL,而不是托管 docker 容器的虚拟机的 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-compos文件,因为下划线很常见。如果收到有关无效终结点的错误消息,请尝试使用连字符而不是下划线重命名撰写文件中的容器(即 http://sqs_local:9324 将失败,http://sqs-local:9324 会很好)。

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

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

  • 使用我的自定义映像tddmonkey/elasticmq
  • 在创建容器时设置NODE_HOSTNODE_PORT环境变量。

最终,您的命令行是:

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

相关内容

  • 没有找到相关文章

最新更新