node.js - 使用无服务器框架时从 AWS Lambda 函数连接 AWS ElasticSearch 实例时出错
问题描述
我正在使用无服务器框架来实现无服务器项目。我在 serverless.yml 文件中添加了一些配置来为 aws elasticsearch 服务创建实例,该服务已成功创建。然后我在我的处理程序中创建了一个弹性搜索客户端并对其进行 ping 测试。因此,当我在本地系统上从无服务器离线 ping 弹性搜索客户端时,它工作正常并得到“真实”响应,但是当我在 aws lambda 上部署相同的代码时,它在 30 秒前没有响应后超时。
已经给出了所有可能需要但没有运气的政策。
无服务器.yml:-
ElasticSearchInstance:
Type: AWS::Elasticsearch::Domain
Properties:
EBSOptions:
EBSEnabled: true
VolumeType: gp2
VolumeSize: 10
ElasticsearchClusterConfig:
InstanceType: t2.small.elasticsearch
InstanceCount: 1
DedicatedMasterEnabled: false
ZoneAwarenessEnabled: false
ElasticsearchVersion: 7.1
Handler.js:-
var {Client} = require('elasticsearch');
var client = new Client({
host: 'Aws elasticsearch endpoint',
log: 'trace'
});
module.exports.elasticSearchPing = async () => {
try {
console.log('Inside elasticSearchPing function!!!!');
const res = await client.ping({requestTimeout: 900000});
console.log('Res: ', res);
return {
statusCode: 200,
body: JSON.stringify({ message: 'Connection successful with elasticSearch.' })
}
} catch (err) {
console.log('err: ', err);
return {
statusCode: err.statusCode || 500,
headers: { 'Content-Type': 'text/plain' },
body: 'Error connecting elasticsearch.'
}
}
}
解决方案
这样,aws elasticsearch 就无法知道您是谁。在将请求发送到 aws elasticsearch 之前,您需要对其进行签名。您可以使用一个名为的包http-aws-es
,它基本上从您的 ec2/lambda 读取 aws 凭证并为您签署请求。您的代码将如下所示
const {Client} = require("elasticsearch");
const esConnectionClass = require("http-aws-es");
const client = new Client({
"host": "Aws elasticsearch endpoint",
"log": "trace",
"connectionClass": esConnectionClass
});
module.exports.elasticSearchPing = async () => {
try {
console.log("Inside elasticSearchPing function!!!!");
const res = await client.ping({"requestTimeout": 900000});
console.log("Res: ", res);
return {
"statusCode": 200,
"body": JSON.stringify({"message": "Connection successful with elasticSearch."})
};
} catch (err) {
console.log("err: ", err);
return {
"statusCode": err.statusCode || 500,
"headers": {"Content-Type": "text/plain"},
"body": "Error connecting elasticsearch."
};
}
};
推荐阅读
- r - 在 R 下无法绘制图表
- vue.js - 如何在 vuejs 中传递对象数组?
- python - 无法在网页上选择下拉选择器按钮,我认为它会启动弹出窗口?
- laravel - 为具有子类别和分页的类别选择帖子
- c# - 使用 C# 执行 Powershell 脚本时,术语“ConvertTo”未被识别为 cmdlet 的名称
- angularjs - jQuery Datatable ng-click 在表初始化时不起作用
- amazon-web-services - 如何确定哪个是正确的认知错误
- javascript - 将类添加到 innerHTML 属性
- django - Django Rest Framework:在子模型上添加超链接相关字段
- installation - ubuntu 20.04 上的 Emacs 27.1 找不到任何字体