AWS Lambda e DynamoDB Null Response

Sep 16 2020

Sto cercando di scrivere su una tabella DynamoDB da una funzione Lambda. Quando provo a eseguire la funzione, restituisce null, senza messaggi di errore e non viene scritto nulla nella tabella. La funzione è sotto. Ho già impostato un ruolo di servizio per questa funzione con una politica di autorizzazioni che consente l'accesso alla tabella "Prodotti". Ho visto alcuni tutorial menzionare la creazione di una "Applicazione AWS Lambda", quindi la creazione della funzione Lambda, ma non pensavo che fosse necessaria per il mio utilizzo.

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

};

Ho anche provato a utilizzare document client const docClient = new dynamodb.DocumentClient();e ottengo l'errore: "dynamodb.DocumentClient non è un costruttore".

Cosa mi manca qui? Grazie!

I log di CloudWatch mostrano (ho rimosso l'id richiesta): Log delle funzioni: START RequestId: Versione: $ LATEST END RequestId: REPORT RequestId: Durata: 491,07 ms Durata fatturata: 500 ms Dimensioni memoria: 128 MB Memoria massima utilizzata: 87 MB Durata iniziale: 405.37 ms

Risposte

2 Marcin Sep 16 2020 at 06:15

Dal momento che stai usando il gestore asincrono, penso che il problema sia che la tua funzione viene completata prima che il corpo del gestore abbia la possibilità di essere eseguito.

Un modo per ovviare a questo problema è utilizzare Promisecome mostrato nei documenti AWS . Per esempio:

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

Le modifiche di cui sopra sono solo esemplari, quindi probabilmente saranno ancora necessari alcuni aggiustamenti.