AWS Lambda (Node.js v6.10) から DynamoDB に入れた Gzip バイナリデータを展開する
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.body
は Buffer
データとなっているようです。
(参考:AWS SDK for Javascript のドキュメント)
なのでこれを展開します。
var body = zlib.gunzipSync(data.Item.body);
これも Buffer
なので、文字列に変換して parse することでようやく元の JSON データとなります。
JSON.parse(body.toString())
最後に以上の処理を行う AWS Lambda のサンプルを置いておきます。