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

时间:2016-02-29 20:18:10

标签: node.js amazon-web-services docker amazon-sqs elastic-mq

我正在使用ElasticMQ在我的本地开发机器上模拟AWS SQS。我在Docker容器中运行ElasticMQ,使用docker-osx-dev在Linux VM上托管Docker容器。这意味着我在VM的IP上访问本地ElasticMQ实例,而不是我的localhost 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。如果我用实际IP地址替换URL中的'localhost',我可以成功访问具有该URL的队列,表明它确实已创建,但这是一个非常讨厌的黑客。我需要在上面的代码中更改哪些内容才能解决此问题?

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

1 个答案:

答案 0 :(得分:1)

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

我已经写了blog post如何修复它,但实质上你需要做的是:

  • 使用我的自定义图片declare Steps @role(event) end rule "STEPS RULE" when $totalSteps : Number( doubleValue < 50 ) from accumulate( Steps( stepsCount : steps ) over window:time( 1h ) from entry-point "entrySteps", sum( stepsCount ) ) then System.out.println("STEPS RULE: get moving!"); end
  • 创建容器时设置tddmonkey/elasticmqNODE_HOST环境变量。

最终,您的命令行是:

NODE_PORT