Copiar tabelas do Amazon DynamoDB entre contas usando uma implementação personalizada - Recomendações da AWS

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

Criado por Ramkumar Ramanujam () AWS

Ambiente: produção

Origem: Amazon DynamoDB

Destino: Amazon DynamoDB

Tipo R: N/A

Workload: todas as outras workloads

Tecnologias: bancos de dados

AWSserviços: Amazon DynamoDB

Resumo

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 AWS conta diferente.

O DynamoDB agora oferece suporte ao backup entre contas usando o Backup. AWS Para obter informações sobre os custos de armazenamento associados ao uso do AWS Backup, consulte Preços de AWS backup. Quando você usa o AWS Backup para copiar entre contas, as contas de origem e de destino devem fazer parte de uma organização da AWS Organizations. Existem outras soluções para backup e restauração entre contas usando AWS serviços como o AWS Glue. O uso dessas soluções, no entanto, aumenta o espaço ocupado pelo aplicativo, porque há mais AWS serviços 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 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#, Java e Python. Recomendamos usar uma linguagem que seja compatível com um AWSSDK.

Pré-requisitos e limitações

Pré-requisitos

  • Duas AWS contas ativas

  • Tabelas do DynamoDB em ambas as contas

  • Conhecimento das funções e políticas 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#, 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

O diagrama a seguir mostra a implementação personalizada entre as AWS contas de origem e de destino. IAMpolíticas e tokens de segurança são usados com a implementação personalizada. Os dados são lidos do Amazon DynamoDB na conta de origem e gravados no DynamoDB na conta de destino.

Arquitetura da conta de origem e destino para cópia usando a implementação personalizada.

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

Ferramentas

  • Amazon DynamoDB — O Amazon DynamoDB é um serviço SQL sem banco de dados totalmente gerenciado que fornece desempenho rápido e previsível com escalabilidade perfeita. 

  • 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#, 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 AWS_SECRET_ACCESS_KEY de um IAM usuário porque essas são credenciais de longo prazo, que devem ser evitadas para acesso programático aos AWS serviços. Para obter mais informações sobre as credenciais temporárias, consulte a seção Práticas recomendadas.

O AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY, e TEMPORARY_SESSION_TOKEN usado 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

Credenciais temporárias

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

Por exemplo, um desenvolvedor codifica o AWS_ACCESS_KEY_ID e AWS_SECRET_ACCESS_KEY de um IAM usuário 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ódigo. 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 IAM console ou a interface de linha de AWS comando () AWSCLI.

Para obter credenciais temporárias para acesso programático aos AWS serviços, use. AWS STS 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 AWSSTS, consulte a documentação.

Épicos

TarefaDescriçãoHabilidades necessárias

Crie uma tabela do DynamoDB.

Crie tabelas do DynamoDB, com índices, nas contas de origem e de destino. AWS

Defina o provisionamento de capacidade como modo sob demanda, o que permite que o DynamoDB escale dinamicamente as capacidades de leitura/gravação com base na workload. 

Como alternativa, você pode usar a capacidade provisionada com 4000 RCUs e 4000. WCUs

Desenvolvedor de aplicativosDBA, 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 aplicativosDBA, engenheiro de migração
TarefaDescriçãoHabilidades necessárias

Crie IAM funções para acessar as tabelas de origem e destino do DynamoDB.

Crie uma IAM função 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 uma IAM função 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
TarefaDescriçãoHabilidades necessárias

Obtenha credenciais temporárias para as IAM funções.

Obtenha credenciais temporárias para a IAM função criada na conta de origem.

Obtenha credenciais temporárias para a IAM função criada na conta de destino.

Uma forma de obter as credenciais temporárias para a IAM função é usar AWS STS do AWSCLI.

aws sts assume-role --role-arn arn:aws:iam::<account-id>:role/<role-name> --role-session-name <session-name> --profile <profile-name>

Use o AWS perfil apropriado (correspondente à conta de origem ou de destino).

Para obter mais informações sobre as credenciais de segurança temporárias, consulte:

Desenvolvedor de aplicativos, engenheiro de migração

Inicialize os clientes DynamoDB para acesso ao DynamoDB de origem e de destino.

Inicialize os clientes do DynamoDB, que são fornecidos pelo, para as tabelas de origem e de AWS SDK destino do DynamoDB.

  • Para o cliente DynamoDB de origem, use as credenciais temporárias obtidas da conta de origem.

  • Para o cliente DynamoDB de origem, use as credenciais temporárias obtidas da conta de destino.

Para obter mais informações sobre como fazer solicitações usando credenciais IAM temporárias, consulte a AWSdocumentação.

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:

  • Execute uma verificação na tabela na conta de origem usando o cliente DynamoDB de origem. Cada verificação do DynamoDB recupera somente 1 MB de dados da tabela, então você deve repetir essa operação até que todos os itens ou registros sejam lidos.

  • Para cada conjunto de itens digitalizados, grave os itens na tabela na conta de destino, com o cliente do DynamoDB de destino, usando a BatchWriteItem chamada para o DynamoDB. AWS SDK Isso reduz o número de solicitações PutItem feitas ao DynamoDB. 

  • BatchWriteItem tem uma limitação de 25 gravações ou colocações, ou até 16 MB. Você deve adicionar lógica para acumular itens verificados em contagens de 25 antes de chamar BatchWriteItem. BatchWriteItem retorna uma lista de itens que não puderam ser copiados com sucesso. Usando essa lista, adicione a lógica de nova tentativa para realizar outra chamada BatchWriteItem somente com os itens que não tiveram êxito.

Para obter mais informações, consulte a implementação de referência em C# (para eliminar, criar e preencher tabelas) na seção Anexos. Um exemplo de arquivo JavaScript Object Notation (JSON) de configuração de tabela também está anexado.

Desenvolvedor de aplicativos

Recursos relacionados

Mais informações

Esse padrão foi implementado usando C# 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 na documentação. AWS

Anexos

Para acessar o conteúdo adicional associado a este documento, descompacte o seguinte arquivo: attachment.zip