将dynamoDB表复制到另一个没有S3的aws帐户

时间:2017-04-25 10:04:05

标签: copy amazon-dynamodb

我想将所有dynamoDB表复制到另一个没有s3的aws帐户来保存数据。我看到了使用数据管道复制表的解决方案,但所有都使用s3来保存数据。我想跳过s3步骤,因为该表包含大量数据,因此s3写入和s3读取过程可能需要一些时间。所以我需要直接将表从一个帐户复制到另一个帐户。

7 个答案:

答案 0 :(得分:23)

如果你不介意使用Python,并添加boto3库(sudo python -m pip install boto3),那么我会这样做(我假设你知道如何填写键,区域和表名)代码分别):

import boto3
import os

dynamoclient = boto3.client('dynamodb', region_name='eu-west-1',
    aws_access_key_id='ACCESS_KEY_SOURCE',
    aws_secret_access_key='SECRET_KEY_SOURCE')

dynamotargetclient = boto3.client('dynamodb', region_name='us-west-1',
    aws_access_key_id='ACCESS_KEY_TARGET',
    aws_secret_access_key='SECRET_KEY_TARGET')

dynamopaginator = dynamoclient.get_paginator('scan')
tabname='SOURCE_TABLE_NAME'
targettabname='TARGET_TABLE_NAME'
dynamoresponse = dynamopaginator.paginate(
    TableName=tabname,
    Select='ALL_ATTRIBUTES',
    ReturnConsumedCapacity='NONE',
    ConsistentRead=True
)
for page in dynamoresponse:
    for item in page['Items']:
        dynamotargetclient.put_item(
            TableName=targettabname,
            Item=item
        )

答案 1 :(得分:9)

试试这个<form> <text-input-comp [directiveName]="mydirective" ></text-input-comp> <text-input-comp></text-input-comp> <text-input-comp></text-input-comp> </form> module

nodejs

答案 2 :(得分:5)

使用boto对Amazon DynamoDB进行简单的备份和还原

https://github.com/bchew/dynamodump

可以执行以下操作:

  • 单表备份/还原
  • 多表备份/还原
  • 多个表的备份/还原,但在不同的环境之间(例如Production- *表到Development- *表)
  • 备份所有表并仅还原数据(不会删除和重新创建架构)
  • 转储所有表模式并创建模式(例如,在其他AWS账户中创建空白表)
  • 基于AWS标签key = value备份所有表
  • 基于AWS标记备份所有表,压缩并存储在指定的S3存储桶中。
  • 从S3存储桶还原到指定的目标表

答案 3 :(得分:2)

读取和写入S3不会成为你的瓶颈。

虽然从Dynamo扫描的速度非常快,但将项目写入目标表的速度会很慢。每个分区每秒最多只能写入1000个项目。所以,我不担心中间S3存储。

但是,数据管道也不是将表复制到另一个表的最有效方法。

如果您需要快速转型,那么最好的办法就是实施自己的解决方案。根据所需的传输吞吐量配置目标表(但要注意不需要的分区拆分),然后使用多个线程写入并行扫描,这也会写入目标表。

Java中有一个开源实现,您可以将其用作AWS实验室存储库中的起点。

https://github.com/awslabs/dynamodb-cross-region-library

答案 4 :(得分:1)

您可以使用deepcopy和dynamodb_json:

import boto3
import json
from dynamodb_json import json_util as djson 
from copy import deepcopy
REGION = 'eu-west-1'

# init your sessions to the different accounts (session_a and session_b)   

dynamo_a = session_a.client('dynamodb', region_name=REGION)
dynamo_b = session_b.resource('dynamodb', region_name=REGION)

table = dynamo_b.Table('abc')
result_data = table.scan()
result_item = []
result_item.extend(result_data['Items'])
while 'LastEvaluatedKey' in result_data:
    result_data = my_table.scan(
        FilterExpression=filter_expression,
        ExclusiveStartKey=result_data['LastEvaluatedKey']
    )

    result_item.extend(result_data['Items'])

translated_items = []
for r in result_item:
    updated_item = deepcopy(r)
    translated_items.append(updated_item)

for r in translated_items:
    item = json.loads(djson.dumps(r))
    dynamo_a.put_item(TableName='def', Item=item)

答案 5 :(得分:0)

您可以使用DynamoDb Streams和Lambda来实现此目的。 http://searchaws.techtarget.com/tip/DynamoDB-Streams-keep-database-tables-in-sync

答案 6 :(得分:0)

S3绝对不是瓶颈。我几乎会争辩说,对于99%的用例,您应该使用Data Pipeline + S3来完成,这是AWS推荐的最佳实践。 我在这里提供了更详细的答案:https://stackoverflow.com/a/57465721/126382

真正的问题是,您是否组织其他系统和实时读取/写入数据的客户端来进行迁移,而不会导致停机。如果这是您对任务计时的最大担忧-那么您想设计一种定制解决方案,该解决方案将确保所有写入到两个帐户中的两个DDB表中,并在最终切换写入该数据的客户端之前,将读取数据的客户端切换到目标DDB表中。数据。也可以将此迁移计划的其他风味结合在一起。