Node.js AWS SDK v3でDynamoDB操作してみた

2021.07.20

吉川@広島です。

AWS SDK for JavaScript バージョン 3 が一般公開を開始

AWS SDK v3を案件で採用してみたのですが、v2と比べて公式以外の情報がまだまだ少ないと感じました。そのため触った範囲で共有していきたいと思います。

環境

  • Node.js v15.14.0
  • typescript v4.3.2
  • @aws-sdk/client-dynamodb v3.19.0

導入

yarn add @aws-sdk/client-dynamodb

コード例

現時点でBatchWriteとQueryを試したので、この2つの操作を紹介したいと思います。

想定テーブル

下のような「usersテーブル」に対して操作する想定とします。

Attribute Key 値の例
id S HashKey 'CM0001', 'CM0002'
name S 'クラメソ太郎', 'クラメソ二郎'
role S GSI HashKey '管理者', '一般'

BatchWrite

import {
  DynamoDBClient,
  WriteRequest,
  BatchWriteItemCommand,
} from '@aws-sdk/client-dynamodb'

const writeRequests: WriteRequest[] = [
  {
    PutRequest: {
      Item: {
        id: { S: 'CM0001' },
        name: { S: 'クラメソ太郎' },
        role: { S: '管理者' },
      },
    },
  },
  {
    PutRequest: {
      Item: {
        id: { S: 'CM0002' },
        name: { S: 'クラメソ二郎' },
        role: { S: '一般' },
      },
    },
  },
]

const dynamoDBClient = new DynamoDBClient({})
const tableName = 'users'
const result = await dynamoDBClient.send(
  new BatchWriteItemCommand({
    RequestItems: {
      [tableName]: writeRequests, // キーにテーブル名を指定
    },
  })
)

console.log('保存結果: ', result)

Query

import {
  DynamoDBClient,
  QueryCommand,
  QueryCommandInput,
} from '@aws-sdk/client-dynamodb'

const params: QueryCommandInput = {
  TableName: 'users',
  IndexName: 'role-index',
  KeyConditionExpression: 'role = :role',
  ExpressionAttributeValues: {
    ':role': { S: 'Administrator' },
  },
}

const dynamoDBClient = new DynamoDBClient({})
const result = await dynamoDBClient.send(new QueryCommand(params))
console.log('取得結果: ', result)

その他

公式のExamplesが参考になります。

AWS SDK for JavaScript v3

v2との比較

良い点

v2では非同期処理のデフォルトはcallbackであり、Promiseで処理するには .promise() を使う必要がありました。

JavaScript Promises の使用 - AWS SDK for JavaScript

v3ではデフォルトでPromiseベースになりました。これは嬉しいですね。

少し慣れが必要に思った点

v2のAPIは dynamoDBClient.put() のように操作がメソッドとして生えていました。

AWS SDK for Node.js での DynamoDB と DynamoDB.DocumentClient の違い | DevelopersIO

一方、v3ではどの操作を行う場合も dynamoDBClient.send() というようにsendメソッドに統一されており、引数で渡すインスタンス ( new XXXXCommand() ) で操作を切り替えるようになっています。この点、使い心地は結構変わる印象でした。