Как я могу восстановить резервную копию DynamoDB в локальный экземпляр / контейнер DynamoDB?

Я сделал резервную копию таблицы DynamoDB в консоли AWS. Мне удалось загрузить файл локально. Я хотел бы взять этот файл и импортировать его в локальный экземпляр Dynamodb для тестирования. У меня достаточно далеко, чтобы создать таблицу, однако формат json для резервного копирования, похоже, не очень хорошо сочетается с API-интерфейсами .NET AWS SDK (это много TLA).

Пример содержимого резервной копии:

{"Item":{"Attributes":{"M":{"createdAt":{"N":"1611923095468"},"eventDate":{"S":"2021-01-30T17:00:00.000Z"} }},"PartitionKey":{"S":"1234"},"SortKey":{"S":"1"}}}
{"Item":{"Attributes":{"M":{"createdAt":{"N":"1611923095468"},"eventDate":{"S":"2021-01-30T17:00:00.000Z"} }},"PartitionKey":{"S":"1234"},"SortKey":{"S":"2"}}}

API-интерфейсы .NET, похоже, хотят преобразовать JSON в формат атрибутов, отличных от Dynamodb, поэтому ожидайте этого:

{
    "Item": {
        "Attributes": {
            "createdAt": "1611923095468",
            "eventDate": "2021-01-30T17:00:00.000Z"
        },
        "PartitionKey": "1234",
        "SortKey": "1"
    }
}

Итак, я хотел бы сделать что-то вроде:

var json = "{}"; // ORIGINAL CONCATENATED JSON FROM ABOVE 
Document.FromJson(json)

Есть ли какой-то API, который мне не хватает, который может преобразовать это в какой-то формат, который я могу загрузить в Dynamodb? Опять же, с использованием .NET, но для этого открыт для любых инструментов / утилит.


person brendonparker    schedule 12.02.2021    source источник
comment
Мне пришло в голову, что SDK JavaScript может больше подходить для этой структуры данных. Я попробую.   -  person brendonparker    schedule 12.02.2021


Ответы (1)


Это сценарий js, который я придумал. Казалось, трюк сработал:

var DDB = require("@aws-sdk/client-dynamodb");
var fs = require('fs');
const ddb = new DDB.DynamoDB({ region: 'local', endpoint: 'http://localhost:8000' });

(async function test() {
    const text = fs.readFileSync('./bmorer2e5e3pfflf7qmuhhnpwy.json', 'utf8');

    text.toString().split('\n').map(async (line) => {
        if (line) await saveLine(line)
    });
})();

async function saveLine(line) {
    let item = JSON.parse(line);
    item.TableName = 'TABLE_NAME';
    item.ReturnConsumedCapacity = 'TOTAL';

    const res = await ddb.putItem(item);
    console.log(res.ConsumedCapacity);
}

person brendonparker    schedule 12.02.2021