LoginSignup
7

More than 5 years have passed since last update.

DynamoDBの全データ削除について

Last updated at Posted at 2018-09-08

書くこと

DynamoDBは仕様上、全てのデータを削除するAPIが提供されていません。
そのため全てのデータを削除したい場合

要件に応じて、この中から選択する形になると思います。
このうち今回は、テーブルを削除し、再作成するについて記載したいと思います。
Node.jsで書かれたものが見つからなかったので、実装してみました。

実装

動作環境: Lambda(Node.js 8.10)
git: URL

refleshDynamoDB.js
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分ほど遅れて削除されました)

それぞれの特徴を考えて、選択していきたいと思います。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7