📌

AWS SDK 3 で DynamoDB を操作

2023/03/31に公開

AWS SDK 3 とは

なぜ AWS SDK 3 なのかというと最近使えるようになった Node.js 18 のランタイムではデフォルトの AWS SDK が 3 系の為、今後 Node で開発する場合はこちらを使うことになるかと思います。

DynamoDB で使う際に色々癖がありまして、今まで使ってきた SDK 2 のことは一旦忘れていいかなと思います。

ちなみに SDK3 で DynamoDB を操作する場合は 2 種類方法があります。

1.DynamoDBClient

2.DynamoDBDocumentClient

1が基本で2はそのラッパー(使いやすくする)

ただ、凝った機能を使う場合やはり1の知識が必要になるので2は条件が合えば使うということでいいかと思います。

ソースに統一感だすには1だけで構築するのを私はおすすめしておきます。

この記事では1だけ説明します。

導入

SDK3 の導入方法は以下の様になります。

各 import メソッドの説明は以下の通りです。

以下のメソッド毎にサンプルを記載していますので、改造して取得してもらえればと思います。

メソッド 説明
DynamoDBClient 必須です。DynamoDB のアクセスに必要です。
GetItemCommand DB から PK(SK が有る場合含む)でデータを取得
PutItemCommand DB にデータを入れる
QueryCommand クエリを発行してデータを取得
ScanCommand スキャン発行してデータを取得
const {
  DynamoDBClient,
  GetItemCommand,
  PutItemCommand,
  QueryCommand,
  ScanCommand,
} = require("@aws-sdk/client-dynamodb");

// クライアントインスタンスを生成
const dynamo = new DynamoDBClient({ region: process.env.AWS_REGION });

GetItemCommand

DB から PK(SK が有る場合含む)でデータを取得します。

const getItem = async (pkValue) => {
  const PK = "パーティションキー名";
  const command = new GetItemCommand({
    TableName: "DynamoDBテーブル名",
    Key: {
      [PK]: { S: pkValue },
    },
  });
  const data = await dynamo.send(command);
  return data.Item;
};

S となっているのは文字列ですよと DynamoDB にいお知らせしています。
仮に N の数値の場合でもオブジェクトの Value は文字列型である必要があります。
例.

[PK]: { N: "必ず文字列" }

※もし SK が設定してある場合は設定必須ですので Key を以下の用にする必要があります。

Key: {
  [PK]: { S: pkValue },
  [SK]: { S: skValue}
},

戻り値のイメージ Item 内部

{
  "Title": {
    "S": "Super Mario World"
  },
  "Hardware": {
    "S": "SNES"
  }
}

PutItemCommand

DB にデータを入れるメソッドです。

const putItem = async (pkValue, value) => {
  const PK = "パーティションキー名";
  const unixTime = new Date().getTime();
  const command = new PutItemCommand({
    TableName: "DynamoDBテーブル名",
    Item: {
      [PK]: { S: pkValue },
      SampleValue: { S: value },
      CreateDate: { N: unixTime.toString() },
      UpdateUser: { S: "system" },
      UpdateDate: { N: unixTime.toString() },
    },
  });
  await dynamo.send(command);
};

QueryCommand

クエリを発行してデータを取得するメソッドです。

SK が設定してある場合に PK だけで値が取りたいときに使えます。

const query = async (pkValue) => {
  const command = new QueryCommand({
    TableName: "DynamoDBテーブル名",
    KeyConditionExpression: "PK = :PK",
    ExpressionAttributeValues: {
      ":PK": { S: pkValue },
    },
  });
  const data = await dynamo.send(command);
  // 戻り値はitems内に配列で取得できる
  return data.Items;
};

PK となっている箇所を実際の PK 名称に置き換えれば使えるかと思います。

※残念ながら SK のみでデータを取得することはできませんので SK をキーに取りたい場合は GSI を設定してください。その場合の取得方法は少し異なるのでまた自身で調べていただければと思います。

戻り値のイメージ Items 内部

[
  {
    "Title": {
      "S": "Super Mario World"
    },
    "Hardware": {
      "S": "SNES"
    }
  },
  {
    "Title": {
      "S": "Dr. Mario"
    },
    "Hardware": {
      "S": "NES"
    }
  }
]

ScanCommand

スキャン発行してデータを取得するメソッドです。
今回はすべてのデータを取得していますが、フィルターなども可能なようです。詳しくは調べていただければと思います。

const scan = async () => {
  const command = new ScanCommand({
    TableName: "DynamoDBテーブル名",
  });
  const data = await dynamo.send(command);
  // 戻り値はitems内に配列で取得できる
  return data.Items;
};

戻り値のイメージ Items 内部

[
  {
    "Title": {
      "S": "Super Mario World"
    },
    "Hardware": {
      "S": "SNES"
    }
  },
  {
    "Title": {
      "S": "Dr. Mario"
    },
    "Hardware": {
      "S": "NES"
    }
  }
]

参考文献

Discussion