Réponse nulle AWS Lambda et DynamoDB

Sep 16 2020

J'essaie d'écrire dans une table DynamoDB à partir d'une fonction Lambda. Lorsque je teste l'exécution de la fonction, elle renvoie null, sans message d'erreur et rien n'est écrit dans la table. La fonction est ci-dessous. J'ai déjà configuré un rôle de service pour cette fonction avec une politique d'autorisations qui permet d'accéder à la table «Produits». J'ai vu certains tutoriels mentionner la création d'une "application AWS Lambda", puis la création de la fonction Lambda, mais je ne pensais pas que cela était nécessaire pour mon utilisation.

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

};

J'ai également essayé d'utiliser le client de document const docClient = new dynamodb.DocumentClient();et j'obtiens l'erreur: "dynamodb.DocumentClient n'est pas un constructeur".

Qu'est-ce que j'oublie ici? Merci!

Affichage des journaux CloudWatch (j'ai supprimé l'ID de la demande): Journaux de fonction: START RequestId: Version: $ LATEST END RequestId: REPORT RequestId: Durée: 491,07 ms Durée facturée: 500 ms Taille de la mémoire: 128 Mo Mémoire maximale utilisée: 87 Mo Durée de l'initialisation: 405,37 ms

Réponses

2 Marcin Sep 16 2020 at 06:15

Puisque vous utilisez un gestionnaire asynchrone, je pense que le problème est que votre fonction se termine avant que le corps du gestionnaire ait une chance de s'exécuter.

Une façon de remédier à ce problème consiste à utiliser Promisecomme indiqué dans la documentation AWS . Par example:

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

Les changements ci-dessus ne sont donnés qu'à titre d'exemple, il faudra donc probablement encore quelques ajustements.