为什么 Node.js AWS-SDK 在创建本地队列时返回错误的 SQS 队列 URL
Why is the Node.js AWS-SDK returning the wrong SQS queue URL when creating a local queue
我正在使用 ElasticMQ 在我的本地开发机器上模拟 AWS SQS。我在 Docker 容器中使用 运行 ElasticMQ,使用 docker-osx-dev 在 Linux VM 上托管 Docker 容器。这意味着我在 VM 的 IP 上访问本地 ElasticMQ 实例,而不是我的本地主机 IP。
当我尝试使用下面的代码在 EMQ 中创建队列时,它 return 是本地主机上的队列 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);
}
});
当前此代码 returns: http://localhost:9324/queue/test_queue
,但它应该 return http://192.168.59.103:9324/queue/test_queue
。如果我用实际 IP 地址替换 URL 中的 'localhost',我可以成功访问带有 URL 的队列,表明它确实已创建,但这是一个非常讨厌的 hack。我需要在上面的代码中更改什么才能解决此问题?
更新:端点无效
在使用 ElasticMQ 模拟容器出现另一个问题后,我 return 对此进行了编辑。这次它是 docker-compose 文件的一部分,另一个容器通过它的 docker 主机名访问它。 SQS 不接受带有下划线的主机名。这将混淆大多数人 docker-compose 文件,因为下划线很常见。如果您收到有关无效端点的错误消息,请尝试在撰写文件中使用连字符而不是下划线重命名您的容器(即 http://sqs_local:9324 will fail, http://sqs-local:9324 就可以)。
您遇到的问题是 ElasticMq 暴露了容器的主机和端口 运行。这是我以前遇到过的问题,并通过创建自定义 Docker 允许您以编程方式设置主机和端口的容器。
我已经写了一个 blog post 如何修复它,但本质上你需要做的是:
- 使用我的自定义图片
tddmonkey/elasticmq
- 在创建容器时设置
NODE_HOST
和 NODE_PORT
环境变量。
最终你的命令行是:
$ docker run -e NODE_HOST=`docker-machine ip default` -e NODE_PORT=8000 -p 8000:9324 tddmonkey/elasticmq
我正在使用 ElasticMQ 在我的本地开发机器上模拟 AWS SQS。我在 Docker 容器中使用 运行 ElasticMQ,使用 docker-osx-dev 在 Linux VM 上托管 Docker 容器。这意味着我在 VM 的 IP 上访问本地 ElasticMQ 实例,而不是我的本地主机 IP。
当我尝试使用下面的代码在 EMQ 中创建队列时,它 return 是本地主机上的队列 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);
}
});
当前此代码 returns: http://localhost:9324/queue/test_queue
,但它应该 return http://192.168.59.103:9324/queue/test_queue
。如果我用实际 IP 地址替换 URL 中的 'localhost',我可以成功访问带有 URL 的队列,表明它确实已创建,但这是一个非常讨厌的 hack。我需要在上面的代码中更改什么才能解决此问题?
更新:端点无效 在使用 ElasticMQ 模拟容器出现另一个问题后,我 return 对此进行了编辑。这次它是 docker-compose 文件的一部分,另一个容器通过它的 docker 主机名访问它。 SQS 不接受带有下划线的主机名。这将混淆大多数人 docker-compose 文件,因为下划线很常见。如果您收到有关无效端点的错误消息,请尝试在撰写文件中使用连字符而不是下划线重命名您的容器(即 http://sqs_local:9324 will fail, http://sqs-local:9324 就可以)。
您遇到的问题是 ElasticMq 暴露了容器的主机和端口 运行。这是我以前遇到过的问题,并通过创建自定义 Docker 允许您以编程方式设置主机和端口的容器。
我已经写了一个 blog post 如何修复它,但本质上你需要做的是:
- 使用我的自定义图片
tddmonkey/elasticmq
- 在创建容器时设置
NODE_HOST
和NODE_PORT
环境变量。
最终你的命令行是:
$ docker run -e NODE_HOST=`docker-machine ip default` -e NODE_PORT=8000 -p 8000:9324 tddmonkey/elasticmq