我正在使用无服务器框架来实现无服务器项目。我在serverless.yml文件中添加了一些配置,以创建成功创建的aws elasticsearch服务的实例。然后,我在处理程序中创建了一个Elasticsearch客户端,并对其进行ping操作以进行测试。 因此,当我从本地系统上的无服务器脱机ping通弹性搜索客户端时,它工作正常并得到了“真实”响应,但是当我在aws lambda上部署相同的代码时,直到30秒钟没有响应后,它才超时。
已提供了所有必需的政策,但没有成功。
Serverless.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.'
}
}
}
答案 0 :(得分:0)
这样,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."
};
}
};