I am not seeing an item in a DynamoDB Table after writing to it using the PutItemCommand. What am I doing wrong?

0

Lambda function code to write an item to DynamoDB Table named ‘weather’ // es6 syntax for including modules import * as fs from 'fs';

// es6 syntax for including modules
import {DynamoDB, PutItemCommand} from "@aws-sdk/client-dynamodb";

export const handler = async(event) => {

     console.log("entered handler function");

     const DDB = new DynamoDB({region: 'us-east-1'});
     let params = {};

     params.ReturnConsumedCapacity = "TOTAL";
     params.TableName = "weather";
     params.Item = {
    "sc": {
        "S": "Sacramento"
     },
     "t": {
        "N": "78"
     }
 };
 console.log(params);
 try {
     const response = DDB.send(new PutItemCommand(params));
 console.log("Success", response)
 } catch (err) {
     console.log("Error", err);
 }     
/*      
   setTimeout(function(){
       callback(null, "ok");
   }, 1000 * 10);
*/ 
};

Execution log from lambda function

Test Event Name seedDYnamoDB

Response null

Function Logs START RequestId: 5b04fd20-dbe6-4b8d-b4fa-93ad864d9a8f Version: $LATEST 2023-05-31T22:10:29.217Z 5b04fd20-dbe6-4b8d-b4fa-93ad864d9a8f INFO entered handler function 2023-05-31T22:10:29.555Z 5b04fd20-dbe6-4b8d-b4fa-93ad864d9a8f INFO { ReturnConsumedCapacity: 'TOTAL', TableName: 'weather', Item: { sc: { S: 'Sacramento' }, t: { N: '78' } } } 2023-05-31T22:10:29.557Z 5b04fd20-dbe6-4b8d-b4fa-93ad864d9a8f INFO Success Promise { <pending> } END RequestId: 5b04fd20-dbe6-4b8d-b4fa-93ad864d9a8f REPORT RequestId: 5b04fd20-dbe6-4b8d-b4fa-93ad864d9a8f Duration: 420.57 ms Billed Duration: 421 ms Memory Size: 128 MB Max Memory Used: 95 MB Init Duration: 471.46 ms

Request ID 5b04fd20-dbe6-4b8d-b4fa-93ad864d9a8f

It looks like it returned a pending Promise. I'm not sure what that means. I added the AWSLambdaBasicExecutionRole with PutItem Write access to the Permissions tab of the lambda function

profile picture
preguntada hace un año895 visualizaciones
3 Respuestas
3
Respuesta aceptada

You should await the response, as you don't, your Lambda container is getting shutdown too soon:

import {DynamoDB, PutItemCommand} from "@aws-sdk/client-dynamodb";
const DDB = new DynamoDB({region: 'us-east-1'});
export const handler = async(event) => {

     console.log("entered handler function");
     let params = {};

     params.ReturnConsumedCapacity = "TOTAL";
     params.TableName = "weather";
     params.Item = {
    "sc": {
        "S": "Sacramento"
     },
     "t": {
        "N": "78"
     }
 };
 console.log(params);
 try {
     // Added await to the DDB promise returned.
     const response =  await DDB.send(new PutItemCommand(params));
     console.log("Success", response)
 } catch (err) {
     console.log("Error", err);
 }     
/*      
   setTimeout(function(){
       callback(null, "ok");
   }, 1000 * 10);
*/ 
};

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

profile pictureAWS
EXPERTO
respondido hace un año
  • I get the following error after adding the await keyword.

    `Test Event Name seedDYnamoDB

    Response { "errorType": "Runtime.UserCodeSyntaxError", "errorMessage": "SyntaxError: Unexpected reserved word", "trace": [ "Runtime.UserCodeSyntaxError: SyntaxError: Unexpected reserved word", " at _loadUserApp (file:///var/runtime/index.mjs:994:17)", " at async UserFunction.js.module.exports.load (file:///var/runtime/index.mjs:1032:21)", " at async start (file:///var/runtime/index.mjs:1195:23)", " at async file:///var/runtime/index.mjs:1201:1" ] }`

  • Can you share the code you are running, i'm guessing its different to what you previously shared?

  • I just shared the updated code below.

1

Hi, following page will explain you how to use promises with DDB in order to manage its asynchronous responses.

https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/using-promises.html

So, if you properly process the returned promise, you should be able to see your item after it gets written

profile pictureAWS
EXPERTO
respondido hace un año
-1

I've attached the code I'm currently working on below. I commented out some code I am playing around with that I can get to successfully write to the DynamoDB table 'weather'. The code is below the ``// USING DynamoDBCLient, DynamoDBDocumentClient, and PutCommand`

I don't understand why I am getting the ** "errorType": "Runtime.UserCodeSyntaxError", "errorMessage": "SyntaxError: Unexpected reserved word",** error message after adding the await keyword in front of the DDB.send function call in the second section of the code below the ``// USING DynamoDB and PutItemCommand This code reads items from a csv file and uses a try/catch block to call the DDB.send function to write to the DynamoDB table 'weather'

UPDATE: Fixed the SyntaxError by adding async keyword to innermost function. I also rewrote the code in ES6 arrow function format. However, the original problem comes back in which the items don't get written to the DynamoDB table. I know I've done something wrong, but I've looked at it for hours and still no luck. See updated code below.

// es6 syntax for including modules
import * as fs from 'fs';

// es6 syntax for including modules
import {DynamoDB, PutItemCommand, DynamoDBClient} from "@aws-sdk/client-dynamodb";
import { PutCommand, DynamoDBDocumentClient } from "@aws-sdk/lib-dynamodb";

export const handler = async(event) => {
     console.log("entered handler function");

//      
// USING DynamoDBCLient, DynamoDBDocumentClient,  and PutCommand 
//
/*     const DDB = new DynamoDBClient({region: 'us-east-1'});
     const docClient = DynamoDBDocumentClient.from(DDB);
     let params = {};
     const command = new PutCommand({
        "TableName": 'weather',
        "ReturnConsumedCapacity": "TOTAL",
        "Item": {
 //         "sc": {"S": "Sacramento" } ,
          "sc": "Sac",
          "t" : "74"
        }
    });
    const response = await docClient.send(command);
    console.log(response);
    return(response);*/

//      
// USING DynamoDB and PutItemCommand
//
     const DDB = new DynamoDB({region: 'us-east-1'});
     let params = {};
     const fileContents = fs.readFileSync("cities.csv", "utf8").split('\n').map(function(item_str){
          params.ReturnConsumedCapacity = "TOTAL";
          params.TableName = "weather";
          params.Item = {
              "sc": {
                  "S": item_str.split(",")[0]
              },
              "t": {
                  "N": String(item_str.split(",")[1])
              }
          };
          console.log(params);
          try {
              const responses = await DDB.send(new PutItemCommand(params));
              console.log("Success", responses)
          } catch (err) {
              console.log("Error", err);
          }
      });

/*      
   setTimeout(function(){
       callback(null, "ok");
   }, 1000 * 10);
  */
};

UPDATED CODE

// es6 syntax for including modules
import * as fs from 'fs';

// es6 syntax for including modules
import {DynamoDB, PutItemCommand, DynamoDBClient} from "@aws-sdk/client-dynamodb";

import { PutCommand, DynamoDBDocumentClient } from "@aws-sdk/lib-dynamodb";

export const handler = async(event, callback) => {

     console.log("entered handler function");

     const DDB = new DynamoDBClient({region: 'us-east-1'});
     const docClient = DynamoDBDocumentClient.from(DDB);
     let params = {};

     const fileContents = fs.readFileSync("cities.csv", "utf8").split('\n').map(async (item_str) => {
          params.ReturnConsumedCapacity = "TOTAL";
          params.TableName = "weather";
          params.Item = {
              "sc": {
                  "S": item_str.split(",")[0]
              },
              "t": {
                  "N": String(item_str.split(",")[1])
              }
          };
          console.log(params);
          try {
              const responses = await docClient.send(new PutCommand(params));
              console.log(responses);
              return(responses);
          } catch (err) {
              console.log("Error", err);
          } finally {
              console.log("Success");
          }
      });
      
   setTimeout(function(){
       callback(null, "ok");
   }, 1000 * 10);
  
};

Execution Log

Test Event Name
seedDYnamoDB

Response
null

Function Logs
'TOTAL',
  TableName: 'weather',
  Item: { sc: { S: 'CATHEDRAL CITY' }, t: { N: '39' } }
}
2023-06-06T20:43:41.064Z	5ed80d11-17a2-4300-a11e-4a41afebd8a1	INFO	{
  ReturnConsumedCapacity: 'TOTAL',
  TableName: 'weather',
  Item: { sc: { S: 'ELKHART' }, t: { N: '45' } }
}
2023-06-06T20:43:41.064Z	5ed80d11-17a2-4300-a11e-4a41afebd8a1	INFO	{
  ReturnConsumedCapacity: 'TOTAL',
  TableName: 'weather',
  Item: { sc: { S: 'FONTANA' }, t: { N: '31' } }
}
2023-06-06T20:43:41.065Z	5ed80d11-17a2-4300-a11e-4a41afebd8a1	INFO	{
  ReturnConsumedCapacity: 'TOTAL',
  TableName: 'weather',
  Item: { sc: { S: 'LINCOLN' }, t: { N: '57' } }
}
2023-06-06T20:43:41.065Z	5ed80d11-17a2-4300-a11e-4a41afebd8a1	INFO	{
  ReturnConsumedCapacity: 'TOTAL',
  TableName: 'weather',
  Item: { sc: { S: 'MACON' }, t: { N: '38' } }
}
2023-06-06T20:43:41.121Z	5ed80d11-17a2-4300-a11e-4a41afebd8a1	INFO	{
  ReturnConsumedCapacity: 'TOTAL',
  TableName: 'weather',
  Item: { sc: { S: 'MARYSVILLE' }, t: { N: '73' } }
}
2023-06-06T20:43:41.121Z	5ed80d11-17a2-4300-a11e-4a41afebd8a1	INFO	{
  ReturnConsumedCapacity: 'TOTAL',
  TableName: 'weather',
  Item: { sc: { S: 'MEMPHIS' }, t: { N: '44' } }
}
2023-06-06T20:43:41.122Z	5ed80d11-17a2-4300-a11e-4a41afebd8a1	INFO	{
  ReturnConsumedCapacity: 'TOTAL',
  TableName: 'weather',
  Item: { sc: { S: 'MESA' }, t: { N: '66' } }
}
2023-06-06T20:43:41.122Z	5ed80d11-17a2-4300-a11e-4a41afebd8a1	INFO	{
  ReturnConsumedCapacity: 'TOTAL',
  TableName: 'weather',
  Item: { sc: { S: 'MYRTLE BEACH' }, t: { N: '44' } }
}
2023-06-06T20:43:41.122Z	5ed80d11-17a2-4300-a11e-4a41afebd8a1	INFO	{
  ReturnConsumedCapacity: 'TOTAL',
  TableName: 'weather',
  Item: { sc: { S: 'NAPERVILLE' }, t: { N: '61' } }
}
2023-06-06T20:43:41.122Z	5ed80d11-17a2-4300-a11e-4a41afebd8a1	INFO	{
  ReturnConsumedCapacity: 'TOTAL',
  TableName: 'weather',
  Item: { sc: { S: 'PANAMA CITY' }, t: { N: '28' } }
}
2023-06-06T20:43:41.122Z	5ed80d11-17a2-4300-a11e-4a41afebd8a1	INFO	{
  ReturnConsumedCapacity: 'TOTAL',
  TableName: 'weather',
  Item: { sc: { S: 'PATERSON' }, t: { N: '77' } }
}
2023-06-06T20:43:41.123Z	5ed80d11-17a2-4300-a11e-4a41afebd8a1	INFO	{
  ReturnConsumedCapacity: 'TOTAL',
  TableName: 'weather',
  Item: { sc: { S: 'POMPANO BEACH' }, t: { N: '38' } }
}
2023-06-06T20:43:41.123Z	5ed80d11-17a2-4300-a11e-4a41afebd8a1	INFO	{
  ReturnConsumedCapacity: 'TOTAL',
  TableName: 'weather',
  Item: { sc: { S: 'SABANA' }, t: { N: '67' } }
}
2023-06-06T20:43:41.123Z	5ed80d11-17a2-4300-a11e-4a41afebd8a1	INFO	{
  ReturnConsumedCapacity: 'TOTAL',
  TableName: 'weather',
  Item: { sc: { S: 'SAN BUENAVENTURA' }, t: { N: '50' } }
}
2023-06-06T20:43:41.123Z	5ed80d11-17a2-4300-a11e-4a41afebd8a1	INFO	{
  ReturnConsumedCapacity: 'TOTAL',
  TableName: 'weather',
  Item: { sc: { S: 'SANTA ROSA' }, t: { N: '41' } }
}
2023-06-06T20:43:41.123Z	5ed80d11-17a2-4300-a11e-4a41afebd8a1	INFO	{
  ReturnConsumedCapacity: 'TOTAL',
  TableName: 'weather',
  Item: { sc: { S: 'SARASOTA' }, t: { N: '43' } }
}
2023-06-06T20:43:41.241Z	5ed80d11-17a2-4300-a11e-4a41afebd8a1	INFO	{
  ReturnConsumedCapacity: 'TOTAL',
  TableName: 'weather',
  Item: { sc: { S: 'SIOUX CITY' }, t: { N: '60' } }
}
2023-06-06T20:43:41.261Z	5ed80d11-17a2-4300-a11e-4a41afebd8a1	INFO	{
  ReturnConsumedCapacity: 'TOTAL',
  TableName: 'weather',
  Item: { sc: { S: 'SOUTH BEND' }, t: { N: '52' } }
}
2023-06-06T20:43:41.301Z	5ed80d11-17a2-4300-a11e-4a41afebd8a1	INFO	{
  ReturnConsumedCapacity: 'TOTAL',
  TableName: 'weather',
  Item: { sc: { S: 'SPRINGDALE' }, t: { N: '41' } }
}
2023-06-06T20:43:41.302Z	5ed80d11-17a2-4300-a11e-4a41afebd8a1	INFO	{
  ReturnConsumedCapacity: 'TOTAL',
  TableName: 'weather',
  Item: { sc: { S: 'ST. PETERSBURG' }, t: { N: '44' } }
}
2023-06-06T20:43:41.302Z	5ed80d11-17a2-4300-a11e-4a41afebd8a1	INFO	{
  ReturnConsumedCapacity: 'TOTAL',
  TableName: 'weather',
  Item: { sc: { S: 'WEST COVINA' }, t: { N: '69' } }
}
END RequestId: 5ed80d11-17a2-4300-a11e-4a41afebd8a1
REPORT RequestId: 5ed80d11-17a2-4300-a11e-4a41afebd8a1	Duration: 2556.87 ms	Billed Duration: 2557 ms	Memory Size: 128 MB	Max Memory Used: 35 MB

Request ID
5ed80d11-17a2-4300-a11e-4a41afebd8a1
profile picture
respondido hace un año
  • Adding an await Promise.all( in front of the fs.readFileSync function call seemed to do the trick.

No has iniciado sesión. Iniciar sesión para publicar una respuesta.

Una buena respuesta responde claramente a la pregunta, proporciona comentarios constructivos y fomenta el crecimiento profesional en la persona que hace la pregunta.

Pautas para responder preguntas