-1

I'm trying to pre-load a DynamoDB table with records. I have about 1500 records to do. I've tried various ways to loop through only 5 but only one gets entered each time. Here is what I have so far.

'use strict';

var AWS = require('aws-sdk'), documentClient = new AWS.DynamoDB.DocumentClient();
var params = {};

exports.handler = function(event, ctx, callback) {
    Promise.all(
        event.map(e => {
            var params = {
                Item: {
                   UID: ctx.awsRequestId,
                   AccountName: e.accountname,
                   AccountStatus: e.accountstatus,
                   MainNumber: e.mainnumber,
                   FaxNumber: e.faxnumber,
                   EmergencyNumber: e.emergencynumber,
                   EPAPERNO: e.epaperno,
                   BGB: e.bgb,
                   WebID: e.webid,
                   BoxProgram: e.boxprogram,
                   ReportGroup: e.reportgroup,
                   CreditLimit: e.creditlimit,
                   Customer: e.customer,
                   Transporter: e.transporter,
                   TSDF: e.tsdf,
                   Permit: e.permit,
                   Created: e.created,
                   Author: e.author,
                   Modified: e.modified,
                   Editor: e.editor
            },
                TableName: 'Accounts'
            };
            documentClient.put(params, function (err, data){
               if(err){
                   console.log(err);
               }else{
                   console.log(params);
               }
           });
        })
    ).then(console.log("Done"));
};

Any help would be appreciated.

  • What is invoking this lambda? Or what is the structure of the `event` object? – 404 Jan 04 '21 at 13:12
  • The structure for the event looks like this: `[ { "accountname": "Account Name", "accountstatus": "Active", "mainnumber": "999-999-999", "faxnumber": "", "emergencynumber": "", "epaperno": "", "bgb": 0, "webid": "", "boxprogram": "", "reportgroup": "", "creditlimit": "", "customer": 0, "transporter": 1, "tsdf": 0, "permit": 0, "created": "1/3/2021 12:02:00 PM", "author": "Administrator", "modified": "1/3/2021 12:02:00 PM", "editor": "Administrator" } ] ` – StarScr3am77 Jan 04 '21 at 23:35

2 Answers2

0

Have you tried this :

'use strict';

var AWS = require('aws-sdk'), documentClient = new AWS.DynamoDB.DocumentClient();

exports.handler = async(event, ctx) => {
    return Promise.all(
        event.map(e => {
            var params = {
                Item: {
                   UID: ctx.awsRequestId,
                   AccountName: e.accountname,
                   AccountStatus: e.accountstatus,
                   MainNumber: e.mainnumber,
                   FaxNumber: e.faxnumber,
                   EmergencyNumber: e.emergencynumber,
                   EPAPERNO: e.epaperno,
                   BGB: e.bgb,
                   WebID: e.webid,
                   BoxProgram: e.boxprogram,
                   ReportGroup: e.reportgroup,
                   CreditLimit: e.creditlimit,
                   Customer: e.customer,
                   Transporter: e.transporter,
                   TSDF: e.tsdf,
                   Permit: e.permit,
                   Created: e.created,
                   Author: e.author,
                   Modified: e.modified,
                   Editor: e.editor
                },
                TableName: 'Accounts'
            };
            documentClient.put(params).promise().then(data=>{
                console.log(params);
            })
        })
    ).then(()=>{
        console.log("Done")
    }).catch(e=>{
        console.log(e)
    })
};

Let me know if you find problem with, I haven't it try

Just another idea is using [BatchWriteItem][1] to bulking put process, max 25 per batch

Mahdi Ridho
  • 264
  • 1
  • 8
0

I recommend using for loop instead of map, Promise.all will call many request by parallel, it maybe take DynamoDB become stressful.

Convert your handler function to async/await function, then just wait until dynamodb process finish.

Ref: Convert aws-sdk callback to Promise

'use strict';

var AWS = require('aws-sdk'), documentClient = new AWS.DynamoDB.DocumentClient();

const insertAccount = async (e) => {
  const params = {
    Item: {
      UID: ctx.awsRequestId,
      AccountName: e.accountname,
      AccountStatus: e.accountstatus,
      MainNumber: e.mainnumber,
      FaxNumber: e.faxnumber,
      EmergencyNumber: e.emergencynumber,
      EPAPERNO: e.epaperno,
      BGB: e.bgb,
      WebID: e.webid,
      BoxProgram: e.boxprogram,
      ReportGroup: e.reportgroup,
      CreditLimit: e.creditlimit,
      Customer: e.customer,
      Transporter: e.transporter,
      TSDF: e.tsdf,
      Permit: e.permit,
      Created: e.created,
      Author: e.author,
      Modified: e.modified,
      Editor: e.editor
    },
    TableName: 'Accounts'
  };
  return documentClient.put(params).promise(); // convert to Promise
}

exports.handler = async (event, ctx) => { // Async function
  for (const item of event) {
    console.log(item);
    await insertAccount(item) // wait until it finish and go to next item
      .catch((error) => {
        console.log(error);
        // throw error; don't care about this error, just continue
      });
  }
  console.log("Done");
};
hoangdv
  • 15,138
  • 4
  • 27
  • 48