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
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 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.
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_ID
AWS_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
Tarefa | Descrição | Habilidades 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 |
Tarefa | Descrição | Habilidades 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 |
Tarefa | Descrição | Habilidades 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.
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 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 | Desenvolvedor de aplicativos |
Execute a cópia da tabela. | Repita as etapas a seguir até que todos os dados sejam copiados:
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