Я знаю, что этот же вопрос был в основном задан и отвечал, однако попытка реализовать ответ не заставила его работать. Вот исходный вопрос: AWS.HttpClient handleRequest не работает в AWS lambda
Я попытался применить async / await к нескольким различным частям запроса, но ни один из них не работал, как указано в одном из комментариев в указанной ссылке.
Ситуация заключается в том, что у меня есть лямбда-функция, которая прослушивает события в корзинах S3, когда событие происходит, предполагается, что документы в службе elasticsearch индексируются. Проблема возникает, когда запрос PUT отправляется es. Я выполнил тестовое событие с ведром S3, и оно РАБОТАЕТ, но по какой-то причине оно зависает / не переходит в функцию handleRequest, когда я запускаю фактическое событие в моем ведре S3. Вот мой код:
Index.js
const AWS = require('aws-sdk');
const s3 = new AWS.S3()
const elastic_client = require('elastic.js');
exports.handler = async (event, context) => {
const Bucket = event.Records[0].s3.bucket.name;
const Key = event.Records[0].s3.object.key;
const data = await s3.getObject({ Bucket, Key }).promise();
for (const quote_doc of data.Body) {
elastic_client.indexQuote(quote_doc);
}
}
elastic.js
var AWS = require('aws-sdk');
require('dotenv').config();
var region = process.env.AWS_REGION;
var domain = process.env.AWS_ELASTIC_DOMAIN;
function indexQuote(quote) {
var endpoint = new AWS.Endpoint(domain);
var request = new AWS.HttpRequest(endpoint, region);
var index = 'quotes';
var type = '_doc';
var id = quote.QuoteId;
request.method = 'PUT';
request.path += index + '/' + type + '/' + id;
request.body = JSON.stringify(quote);
request.headers['host'] = domain;
request.headers['Content-Type'] = 'application/json';
request.headers['Content-Length'] = Buffer.byteLength(request.body);
var credentials = new AWS.EnvironmentCredentials('AWS');
credentials.accessKeyId = process.env.AWS_ACCESS_KEY_ID;
credentials.secretAccessKey = process.env.AWS_SECRET_ACCESS_KEY;
var signer = new AWS.Signers.V4(request, 'es');
signer.addAuthorization(credentials, new Date());
var client = new AWS.HttpClient();
client.handleRequest(request, null, function(response) { // Here is where it gets hung up
console.info(response.statusCode + ' ' + response.statusMessage); // Never outputs this
var responseBody = '';
response.on('data', function (chunk) {
responseBody += chunk;
});
response.on('end', function (chunk) {
console.info('Response body: ' + responseBody);
});
}, function(error) {
console.info('Error: ' + error);
});
}
Меня сбивает с толку то, что он отлично работает, когда я провожу тестовое событие, и он отлично работает, когда я индексирую его локально на моем собственном компьютере, но тогда просто не входит в handleRequest. Любая помощь / направление приветствуются, спасибо.
Редактировать:
package.json
{
"dependencies": {
"aws-sdk": "*",
"aws-xray-sdk": "^3.2.0",
"dotenv": "^8.2.0"
}
}
@PankajYadav Я добавил их внизу
У меня тоже есть эта проблема. Согласно это, документации об AWS.HttpClient не так много, поэтому я бы рекомендовал вместо этого попробовать эта библиотека





Попробуйте обернуть функцию handleRequest внутри обещания. Ваша функция indexQuote () будет выглядеть почти так же, но в конце она вернет обещание
function indexQuote(quote) {
...
return new Promise((resolve, reject) => {
client.handleRequest(request, null,
response => {
const { statusCode, statusMessage, headers } = response;
let body = '';
response.on('data', chunk => {
body += chunk;
});
response.on('end', () => {
const data = {
statusCode,
statusMessage,
headers
};
if (body) {
data.body = body;
}
resolve(data);
});
},
err => {
reject(err);
});
});
А потом можно дождаться и посмотреть результат:
const result = await indexQuote(quote);
console.info("Index result: " + result);
Хотя я думаю, что важно знать, что для этой библиотеки больше нет поддержки (хотя она буквально используется в качестве примера на веб-странице AWS), как упоминалось в вашем комментарии выше, этот обходной путь с некоторыми незначительными корректировками исправил это для меня, Благодарность!
Какой AWS-SDK вы используете? вы можете поделиться своими зависимостями из package.json?