AWS Lambda (Node.js v6.10) から DynamoDB に入れた Gzip バイナリデータを展開する
公開日: today タグ:
aws
node.js

AWS DynamoDB では指定した IO 性能に応じて料金が発生するため、 クエリなどで使用しないプロパティについては gzip 圧縮などを施してバイナリデータとして格納したほうが、 必要な IO 性能が少なくなるためお得です(参考:大量の属性値を圧縮する)。

本記事は、AWS Lambda (Node.js 6.10) から DynamoDB のデータを取得し、 展開する処理のメモです。

DynamoDB に以下のような形式でデータが入っているとします。

{ "hash_id": "string",
  "body": JSON データ文字列を gzip 圧縮したバイナリ }

ここでは hash_id を partition key として指定しています。 なので以下のように hash_id を指定して GET するとデータが取得できます。

var dynamodb = new AWS.DynamoDB.DocumentClient();
var params = { TableName: 'dynamedb_table_name', Key: { 'hash_id': 'xxx' } };
dynamodb.get(params, function(err, data) { ... }

JSON 形式ではバイナリデータを扱えないので、Base64 形式に直してやりとりします。 しかし、受信した段階で data.Item.bodyBuffer データとなっているようです。 (参考:AWS SDK for Javascript のドキュメント)

なのでこれを展開します。

var body = zlib.gunzipSync(data.Item.body);

これも Buffer なので、文字列に変換して parse することでようやく元の JSON データとなります。

JSON.parse(body.toString())

最後に以上の処理を行う AWS Lambda のサンプルを置いておきます。