Respuesta nula de AWS Lambda y DynamoDB

Sep 16 2020

Estoy intentando escribir en una tabla de DynamoDB desde una función Lambda. Cuando pruebo la función, devuelve nulo, sin mensaje de error y no se escribe nada en la tabla. La función está a continuación. Ya configuré un rol de servicio para esta función con una política de permisos que permite el acceso a la tabla 'Productos'. He visto algunos tutoriales que mencionan la creación de una "Aplicación AWS Lambda" y luego la creación de la función Lambda, pero no pensé que esto fuera necesario para mi 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!'
          });
      }
  });

};

También intenté usar el cliente de documentos const docClient = new dynamodb.DocumentClient();y aparece el error: "dynamodb.DocumentClient no es un constructor".

¿Que me estoy perdiendo aqui? ¡Gracias!

Los registros de CloudWatch muestran (eliminé el ID de solicitud): Registros de funciones: START RequestId: Versión: $ LATEST END RequestId: REPORT RequestId: Duración: 491.07 ms Duración facturada: 500 ms Tamaño de memoria: 128 MB Memoria máxima utilizada: 87 MB Duración inicial: 405,37 ms

Respuestas

2 Marcin Sep 16 2020 at 06:15

Dado que está utilizando un controlador asíncrono , creo que el problema es que su función se completa antes de que el cuerpo del controlador tenga la oportunidad de ejecutarse.

Una forma de rectificar esto es mediante el uso de Promisecomo se muestra en los documentos de AWS . Por ejemplo:

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

Los cambios anteriores son solo ejemplares, por lo que probablemente aún se necesitarán algunos ajustes.