Search code examples
typescriptamazon-web-servicesaws-lambdaamazon-dynamodb

How do I execute a BatchWriteCommand from Lambda to DynamoDB using the @aws-sdk/lib-dynamodb package?


I am currently trying to write to multiple existing databases with one call to BatchWriteCommand. All architecture is currently setup using the AWS CDK, and this function is being executed within a Typescript Lambda function. I have setup the input to my BatchWriteCommand with the same syntax as the following (anonymized):

import {
  DynamoDBClient
} from "@aws-sdk/client-dynamodb";
import {
  DynamoDBDocumentClient,
  GetCommand,
  BatchWriteCommand
} from "@aws-sdk/lib-dynamodb";

const client = new DynamoDBClient({});
const ddbDocClient = DynamoDBDocumentClient.from(client);

...

const writeToDatabases(body: Object) => {
  const Id = String(crypto.randomUUID());
  const field1 = String(body.field1);
  const field2 = String(body.field2);

  const response = await ddbDocClient.send(
    new BatchWriteCommand({
      RequestItems: [
        process.env.TABLE_1_NAME: [{
          PutRequest: {
            Item: {
              Id: Id,
              Field1: Field1
            }
          }
        }],
        process.env.TABLE_2_NAME: [{
          PutRequest: {
            Item: {
              Id: Id,
              Field2: Field2
            }
          }
        }]
      ]
    })
  );
}

According to the BatchWriteCommand lib-dynamodb documentation, and the underlying BatchWriteItem client-dynamodb documentation, I have everything correctly formatted. However, I am getting an error on the lines where I specify the tables to add to (process.env.TABLE_1_NAME and process.env.TABLE_2_NAME):

Type 'string | undefined' is not assignable to type '(Omit<WriteRequest, "PutRequest" | "DeleteRequest"> & { PutRequest?: (Omit<PutRequest, "Item"> & { Item: Record<string, any> | undefined; }) | undefined; DeleteRequest?: (Omit<...> & { ...; }) | undefined; })[]'.
Type 'undefined' is not assignable to type '(Omit<WriteRequest, "PutRequest" | "DeleteRequest"> & { PutRequest?: (Omit<PutRequest, "Item"> & { Item: Record<string, any> | undefined; }) | undefined; DeleteRequest?: (Omit<...> & { ...; }) | undefined; })[]'.ts(2322)

Even when I hard-code these values, I get the same error about wrong type assignments.

I'd rather not have to execute multiple PutCommands in a row, so getting this working would be ideal. Thanks in advance for the help!


Solution

  • RequestItems is not a list of items, it's a map in which each table name is only defined once.

    const response = await ddbDocClient.send(
        new BatchWriteCommand({
          RequestItems: {
            process.env.TABLE_1_NAME: [{
              PutRequest: {
                Item: {
                  Id: Id,
                  Field1: Field1
                }
              }
            }],
            process.env.TABLE_2_NAME: [{
              PutRequest: {
                Item: {
                  Id: Id,
                  Field2: Field2
                }
              }
            }]
          }
        })
      );