AWS Lambda и DynamoDB Null Response

Sep 16 2020

Я пытаюсь записать в таблицу DynamoDB из лямбда-функции. Когда я тестирую запуск функции, она возвращает значение null, без сообщения об ошибке и ничего не записывается в таблицу. Функция ниже. Я уже настроил роль службы для этой функции с политикой разрешений, которая разрешает доступ к таблице «Продукты». Я видел, как в некоторых руководствах упоминалось создание «приложения AWS Lambda», а затем создание функции Lambda, но я не думал, что это необходимо для моего использования.

const AWS = require('aws-sdk');
const dynamodb = new AWS.DynamoDB({apiVersion: '2012-08-10'});

exports.handler = async (event, context, callback) => {

  dynamodb.putItem({
      TableName: "Products",
      Item: {
          "sku": {S: "29574839"},
          "name": {S: "Test Code"}
      }
  }, function(err, data) {
      if (err) {
          console.log(err, err.stack);
          return callback(null, {
              statusCode: '500',
              body: err
          });
      } else {
          return callback(null, {
              statusCode: '200',
              body: 'Adding to table!'
          });
      }
  });

};

Я также пробовал использовать клиент документа const docClient = new dynamodb.DocumentClient();и получаю сообщение об ошибке: «Dynamodb.DocumentClient не является конструктором».

Что мне здесь не хватает? Спасибо!

Журналы CloudWatch показывают (я удалил идентификатор запроса): Журналы функций: START RequestId: Версия: $ LATEST END RequestId: REPORT RequestId: Продолжительность: 491,07 мс Продолжительность выставления счета: 500 мс Размер памяти: 128 МБ Максимально используемая память: 87 МБ Длительность инициализации: 405,37 мс

Ответы

2 Marcin Sep 16 2020 at 06:15

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

Один из способов исправить это - использовать, Promiseкак показано в документации AWS . Например:

const AWS = require('aws-sdk');
const dynamodb = new AWS.DynamoDB({apiVersion: '2012-08-10'});

exports.handler = async (event, context, callback) => {

    const promise = new Promise(function(resolve, reject) {

      dynamodb.putItem({
          TableName: "Products",
          Item: {
              "sku": {S: "29574839"},
              "name": {S: "Test Code"}
          }
      }, function(err, data) {
          if (err) {
              console.log(err, err.stack);
              return callback(null, {
                  statusCode: '500',
                  body: err
              });
          } else {
              return callback(null, {
                  statusCode: '200',
                  body: 'Adding to table!'
              });
          }
      });
  })

  return promise;   
};

Вышеуказанные изменения являются только примерными, поэтому, вероятно, все же потребуются некоторые корректировки.