AWS lambda не передает результаты в dynamodb

#node.js #amazon-web-services #aws-lambda #amazon-dynamodb

Вопрос:

У меня есть лямбда, написанная в node.js где я хочу перенести данные в свою таблицу dynamodb. Моя конечная цель состоит в том, чтобы мой запрос api получил ответ, а затем передал результаты в разделе «Элементы» непосредственно в dynamodb, но в данный момент моя лямбда-функция только выполняет запрос, а функция createmessage игнорируется (в настоящее время тестируется со статическими данными). Я предполагаю, что мой код каким-то образом запутан, поэтому мне нужна помощь в том, как это работает правильно, пожалуйста, смотрите Ниже:

 // Loads in the AWS SDK
const AWS = require('aws-sdk');

// Creates the document client specifing the region 
// The tutorial's table is 'in eu-west-2'
const ddb = new AWS.DynamoDB.DocumentClient({region: 'eu-west-2'});

exports.handler = async (event, context, callback) => {
    // Captures the requestId from the context message
    const requestId = context.awsRequestId;

    // Handle promise fulfilled/rejected states
    await createMessage(requestId).then(() => {
        callback(null, {
            statusCode: 201,
            body: '',
            headers: {
                'Access-Control-Allow-Origin' : '*'
            }
        });
    }).catch((err) => {
        console.error(err)
    })
};

// Function createMessage
// Writes message to DynamoDb table Message 
function createMessage(requestId) {
    const params = {
        TableName: 'splunk-lambda',
        Item: {
            'id' : '101',
            'message' : 'Hello from lambda'
        }
    }
    return ddb.put(params).promise();
}

 var request = require('request');
    var options = {
    'method': 'POST',
    'url': 'myurl',
    'headers': {
        'x-api-key': 'my-api-key',
        'Content-Type': 'text/plain'
    },
    body: 'query my graphql query'

    };
    request(options, function (error, response) {
    if (error) throw new Error(error);
    console.log(response.body);
    });
 

мой ответ от лямбды:

 Test Event Name
test

Response
null

Function Logs
    {my graphql response}
    END RequestId: bdf23337-ca51-4f8b-868c-314f4d048055
 

Комментарии:

1. Вероятно, это как-то связано с вашим использованием async . Поскольку вы используете асинхронный обработчик, ваш лямбда-код завершается до того, как у остальной части кода появится возможность запуска.

2. Марцин, вероятно, прав — я не уверен на 100% в том, что node.js, но SDK для Python блокирует асинхронность — необходимо использовать определенную асинхронную версию SDK, чтобы использовать ее в асинхронных функциях. Я бы рискнул предположить, что node.js версия может иметь некоторые аналогичные проблемы.

3. есть ли какая-то особая причина, по которой он должен быть асинхронным? SDK всегда будет ждать ответа от своего вызова, прежде чем продолжить. Если это часть гораздо более масштабного и сложного процесса, попробуйте включить его в собственную лямбду и разделить ваши лямбды на параллельные шаги в пошаговой функции

4. @Marcin ваше право, асинхронность была блокировщиком, а удаление и перезапись решили проблему. Не могли бы вы преобразовать свой комментарий в ответ?

5. @FreshX Спасибо. Ответ добавлен.

Ответ №1:

Основываясь на комментариях.

Проблемы были вызваны использованием асинхронного обработчика. Это приводит к тому, что ваша функция завершается до того, как у нее появится возможность запустить весь свой код.

Один из способов преодолеть это-обернуть свой код в обработчик, new Promise как показано в документах AWS.