Search code examples
aws-api-gateway

Insert Multiple records in dynamodb using api gateway


How can I insert multiple rows in dynamodb using body mapping template of API gateway?

Input to my code is "xyz 1,abc 2" which has information about 2 rows to be inserted.

Only second record which is "abc 2" is getting stored, I want both records to be inserted in the table. Below is the code I have written

#set($rawAPIData = $input.path('$'))
#set ($bulk = $rawAPIData.split(","))
{
"TableName": "tablename",
#foreach( $records in $bulk)
#set ($s = $records.split(" "))
"Item": {
    "col1": {
            "S": "$s.get(0)"
    },
    "col2": {
            "S": "$s.get(1)"
    }

}
#if( $foreach.hasNext ), #end
#end
}

I'm new to this, suggestion would really help


Solution

  • This AWS guide shows how to use API Gateway as a proxy for DynamoDB. It's similar the approach you are trying to take. As a suggestion, it might be better have your api focus on a single row at a time, rather than splitting multiple inputs on ,. For example it would simplify your template somewhat to send requests similar to those found in the guide.

    Example Request Body:

    { 
      "col1": "xyz",
      "col2": "1"
    }
    

    Template (derived from your template code):

    { 
        "TableName": "tablename",
        "Item": {
          "col1": {
              "S": "$input.path('$.col1')"
              },
          "col2": {
              "S": "$input.path('$.col2')"
             }
        }
    }
    

    However, if you want to stick to operating on multiple items, The BatchWriteItem documentation would be worth a read. Following the example, I think this should be your body template:

    #set($rawAPIData = $input.path('$'))
    #set ($bulk = $rawAPIData.split(","))
    {
      "RequestItems": {
        "tablename": [
          #foreach($records in $bulk)
          #set ($s = $records.split(" "))
          {
            "PutRequest": {
              "Item": {
                "col1": {
                   "S": "$s.get(0)"
                },
                "col2": {
                  "S": "$s.get(1)"
                }
              }
            }
          }
         #if( $foreach.hasNext ), 
         #end
        ]
      }
    #end
    }