Node.js AWS SDK v3でDynamoDB操作してみた
吉川@広島です。
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が参考になります。
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()
) で操作を切り替えるようになっています。この点、使い心地は結構変わる印象でした。