【发布时间】:2019-09-02 07:19:32
【问题描述】:
我需要使用 lambda 函数调用“签署 GET HTTP 请求到 Amazon Elasticsearch Service”。
我已经尝试过http 包,它在http 请求中运行良好
http.get(`http://search-"my_ES_service_name"-xxxxxxxxxxx-6fa27gkk4v3dugykj46tzsipbu.xx-xxxx-x.es.amazonaws.com/${event['index']}/doc/_search/?q=${event['keyParam']}`,
function(res) {
var body = '';
res.on('data', function(d) {
body += d;
});
res.on('end', function() {
context.succeed(JSON.parse(body.replace(/\n|\r/g, ""))); //Remove and newline/linebreak chars
});
}).on('error', function(e) {
console.log("Error: " + e.message);
context.done(null, 'FAILURE');
});
var AWS = require('aws-sdk');
exports.handler = function(event, context) {
var region = 'xx-xxxx-x';
var domain = 'http://search-"my_ES_service_name"-xxxxxxxxxxx-6fa27gkk4v3dugykj46tzsipbu.xx-xxxx-x.es.amazonaws.com';
var index = event['index'];
var type = `_doc/_search`;
var endpoint = new AWS.Endpoint(domain);
var request = new AWS.HttpRequest(endpoint, region);
request.method = 'GET';
request.path += index + '/' + type+'?q=_doc_key_here:_doc_key_value';
request.headers['host'] = domain;
> e.g. URL genrate like: http://search-"my_ES_service_name"-xxxxxxxxxxx-6fa27gkk4v3dugykj46tzsipbu.xx-xxxx-x.es.amazonaws.com/node-test/doc/_search/?q=user_name:johndoe
var credentials = new AWS.EnvironmentCredentials('AWS');
var signer = new AWS.Signers.V4(request, 'es');
signer.addAuthorization(credentials, new Date());
var client = new AWS.HttpClient();
client.handleRequest(request, null, function(response) {
console.log("response: ",response.statusCode);
var responseBody = '';
response.on('data', function (chunk) {
responseBody += chunk;
});
response.on('end', function (chunk) {
console.log('Response body: ' + responseBody);
context.succeed(responseBody)
});
}, function(error) {
console.log('Error: ' + error);
context.done(error);
});
}
当我尝试使用上述函数调用“Signing GET HTTP Requests”时,它会抛出以下错误:
响应:400 错误请求
【问题讨论】:
-
request.path += index + '/' + type+'?q=_doc_key_here:_doc_key_value';是正确的,看起来像是从文档中复制和粘贴的。但我猜如果你实际上没有传递一个正确的查询,你最终会得到一个错误的请求。
-
嘿@JamesKn,谢谢你的回复我已经通过了正确的形式,比如
myIndex/_search/?q=user_name:johndoe -
但是它总是抛出一个bad Request,并且这个相同的URL在
http请求中工作正常 -
你对 lambda 角色有什么权限?它是否有权访问 Elasticsearch 你给它一些愚蠢的东西,比如 { "Version": "2012-10-17", "Statement": [ { "Action": [ "es:*" ], "Effect": "允许", "资源": "*" } ] }
-
假设代码已排序,那么您基本上在角色/安全组中具有权限。
标签: amazon-web-services elasticsearch aws-lambda aws-sdk-nodejs aws-elasticsearch