Elasticsearch npm:传递AWS凭证

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Elasticsearch npm:传递AWS凭证相关的知识,希望对你有一定的参考价值。

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

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

谢谢!

答案

想出这个。为了供将来参考,elasticsearch JS没有签署AWS的方法。它只支持SSL signed and basic authentication。因此你可以使用名为this NPMhttp-aws-es。它使用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

另一答案

这是适合我的代码。

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

以上是关于Elasticsearch npm:传递AWS凭证的主要内容,如果未能解决你的问题,请参考以下文章

Terraform:传递 AWS 系统管理器参数存储变量时,Terraform AWS 提供商凭证无效

aws 创建基于vpc的elasticsearch service

使用谷歌传输服务将文件从 AWS 传输到 GCP 时出现凭证错误

如何在 AWS CLI 中覆盖环境变量并使用 AWS 凭证文件?

如何:Zeppelin + boto3 + AWS 凭证

将AWS Kinesis Firehose回填到Elasticsearch Service失败的记录