Экспорт данных из 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). Подход аналогичен:
- Построить конвейер для вывода
- Загрузите файл.
- Разобрать его с помощью специального ридера.
Экспортируйте его из интерфейса 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/