Не входить в AWS HttpClient.handleRequest для elasticsearch в lambda, Nodejs

Я знаю, что этот же вопрос был в основном задан и отвечал, однако попытка реализовать ответ не заставила его работать. Вот исходный вопрос: 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"
    }
}

Какой AWS-SDK вы используете? вы можете поделиться своими зависимостями из package.json?

Pankaj Yadav 07.04.2021 13:10

@PankajYadav Я добавил их внизу

wawo 07.04.2021 18:30

У меня тоже есть эта проблема. Согласно это, документации об AWS.HttpClient не так много, поэтому я бы рекомендовал вместо этого попробовать эта библиотека

sivr 08.04.2021 16:39
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
34
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробуйте обернуть функцию 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), как упоминалось в вашем комментарии выше, этот обходной путь с некоторыми незначительными корректировками исправил это для меня, Благодарность!

wawo 09.04.2021 00:25

Другие вопросы по теме