Resposta nula do AWS Lambda e do DynamoDB

Sep 16 2020

Estou tentando escrever em uma tabela do DynamoDB a partir de uma função Lambda. Quando eu testo a função, ela retorna nulo, sem mensagem de erro e nada é escrito na tabela. A função está abaixo. Já configurei uma função de serviço para esta função com uma política de permissões que permite o acesso à tabela 'Produtos'. Já vi alguns tutoriais mencionarem a criação de um "aplicativo AWS Lambda" e, em seguida, a criação da função Lambda, mas não achei que isso fosse necessário para meu uso.

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!'
          });
      }
  });

};

Também tentei usar o cliente de documento const docClient = new dynamodb.DocumentClient();e recebo o erro: "dynamodb.DocumentClient não é um construtor".

O que estou perdendo aqui? Obrigado!

Os logs do CloudWatch mostram (eu removi o id da solicitação): Logs de funções: START RequestId: Versão: $ LATEST END RequestId: REPORT RequestId: Duração: 491,07 ms Duração do faturamento: 500 ms Tamanho da memória: 128 MB Memória máxima usada: 87 MB Duração inicial: 405,37 ms

Respostas

2 Marcin Sep 16 2020 at 06:15

Como você está usando o manipulador assíncrono , acho que o problema é que sua função é concluída antes que o corpo do manipulador tenha a chance de ser executado.

Uma maneira de corrigir isso é usando o Promiseconforme mostrado nos documentos da AWS . Por exemplo:

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;   
};

As alterações acima são apenas exemplificativas, portanto, provavelmente alguns ajustes ainda serão necessários.