出口| 仅使用 AWS CLI 导入 DynamoDB

air*_*ata 9 amazon-dynamodb aws-cli

我的目标是拥有一个简单的工具,可以仅通过aws cli或更少的第三方将 dynamodb 导出到本地文件(json/csv)。我的表大小约为 500mb。

我正在进行几天的研究,我看到了非常好的项目,例如dynamodump另一个 SDK 实现。我还测试了Datapipeline来自亚马逊的,但对于我目标的任务想要简单的aws cli.

假设我已经有表的映射,例如索引和属性。现在我只想导入我拥有的项目。对我来说,最好的实施解决方案是这样的:

  1. 将表从 aws 导出到本地文件: aws dynamodb scan --table-name SOMETABLENAME --output json | jq '.Items[]' > SOMETABLENAME.json

  2. sed使用、jqawk...等内容渲染文件。要获得可以导入到 aws-dynamodb 的正确 json 格式

  3. 使用以下命令将项目从 SOMETABLENAME 导入到 aws-dynamodb:

    aws dynamodb put-item --table-name SOMETABLENAME --item file://SOMETABLENAME.json

小智 17

您可以使用 aws dynamodb scan 导出数据。

aws dynamodb scan --table-name table_name --region aws_region_name --max-items max_items --output json > ./export.json
Run Code Online (Sandbox Code Playgroud)

但是,DynamoDB 对单个请求中检索的数据量有 1MB 的限制。如果扫描达到 1MB 限制,它将在响应中返回“NextToken”键。

您需要使用NextToken再次扫描,直到所有数据都导出。

aws dynamodb scan --table-name table_name --region aws_region_name --max-items max_items --starting-token nextToken --output json > ./export2.json
Run Code Online (Sandbox Code Playgroud)

关于导入,BatchWriteItem 最多可以写入 16 MB 或 25 个放置或删除请求。您可以将 max_items 设置为 25 或使用 jq 拆分它。

您可以通过 jq 将 json 转换为 BatchWriteItem cli。

cat filepath | jq "{\"table_name\": [.Items[] | {PutRequest: {Item: .}}]}" > BatchWriteItem.txt
Run Code Online (Sandbox Code Playgroud)

最后,您可以使用cmd将其插入到dynamodb中。

aws dynamodb batch-write-item --request-items file://filepath
Run Code Online (Sandbox Code Playgroud)

如果数据量很大,最好用shell脚本来做。更多详细信息: https://github.com/mickey2012ex/dynamodb-data-migrator

如果区域受支持,最好的解决方案是 AWS Data Pipeline


els*_*syr 1

DynamoDB 发布了一项新功能,可将数据导出到 S3 存储桶。它是一个原生的、无服务器的解决方案,可以根据您的需要通过 CLI 使用 - 请参阅:

https://docs.aws.amazon.com/cli/latest/reference/dynamodb/export-table-to-point-in-time.html

这将帮助您在没有中间扫描的情况下实现#1,但不幸的是,截至 2020 年 11 月,没有本地导入功能可以将其导入新表。

如果您感兴趣的只是将数据从一个表获取到另一个表,您可以使用 PiTR:

https://docs.aws.amazon.com/cli/latest/reference/dynamodb/restore-table-to-point-in-time.html