Elasticsearch npm:传递AWS凭证

时间:2016-12-14 17:19:50

标签: javascript node.js amazon-web-services authentication elasticsearch

所以我正在尝试使用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');
    }
});

任何问题或评论将不胜感激。

谢谢!

2 个答案:

答案 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');
  }
});