所以我正在尝试使用Elasticsearch npm客户端,但我遇到了身份验证问题。我目前正在使用基于IAM用户身份的身份验证。出于显而易见的原因,我不想转向开放安全性,我也宁愿使用IAM用户的身份而不是基于IP的身份验证。
IAM为用户提供用户名和密码,用户名和密码在请求时用作凭据。我不确定如何传递它们,我的Elasticsearch服务器会保持超时。这是我到目前为止所尝试的。 documentation表示将其作为客户端配置对象中的auth
密钥传递。我可以确认用户名和密码是正确的,并且端点是AWS提供的端点。
aws.js
const elasticsearch = require('elasticsearch');
const envs = require('dotenv').config();
module.exports = function () {
return new elasticsearch.Client({
host: [{
apiVersion: '2.3',
protocol: 'https',
auth: `${envs.username}:${envs.password}`,
host:`${envs.endpoint}`
}]
})
}
index.js
const client = require('./aws')();
client.ping({
// ping usually has a 3000ms timeout
requestTimeout: Infinity
}, function(error) {
console.log('pass')
if (error) {
console.trace(error);
} else {
console.log('All is well');
}
});
任何问题或评论将不胜感激。
谢谢!
答案 0 :(得分:1)
想出来了。为了供将来参考,elasticsearch JS没有签署AWS的方法。它只支持SSL signed and basic authentication。因此,您可以使用名为http-aws-es
的{{3}}。它使用AWS SDK使用您的IAM访问密钥ID和秘密访问密钥签署Elasticsearch。以下是我最终为我的Elasticsearch客户端
const elasticsearch = require('elasticsearch');
const AWSConnector = require('http-aws-es'),
const envs = require('dotenv').config();
module.exports = function () {
return new elasticsearch.Client({
connectionClass: AWSConnector,
apiVersion: '2.3',
port: 443,
protocol: 'https',
host:`${envs.endpoint}`,
amazonES: {
region: 'us-east-1',
accessKey: envs.accessKeyId,
secretKey: envs.secretAccessKey
}
})
}
另外需要注意的是,我必须将端口设置为443
。如果协议是http,它将是端口80
。出于显而易见的原因,Elasticsearch JS库默认为端口9200
。如果您没有指定端口,则无论您添加哪个主机,它都将始终默认为9200
。
答案 1 :(得分:0)
这是适合我的代码。
const elasticsearch = require('elasticsearch');
var AWS = require('aws-sdk');
var options = {
host: 'host',
port:443,
protocol:'https',
connectionClass: require('http-aws-es'),
awsConfig:new AWS.Config({
credentials: new AWS.Credentials('aws_access_key', 'aws_secret_key'),
region: 'us-east-1'
})
};
var client = require('elasticsearch').Client(options);
client.ping({
// ping usually has a 3000ms timeout
requestTimeout: 3000
}, function (error) {
if (error) {
console.trace('elasticsearch cluster is down!');
} else {
console.log('All is well');
}
});