AWS Lambda dan DynamoDB Null Response

Sep 16 2020

Saya mencoba menulis ke tabel DynamoDB dari fungsi Lambda. Ketika saya menguji menjalankan fungsinya, ia mengembalikan null, tanpa pesan kesalahan dan tidak ada yang ditulis ke tabel. Fungsinya ada di bawah. Saya telah menyiapkan peran layanan untuk fungsi ini dengan kebijakan izin yang memungkinkan akses ke tabel 'Produk'. Saya telah melihat beberapa tutorial yang menyebutkan membuat "AWS Lambda Application", kemudian membuat fungsi Lambda, tetapi menurut saya ini tidak perlu untuk saya gunakan.

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

};

Saya juga mencoba menggunakan klien dokumen const docClient = new dynamodb.DocumentClient();dan saya mendapatkan kesalahan: "dynamodb.DocumentClient bukan konstruktor".

Apa yang kulewatkan di sini? Terima kasih!

Log CloudWatch menunjukkan (Saya menghapus id permintaan): Log fungsi: MULAI RequestId: Versi: $ LATEST END RequestId: LAPORAN RequestId: Durasi: 491.07 md Durasi yang Ditagih: 500 md Ukuran Memori: 128 MB Memori Maks yang Digunakan: 87 MB Durasi Masuk: 405,37 ms

Jawaban

2 Marcin Sep 16 2020 at 06:15

Karena Anda menggunakan penangan async, saya pikir masalahnya adalah bahwa fungsi Anda selesai sebelum badan penangan memiliki kesempatan untuk dijalankan.

Salah satu cara untuk memperbaikinya adalah melalui penggunaan Promiseseperti yang ditunjukkan di dokumen AWS . Sebagai contoh:

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

Perubahan di atas hanya sebagai contoh, sehingga mungkin masih diperlukan beberapa penyesuaian.