

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

# Copiar tabelas do Amazon DynamoDB entre contas usando uma implementação personalizada
<a name="copy-amazon-dynamodb-tables-across-accounts-using-a-custom-implementation"></a>

*Ramkumar Ramanujam, Amazon Web Services*

## Resumo
<a name="copy-amazon-dynamodb-tables-across-accounts-using-a-custom-implementation-summary"></a>

Ao trabalhar com o Amazon DynamoDB no Amazon Web Services (AWS), um caso de uso comum é copiar ou sincronizar tabelas do DynamoDB em ambientes de desenvolvimento, teste ou preparação com os dados da tabela que estão no ambiente de produção. Como prática padrão, cada ambiente usa uma conta diferente da AWS.

O DynamoDB agora fornece suporte ao backup entre contas usando o AWS Backup. Para obter informações sobre os custos de armazenamento associados ao uso do AWS Backup, consulte os [Preços do AWS Backup](https://aws.amazon.com/backup/pricing/). Quando você usa o AWS Backup para copiar entre contas, as contas de origem e de destino devem fazer parte de uma organização do AWS Organizations. Existem outras soluções para backup e restauração entre contas usando os serviços da AWS, como o AWS Glue. O uso dessas soluções, no entanto, aumenta o espaço ocupado pelo aplicativo porque há mais serviços da AWS para implantar e manter. 

Você também pode usar o Amazon DynamoDB Streams para registrar alterações na tabela na conta de origem. Em seguida, você pode iniciar uma função do AWS Lambda e fazer as alterações correspondentes na tabela de destino na conta de destino. Mas essa solução se aplica a casos de uso nos quais as tabelas de origem e destino devem sempre ser mantidas em sincronia. Isso talvez não se aplique a ambientes de desenvolvimento, teste e preparação em que os dados são atualizados com frequência.

Esse padrão fornece etapas para implementar uma solução personalizada para copiar uma tabela do Amazon DynamoDB de uma conta para outra. Esse padrão pode ser implementado usando linguagens de programação comuns, como C\$1, Java e Python. Recomendamos usar uma linguagem compatível com um [AWS SDK](https://aws.amazon.com/tools/).

## Pré-requisitos e limitações
<a name="copy-amazon-dynamodb-tables-across-accounts-using-a-custom-implementation-prereqs"></a>

**Pré-requisitos **
+ Duas contas da AWS ativas
+ Tabelas do DynamoDB em ambas as contas
+ Conhecimento do perfil e política do AWS Identity and Access Management (IAM)
+ Informações sobre como acessar tabelas do Amazon DynamoDB usando qualquer linguagem de programação comum, como C\$1, Java ou Python

**Limitações**

Esse padrão se aplica às tabelas do DynamoDB com cerca de 2 GB ou menos. Com lógica adicional para lidar com interrupções de conexão ou sessão, controle de utilização, falhas e novas tentativas, ele pode ser usado para tabelas maiores.

A operação de verificação do DynamoDB, que lê itens da tabela de origem, pode buscar somente até 1 MB de dados em uma única chamada. Para tabelas maiores, superiores a 2 GB, essa limitação pode aumentar o tempo total para a realização de uma cópia completa.

## Arquitetura
<a name="copy-amazon-dynamodb-tables-across-accounts-using-a-custom-implementation-architecture"></a>

O diagrama apresentado a seguir ilustra a implementação personalizada entre as contas da AWS de origem e de destino. As políticas do IAM e os tokens de segurança são usados na implementação personalizada. Os dados são lidos do Amazon DynamoDB na conta de origem e gravados no DynamoDB na conta de destino.

![\[Arquitetura das contas de origem e de destino para a cópia usando a implementação personalizada.\]](http://docs.aws.amazon.com/pt_br/prescriptive-guidance/latest/patterns/images/pattern-img/ba8175be-9809-4c2e-b2d1-6b9180ed056c/images/d9d4c2c8-ff04-443f-9137-e37b8e23ccb5.png)


 

**Automação e escala**

Esse padrão se aplica às tabelas do DynamoDB com cerca de 2 GB ou menos. 

Para aplicar esse padrão a tabelas maiores, resolva os seguintes problemas:
+ Durante a operação de cópia da tabela, duas sessões ativas são mantidas usando tokens de segurança diferentes. Se a operação de cópia da tabela demorar mais do que os prazos de expiração do token, você deverá implementar uma lógica para atualizar os tokens de segurança. 
+ Se unidades de capacidade de leitura (RCUs) e unidades de capacidade de gravação (WCUs) suficientes não forem provisionadas, as leituras ou gravações na tabela de origem ou de destino poderão ser limitadas. Certifique-se de identificar e lidar com essas exceções. 
+ Lide com quaisquer outras falhas ou exceções e implemente um mecanismo de repetição para tentar novamente ou continuar do ponto no qual a operação de cópia falhou.

## Ferramentas
<a name="copy-amazon-dynamodb-tables-across-accounts-using-a-custom-implementation-tools"></a>

**Ferramentas**
+ [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html): o Amazon DynamoDB é um serviço de banco de dados NoSQL totalmente gerenciado que fornece uma performance rápida e previsível com escalabilidade integrada. 
+ As ferramentas adicionais necessárias serão diferentes com base na linguagem de programação que você escolher para a implementação. Por exemplo, se você usa C\$1, precisará do Microsoft Visual Studio e dos seguintes NuGet pacotes:
  + `AWSSDK`
  + `AWSSDK.DynamoDBv2`

**Código **

O trecho de código Python a seguir exclui e recria uma tabela do DynamoDB usando a biblioteca do Boto3.

Não use o `AWS_ACCESS_KEY_ID` e a `AWS_SECRET_ACCESS_KEY` de um usuário do IAM porque são credenciais de longo prazo que devem ser evitadas para acesso programático aos serviços da AWS. Para obter mais informações sobre as credenciais temporárias, consulte a seção *Práticas recomendadas*.

O `AWS_ACCESS_KEY_ID`, a `AWS_SECRET_ACCESS_KEY` e o `TEMPORARY_SESSION_TOKEN` usados no trecho de código a seguir são credenciais temporárias obtidas do AWS Security Token Service (AWS STS).

```
import boto3
import sys
import json

#args = input-parameters = GLOBAL_SEC_INDEXES_JSON_COLLECTION, ATTRIBUTES_JSON_COLLECTION, TARGET_DYNAMODB_NAME, TARGET_REGION, ...

#Input param: GLOBAL_SEC_INDEXES_JSON_COLLECTION
#[{"IndexName":"Test-index","KeySchema":[{"AttributeName":"AppId","KeyType":"HASH"},{"AttributeName":"AppType","KeyType":"RANGE"}],"Projection":{"ProjectionType":"INCLUDE","NonKeyAttributes":["PK","SK","OwnerName","AppVersion"]}}]

#Input param: ATTRIBUTES_JSON_COLLECTION
#[{"AttributeName":"PK","AttributeType":"S"},{"AttributeName":"SK","AttributeType":"S"},{"AttributeName":"AppId","AttributeType":"S"},{"AttributeName":"AppType","AttributeType":"N"}]

region = args['TARGET_REGION']
target_ddb_name = args['TARGET_DYNAMODB_NAME']

global_secondary_indexes = json.loads(args['GLOBAL_SEC_INDEXES_JSON_COLLECTION'])
attribute_definitions = json.loads(args['ATTRIBUTES_JSON_COLLECTION'])

# Drop and create target DynamoDB table
dynamodb_client = boto3.Session(
        aws_access_key_id=args['AWS_ACCESS_KEY_ID'],
        aws_secret_access_key=args['AWS_SECRET_ACCESS_KEY'],
        aws_session_token=args['TEMPORARY_SESSION_TOKEN'],
    ).client('dynamodb')
    
# Delete table
print('Deleting table: ' + target_ddb_name + ' ...')

try:
    dynamodb_client.delete_table(TableName=target_ddb_name)

    #Wait for table deletion to complete
    waiter = dynamodb_client.get_waiter('table_not_exists')
    waiter.wait(TableName=target_ddb_name)
    print('Table deleted.')
except dynamodb_client.exceptions.ResourceNotFoundException:
    print('Table already deleted / does not exist.')
    pass

print('Creating table: ' + target_ddb_name + ' ...')

table = dynamodb_client.create_table(
    TableName=target_ddb_name,
    KeySchema=[
        {
            'AttributeName': 'PK',
            'KeyType': 'HASH'  # Partition key
        },
        {
            'AttributeName': 'SK',
            'KeyType': 'RANGE'  # Sort key
        }
    ],
    AttributeDefinitions=attribute_definitions,
    GlobalSecondaryIndexes=global_secondary_indexes,
    BillingMode='PAY_PER_REQUEST'
)
    
waiter = dynamodb_client.get_waiter('table_exists')
waiter.wait(TableName=target_ddb_name)
    
print('Table created.')
```

## Práticas recomendadas
<a name="copy-amazon-dynamodb-tables-across-accounts-using-a-custom-implementation-best-practices"></a>

**Credenciais temporárias**

Como prática recomendada de segurança, ao acessar serviços da AWS programaticamente, evite usar `AWS_ACCESS_KEY_ID` e o `AWS_SECRET_ACCESS_KEY` de um usuário do IAM, pois são credenciais de longo prazo. Sempre tente usar credenciais temporárias para acessar os serviços da AWS de forma programática.

Por exemplo, um desenvolvedor codifica o `AWS_ACCESS_KEY_ID` e a `AWS_SECRET_ACCESS_KEY` de um usuário do IAM no aplicativo durante o desenvolvimento, mas não consegue remover os valores codificados antes de enviar as alterações para o repositório de códigos. Essas credenciais expostas podem ser usadas por usuários mal-intencionados ou maliciosos, o que pode ter sérias implicações (principalmente se as credenciais expostas tiverem privilégios de administrador). Essas credenciais expostas devem ser desativadas ou excluídas imediatamente usando o console do IAM ou a AWS Command Line Interface (AWS CLI).

Sempre tente usar credenciais temporárias para acessar os serviços da AWS de forma programática. As credenciais temporárias são válidas somente pelo tempo especificado (de 15 minutos a 36 horas). A duração máxima permitida de credenciais temporárias varia de acordo com fatores como configurações de função e encadeamento de funções. Para obter mais informações sobre a AWS STS, consulte a [documentação](https://docs.aws.amazon.com/STS/latest/APIReference/welcome.html).

## Épicos
<a name="copy-amazon-dynamodb-tables-across-accounts-using-a-custom-implementation-epics"></a>

### Configurar tabelas do DynamoDB
<a name="set-up-dynamodb-tables"></a>


| Tarefa | Description | Habilidades necessárias | 
| --- | --- | --- | 
| Crie uma tabela do DynamoDB. | Crie tabelas do DynamoDB, com índices, nas contas de origem e de destino da AWS.Defina o provisionamento de capacidade como modo sob demanda, o que permite que o DynamoDB read/write escale as capacidades dinamicamente com base na carga de trabalho. Como alternativa, você pode usar a capacidade provisionada com 4000 RCUs e 4000. WCUs | Desenvolvedor de aplicativos, DBA, engenheiro de migração | 
| Preencha a tabela de origem. | Preencha a tabela do DynamoDB na conta de origem com dados de teste. Ter pelo menos 50 MB ou mais de dados de teste ajuda você a ver o pico e a média RCUs consumidos durante a cópia da tabela. Em seguida, você pode alterar o provisionamento de capacidade conforme necessário. | Desenvolvedor de aplicativos, DBA, engenheiro de migração | 

### Configurar credenciais para acessar as tabelas do DynamoDB
<a name="set-up-credentials-to-access-the-dynamodb-tables"></a>


| Tarefa | Description | Habilidades necessárias | 
| --- | --- | --- | 
| Crie perfis do IAM para acessar as tabelas de origem e destino do DynamoDB. | Crie um perfil do IAM na conta de origem com permissões para acessar (ler) a tabela do DynamoDB na conta de origem.Adicione a conta de origem como uma entidade confiável para esse perfil.Crie um perfil do IAM na conta de destino com permissões para acessar (criar, ler, atualizar, excluir) a tabela do DynamoDB na conta de destino.  Adicione a conta de destino como uma entidade confiável para esse perfil. | Desenvolvedor de aplicativos, AWS DevOps | 

### Copiar dados da tabela de uma conta para outra
<a name="copy-table-data-from-one-account-to-another"></a>


| Tarefa | Description | Habilidades necessárias | 
| --- | --- | --- | 
| Obtenha credenciais temporárias para os perfis do IAM. | Obtenha credenciais temporárias para o perfil do IAM criado na conta de origem.Obtenha credenciais temporárias para o perfil do IAM criado na conta de destino.Uma forma de obter as credenciais temporárias para o perfil do IAM é usar o AWS STS da AWS CLI.<pre>aws sts assume-role --role-arn arn:aws:iam::<account-id>:role/<role-name> --role-session-name <session-name> --profile <profile-name></pre>Use o perfil apropriado da AWS (correspondente à conta de origem ou de destino).Para obter mais informações sobre as credenciais de segurança temporárias, consulte:[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/prescriptive-guidance/latest/patterns/copy-amazon-dynamodb-tables-across-accounts-using-a-custom-implementation.html) | Desenvolvedor de aplicativos, engenheiro de migração | 
| Inicialize os clientes DynamoDB para acesso ao DynamoDB de origem e de destino. | Inicialize os clientes DynamoDB, que são fornecidos pelo AWS SDK, para as tabelas de origem e de destino do DynamoDB.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/prescriptive-guidance/latest/patterns/copy-amazon-dynamodb-tables-across-accounts-using-a-custom-implementation.html)Para obter mais informações sobre como fazer solicitações usando credenciais temporárias do IAM, consulte a [documentação da AWS](https://docs.aws.amazon.com/AmazonS3/latest/userguide/AuthUsingTempSessionToken.html). | Desenvolvedor de aplicativos | 
| Solte e recrie a tabela de destino. | Exclua e recrie a tabela do DynamoDB de destino (junto com os índices) na conta de destino usando o cliente DynamoDB da conta de destino.Excluir todos os registros de uma tabela do DynamoDB é uma operação cara porque consome provisionados. WCUs Excluir e recriar a tabela evita esses custos extras.Você pode adicionar índices a uma tabela depois de criá-la, mas isso leva de dois a cinco minutos a mais. Criar índices durante a criação da tabela, transferindo a coleção de índices para a chamada `createTable`, é mais eficiente. | Desenvolvedor de aplicativos | 
| Execute a cópia da tabela. | Repita as etapas a seguir até que todos os dados sejam copiados:[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/prescriptive-guidance/latest/patterns/copy-amazon-dynamodb-tables-across-accounts-using-a-custom-implementation.html)Para obter mais informações, consulte a implementação de referência em C\$1 (para eliminar, criar e preencher tabelas) na seção *Anexos*. Um exemplo de arquivo de notação de JavaScript objeto de configuração de tabela (JSON) também está anexado. | Desenvolvedor de aplicativos | 

## Recursos relacionados
<a name="copy-amazon-dynamodb-tables-across-accounts-using-a-custom-implementation-resources"></a>
+ [Documentação do Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html)
+ [Criação de um usuário do IAM na sua conta da AWS](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_create.html)
+ [AWS SDKs](https://aws.amazon.com/tools/)
+ [Uso de credenciais temporárias com recursos da AWS](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_use-resources.html)

## Mais informações
<a name="copy-amazon-dynamodb-tables-across-accounts-using-a-custom-implementation-additional"></a>

Esse padrão foi implementado usando C\$1 para copiar uma tabela do DynamoDB com 200.000 itens (tamanho médio do item de 5 KB e tamanho da tabela de 250 MB). A tabela de destino do DynamoDB foi configurada com capacidade provisionada de 4000 e 4000. RCUs WCUs

A operação completa de cópia da tabela (da conta de origem para a conta de destino), incluindo a remoção e a recriação da tabela, levou cinco minutos. Total de unidades de capacidade consumidas: 30.000 RCUs e aproximadamente WCUs 400.000.

Para obter mais informações sobre os modos de capacidade do DynamoDB, consulte [Modo de capacidade de leitura/gravação](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.ReadWriteCapacityMode.html) na documentação da AWS.

## Anexos
<a name="attachments-ba8175be-9809-4c2e-b2d1-6b9180ed056c"></a>

Para acessar o conteúdo adicional associado a este documento, descompacte o seguinte arquivo: [ attachment.zip](samples/p-attach/ba8175be-9809-4c2e-b2d1-6b9180ed056c/attachments/attachment.zip)