Экспорт данных из DynamoDB

Можно ли экспортировать данные из таблицы DynamoDB в каком-либо формате?

Конкретный вариант использования заключается в том, что я хочу экспортировать данные из моей производственной базы данных DynamodB и импортировать эти данные в мой локальный экземпляр DynamodB, чтобы мое приложение могло работать с локальной копией данных вместо производственных данных.

Я использую ссылку в качестве локального экземпляра DynamoDB.

22 ответа

Это экспортирует все элементы как документы jsons

aws dynamodb scan --table-name TABLE_NAME > export.json

Вот способ экспортировать некоторые данные (часто мы просто хотим получить образец наших данных prod локально) из таблицы, используя aws cli и jq. Давайте предположим, что у нас есть таблица производительности, которая называется неудивительно my-prod-table и локальная таблица называется my-local-table

Для экспорта данных выполните следующее:

aws dynamodb scan --table-name my-prod-table \
| jq '{"my-local-table": [.Items[] | {PutRequest: {Item: .}}]}' > data.json

По сути, мы сканируем таблицу prod, преобразовываем выходные данные сканирования в формат batchWriteItem и выгружаем результат в файл.

Чтобы импортировать данные в локальную таблицу, выполните:

aws dynamodb batch-write-item \
--request-items file://data.json \
--endpoint-url http://localhost:8000

Примечание: есть некоторые ограничения batch-write-item запрос - операция BatchWriteItem может содержать до 25 отдельных запросов PutItem и DeleteItem и может записывать до 16 МБ данных. (Максимальный размер отдельного элемента составляет 400 КБ.).

Существует инструмент с именем DynamoDBtoCSV

это может быть использовано для экспорта всех данных в файл CSV. Однако для обратного вам придется создать собственный инструмент. Я предлагаю добавить эту функциональность в инструмент и добавить ее в репозиторий Git.


Другой способ - использовать AWS Data Pipeline для этой задачи (вы сэкономите все расходы на чтение данных вне инфраструктуры AWS). Подход аналогичен:

  1. Построить конвейер для вывода
  2. Загрузите файл.
  3. Разобрать его с помощью специального ридера.

Экспортируйте его из интерфейса DynamoDB в S3.

Затем преобразуйте его в Json, используя sed:

sed -e 's/$/}/' -e $'s/\x02/,"/g' -e $'s/\x03/":/g' -e 's/^/{"/' <exported_table> > <exported_table>.json

Источник

Я расширяю решение Valy Dia, чтобы разрешить весь процесс экспорта с помощью только aws-cli | jq

aws dynamodb scan --max-items 3 --table-name <TABLE_NAME> \
| jq '{"<TABLE_NAME>": [.Items[] | {PutRequest: {Item: .}}]}' > data.json

aws dynamodb describe-table --table-name <TABLE_NAME> > describe.json | jq ' .Table | {"TableName": .TableName, "KeySchema": .KeySchema, "AttributeDefinitions": .AttributeDefinitions,  "ProvisionedThroughput": {
      "ReadCapacityUnits": 5,
      "WriteCapacityUnits": 5
}}' > table-definition.json

aws dynamodb create-table --cli-input-json file://table-definition.json  --endpoint-url http://localhost:8000 --region us-east-1

aws dynamodb batch-write-item --request-items file://data.json --endpoint-url http://localhost:8000

aws dynamodb scan --table-name <TABLE_NAME> --endpoint-url http://localhost:8000

Я думаю, что мой ответ больше похож на Ивайло Бардарова, если вы планируете запускать это из экземпляра Linux, запустите это

1. Войдите в свою учетную запись AWS и перейдите в IAM, чтобы создать пользователя с ограниченной политикой для роли (конечно, в целях безопасности). Это должно быть ограничено только чтением таблицы Dynamodb, которую вы хотите сделать резервную копию.

2. Скопируйте ключ доступа и секрет и обновите команду ниже, чтобы запустить ее в Linux (но убедитесь, что ваша таблица не огромна и, возможно, создает проблему с пространством для окна, на котором вы это запускаете)

AWS_ACCESS_KEY_ID='put_your_key' AWS_SECRET_ACCESS_KEY='put_your_secret' aws --region='put_your_region' dynamodb scan --table-name 'your_table_name'>> export_$(date "+%F-%T").json

Обратите внимание, что аналогичная команда может быть выполнена в Windows/Powershell, которую я не тестировал, поэтому я не добавляю ее здесь.

Я нашел лучший текущий инструмент для простого импорта / экспорта (включая циклическое переключение через DynamoDB Local) - это скрипт Python:

https://github.com/bchew/dynamodump

Этот скрипт поддерживает экспорт / импорт схемы, а также импорт / экспорт данных. Он также использует пакетные API для эффективной работы.

Я успешно использовал его для переноса данных из таблицы DynamoDB в локальную DynamoDB для целей разработки, и она отлично работала для моих нужд.

Расширяя Ivailo Bardarov, я написал следующий сценарий, дублирующий таблицы, которые находятся в удаленной DynamoDB, в локальную:

#!/bin/bash
declare -a arr=("table1" "table2" "table3" "table4")
for i in "${arr[@]}"
do
    TABLE=$i
    maxItems=25
    index=0
    echo "Getting table description of $TABLE from remote database..."
    aws dynamodb describe-table --table-name $TABLE > table-description.json
    echo
    echo "Creating table $TABLE in the local database..."
    ATTRIBUTE_DEFINITIONS=$(jq .Table.AttributeDefinitions table-description.json)
    KEY_SCHEMA=$(jq .Table.KeySchema table-description.json)
    BILLING_MODE=$(jq .Table.BillingModeSummary.BillingMode table-description.json)
    READ_CAPACITY_UNITS=$(jq .Table.ProvisionedThroughput.ReadCapacityUnits table-description.json)
    WRITE_CAPACITY_UNITS=$(jq .Table.ProvisionedThroughput.WriteCapacityUnits table-description.json)
    TABLE_DEFINITION=""

    if [[ "$READ_CAPACITY_UNITS" > 0 && "$WRITE_CAPACITY_UNITS" > 0 ]]
    then
    TABLE_DEFINITION="{\"AttributeDefinitions\":$ATTRIBUTE_DEFINITIONS,\"TableName\":\"$TABLE\",\"KeySchema\":$KEY_SCHEMA,\"ProvisionedThroughput\":{\"ReadCapacityUnits\":$READ_CAPACITY_UNITS,\"WriteCapacityUnits\":$WRITE_CAPACITY_UNITS}}"
    else
    TABLE_DEFINITION="{\"AttributeDefinitions\":$ATTRIBUTE_DEFINITIONS,\"TableName\":\"$TABLE\",\"KeySchema\":$KEY_SCHEMA,\"BillingMode\":$BILLING_MODE}"
    fi

    echo $TABLE_DEFINITION > create-table.json
    aws dynamodb create-table --cli-input-json file://create-table.json --endpoint-url http://localhost:8000
    echo "Querying table $TABLE from remote..."
    DATA=$(aws dynamodb scan --table-name $TABLE --max-items $maxItems)
    ((index+=1))
    echo "Saving remote table [$TABLE] contents to inserts.json file..."
    echo $DATA | jq ".Items | {\"$TABLE\": [{\"PutRequest\": { \"Item\": .[]}}]}" > inserts.json
    echo "Inserting rows to $TABLE in local database..."
    aws dynamodb batch-write-item --request-items file://inserts.json --endpoint-url http://localhost:8000

    nextToken=$(echo $DATA | jq '.NextToken')        
    while [[ "$nextToken" != "" && "$nextToken" != "null" ]]
    do
      echo "Querying table $TABLE from remote..."
      DATA=$(aws dynamodb scan --table-name $TABLE --max-items $maxItems --starting-token $nextToken)
      ((index+=1))
      echo "Saving remote table [$TABLE] contents to inserts.json file..."
      echo $DATA | jq ".Items | {\"$TABLE\": [{\"PutRequest\": { \"Item\": .[]}}]}" > inserts.json
      echo "Inserting rows to $TABLE in local database..."
      aws dynamodb batch-write-item --request-items file://inserts.json --endpoint-url http://localhost:8000
      nextToken=$(echo "$DATA" | jq '.NextToken')
    done
done

echo "Deleting temporary files..."
rm -f table-description.json
rm -f create-table.json
rm -f inserts.json

echo "Database sync complete!"

Этот сценарий перебирает массив строк и для каждого имени таблицы сначала получает описание таблицы, создает файл JSON с минимально необходимыми параметрами и создает таблицу. Затем он использует остальную часть Ivailo Bardarov для создания вставок и помещает их в созданную таблицу. Наконец, он очищает сгенерированные файлы JSON.

Имейте в виду, моей целью было просто создать грубую копию (следовательно, минимальные необходимые параметры) таблиц для целей разработки.

Попробуйте мой простой скрипт динамо-архива node.js. Он экспортирует и импортирует в формате JSON.

В веб-консоли DynamoDB выберите свою таблицу, а затем Действия -> Экспорт / Импорт.

Для тех из вас, кто предпочел бы сделать это с помощью Java, есть DynamodbToCSV4j.

JSONObject config = new JSONObject();
config.put("accessKeyId","REPLACE");
config.put("secretAccessKey","REPLACE");
config.put("region","eu-west-1");
config.put("tableName","testtable");
d2csv d = new d2csv(config);

Я создал служебный класс, чтобы помочь разработчикам в экспорте. Это можно использовать, если вы не хотите использовать функцию конвейера данных AWS. Ссылка на git hub repo есть - здесь

На основе ответа @IvailoBardarov в сочетании с ответом @JorgeTovar:

Сценарий оболочки, который извлекает данные из удаленной DynamoDB и импортирует их в локальную DynamoDB.

Дополнительные возможности:

  • создайте локальную таблицу!
  • поддержка «AWS NoSql Workbench»
      # REMOTE - SOURCE OF DATA
TABLE=<TABLE_NAME>
PROFILE=<AWS_PROFILE>
REGION=us-east-1

# LOCAL - TARGET OF DATA
export AWS_ACCESS_KEY_ID=d7ac2v # Align the credentials with those that appears in NoSql Workbench
export AWS_SECRET_ACCESS_KEY=4d0x6t

maxItems=25
index=0

# Create Local Table
aws dynamodb --profile $PROFILE --region $REGION describe-table --table-name $TABLE | jq ' .Table | {"TableName": .TableName, "KeySchema": .KeySchema, "AttributeDefinitions": .AttributeDefinitions,  "GlobalSecondaryIndexes": .GlobalSecondaryIndexes | map({"IndexName": .IndexName, "KeySchema": .KeySchema, "Projection": .Projection, "ProvisionedThroughput": {"ReadCapacityUnits": 5, "WriteCapacityUnits": 5}}), "ProvisionedThroughput": {"ReadCapacityUnits": 5, "WriteCapacityUnits": 5}}' > table-definition.json
aws dynamodb create-table --cli-input-json file://table-definition.json  --endpoint-url http://localhost:8000 --region localhost

# Import data 
DATA=$(aws dynamodb --profile $PROFILE --region $REGION scan --table-name $TABLE --max-items $maxItems)
((index+=1)) 
echo $DATA | jq ".Items | {\"$TABLE\": [{\"PutRequest\": { \"Item\": .[]}}]}" > inserts.jsons
aws dynamodb batch-write-item --request-items file://inserts.jsons --endpoint-url http://localhost:8000 --region localhost


nextToken=$(echo $DATA | jq '.NextToken')
while [[ "${nextToken}" != "" ]]
do
  DATA=$(aws dynamodb scan --profile $PROFILE --region $REGION --table-name $TABLE --max-items $maxItems --starting-token $nextToken)
  ((index+=1))
  echo $DATA | jq ".Items | {\"$TABLE\": [{\"PutRequest\": { \"Item\": .[]}}]}" > inserts.jsons
  aws dynamodb batch-write-item --request-items file://inserts.jsons --endpoint-url http://localhost:8000 --region localhost
  nextToken=$(echo $DATA | jq '.NextToken')
done

Экспортируйте данные DynamoDb в файл json на локальном компьютере с помощью интерфейса командной строки AWS. Ниже пример с фильтрами:

aws dynamodb scan --table-name activities --filter-expression "Flag = :val" --expression-attribute-values "{\":val\": {\"S\": \"F\"}}" --select "SPECIFIC_ATTRIBUTES" --projection-expression "Status" > activitiesRecords.json

DynamoDB теперь имеет встроенную функцию экспорта в S3 (в форматах JSON и Amazon Ion) https://aws.amazon.com/blogs/aws/new-export-amazon-dynamodb-table-data-to-data-lake-amazon-s3/

Вы можете попробовать этот код локально. Но сначала должна быть выполнена следующая команда npm init -y && npm install aws-sdk

      const AWS = require('aws-sdk');
AWS.config.update({region:'eu-central-1'}); 
const fs = require('fs');
const TABLE_NAME = "YOURTABLENAME"

const docClient = new AWS.DynamoDB.DocumentClient({
    "sslEnabled": false,
    "paramValidation": false,
    "convertResponseTypes": false,
    "convertEmptyValues": true
});

async function exportDB(){
    let params = {
        TableName: TABLE_NAME
    };
    let result = [];
    let items;
    do  {
        items =  await docClient.scan(params).promise();
        items.Items.forEach((item) => result.push(item));
        params.ExclusiveStartKey  = items.LastEvaluatedKey;
    }   while(typeof items.LastEvaluatedKey != "undefined");

    await fs.writeFileSync("exported_data.json", JSON.stringify(result,null, 4)); 
    console.info("Available count size:", result.length);
}
exportDB();

И беги node index.js

Я надеюсь это сработает для тебя

Вы используете dynoport https://www.npmjs.com/package/dynoport , он сделает это за вас с очень высокой производительностью экспорта и импорта.

Для действительно больших наборов данных выполнение непрерывного (и параллельного) сканирования может быть трудоемким и хрупким процессом (представьте, что он умирает в середине). К счастью, AWS недавно добавила возможность экспортировать данные таблицы DynamoDB прямо в S3. Это, вероятно, самый простой способ добиться того, чего вы хотели, потому что он не требует написания кода и запуска какой-либо задачи / скрипта, потому что он полностью управляем.

После этого вы можете загрузить его с S3 и импортировать в локальный экземпляр DynamoDB, используя такую ​​логику, как foreach record in file: documentClient.putItemили воспользуйтесь другими инструментами .

Я использовал отличный сайт cyberchef... https://gchq.github.io/CyberChef

С csv to json инструмент.

Если вам нужно, вы можете конвертировать данные Динамо в JSON с помощью этого https://2json.net/dynamo

В аналогичном сценарии использования я использовал потоки DynamoDB для запуска AWS Lambda, который в основном записывал в мой экземпляр DW. Возможно, вы могли бы написать свою лямбду, чтобы записать каждое из изменений таблицы в таблицу в вашем непроизводственном аккаунте. Таким образом, ваш стол Devo также останется достаточно близко к Prod.

Dynamo DB теперь предоставляет возможность экспортировать и импортировать данные в / из S3 http://aws.amazon.com/about-aws/whats-new/2014/03/06/announcing-dynamodb-cross-region-export-import/

Другие вопросы по тегам