書くこと
DynamoDBは仕様上、全てのデータを削除するAPIが提供されていません。
そのため全てのデータを削除したい場合
- データを個々に削除する。
- テーブルを削除し、再作成する。
- TTL属性を使用して、DynamoDBに削除をお願いする。
要件に応じて、この中から選択する形になると思います。
このうち今回は、テーブルを削除し、再作成するについて記載したいと思います。
Node.jsで書かれたものが見つからなかったので、実装してみました。
実装
動作環境: Lambda(Node.js 8.10)
git: URL
const AWS = require('aws-sdk');
const Dynamo = new AWS.DynamoDB();
exports.handler = async (event) => {
const params = {
TableName: "Music"
};
try {
// テーブル情報を取得する
const tableInfo = await getTableInfo(params);
// delete実行
await deleteTable(params);
// deleteが完了したのを確認する
await waitForDeleted(params);
// 取得したテーブル情報を用いて、テーブル作成用パラメータを生成
const createParams = {
AttributeDefinitions: tableInfo.Table.AttributeDefinitions,
KeySchema: tableInfo.Table.KeySchema,
ProvisionedThroughput: {
ReadCapacityUnits: tableInfo.Table.ProvisionedThroughput.ReadCapacityUnits,
WriteCapacityUnits: tableInfo.Table.ProvisionedThroughput.WriteCapacityUnits
},
TableName: tableInfo.Table.TableName
};
// create実行
await createTable(createParams);
const response = {
statusCode: 200,
};
return response;
} catch (err) {
const response = {
statusCode: 500,
err: err
}
return response;
}
};
/**
* DynamoDBの情報を取得する
* @param {*} params
*/
const getTableInfo = (params) => {
return Dynamo.describeTable(params, (err, data) => {
if (err) err;
else data;
}).promise();
};
/**
* DynamoDBを削除する
* @param {*} params
*/
const deleteTable = (params) => {
return Dynamo.deleteTable(params, (err, data) => {
if (err) err;
else data;
}).promise();
};
/**
* テーブルの削除が完了されるまで待つ
* @param {*} params
*/
const waitForDeleted = (params) => {
return Dynamo.waitFor('tableNotExists', params, (err, data) => {
if (err) err;
else data;
}).promise();
}
/**
* DynamoDBを作成する
* @param {*} params
*/
const createTable = (params) => {
return Dynamo.createTable(params, (err, data) => {
if (err) err;
else data;
}).promise();
};
説明
このコードではMusic
テーブルの削除→作成を行います。
再作成されたDynamoDBはMusic
と同じハッシュキー、スキーマ、キャパシティを持ちます。
処理内容としては下記になります。
1.テーブルの情報を取得
2.テーブル削除
3.1で取得したテーブル情報を使ってテーブル作成
またGSIも情報として取得できるので、createParams
の生成時にプロパティにセットしてあげれば、GSIも同様のものを作成することができるはずです。
ただし再作成されたテーブルはarn
が違うので、参照している他リソースを修正する必要があります。
結論
データを個々に削除する場合、scan
をする必要があります。
scan
は設定されたキャパシティーに依存するため、削除するデータ量によってはキャパシティーユニットの設定を上げる必要が出てきます。(=つまりコストが増える)
それに比べてテーブルを再作成する場合、コストは増えませんが完全に同じ設定のテーブルにはなりません。
また本番環境などでは、リスクが伴います。
その辺考えると、個人的にはTTLによる削除がいいのかなぁと思います。
ただこれも設定した時間丁度に削除はしてくれないので、要件との兼ね合いも考える必要があります。
(自分の場合、10分ほど遅れて削除されました)
それぞれの特徴を考えて、選択していきたいと思います。