AWS Lambda i DynamoDB Null Response

Sep 16 2020

Próbuję pisać do tabeli DynamoDB z funkcji Lambda. Kiedy testuję uruchamiam funkcję, zwraca ona wartość null, bez komunikatu o błędzie i nic nie jest zapisywane w tabeli. Funkcja jest poniżej. Skonfigurowałem już rolę usługi dla tej funkcji z polityką uprawnień, która umożliwia dostęp do tabeli „Produkty”. Widziałem kilka tutoriali wspominających o stworzeniu "aplikacji AWS Lambda", a następnie utworzeniu funkcji Lambda, ale nie sądziłem, że jest to konieczne do mojego użytku.

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

};

Próbowałem również użyć klienta dokumentów const docClient = new dynamodb.DocumentClient();i otrzymuję błąd: „dynamodb.DocumentClient nie jest konstruktorem”.

Czego tu brakuje? Dzięki!

Wyświetlają się dzienniki CloudWatch (usunąłem identyfikator żądania): Dzienniki funkcji: START RequestId: Wersja: $ LATEST END RequestId: REPORT RequestId: Czas trwania: 491.07 ms Billed Duration: 500 ms Rozmiar pamięci: 128 MB Maksymalne użycie pamięci: 87 MB Init Duration: 405,37 ms

Odpowiedzi

2 Marcin Sep 16 2020 at 06:15

Ponieważ używasz programu obsługi asynchronicznej , myślę, że problem polega na tym, że funkcja kończy się, zanim ciało programu obsługi będzie miało szansę działać.

Jednym ze sposobów naprawienia tego jest użycie, Promisejak pokazano w dokumentacji AWS . Na przykład:

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

Powyższe zmiany mają jedynie charakter przykładowy, dlatego prawdopodobnie nadal będą potrzebne pewne korekty.