

# Tabelas globais: replicação multiativa e multirregional
<a name="GlobalTables"></a>

As *tabelas globais do Amazon DynamoDB* são um atributo de banco de dados totalmente gerenciado, multiativo e multirregional que fornece replicação de dados fácil de usar e performance de leitura e gravação local rápida para aplicações globalmente escaladas.

As tabelas globais replicam automaticamente os dados de tabela do DynamoDB em várias Regiões da AWS e, opcionalmente, em várias contas da AWSsem exigir que você crie e mantenha sua própria solução de replicação. As tabelas globais são ideais para aplicativos que exigem continuidade de negócios e alta disponibilidade por meio da implantação em várias regiões. Qualquer réplica de tabela global pode servir para leituras e gravações. Os aplicativos podem alcançar alta resiliência com um objetivo de ponto de recuperação (RPO) baixo ou zero, transferindo o tráfego para uma região diferente se o processamento do aplicativo for interrompido em uma região. As tabelas globais estão disponíveis em todas as regiões onde o DynamoDB está disponível.

## Modos de consistência
<a name="GlobalTables.consistency-modes"></a>

Ao criar uma tabela global, você pode configurar o modo de consistência. As tabelas globais permitem dois modos de consistência: consistência final multirregional (MREC) e consistência forte multirregional (MRSC).

Se você não especificar um modo de consistência ao criar uma tabela global, ela usará como padrão a consistência final multirregional (MREC). Uma tabela global não pode conter réplicas configuradas com modos de consistência diferentes. Não é possível alterar o modo de consistência de uma tabela global depois da criação.

## Configurações da conta
<a name="GlobalTables.account-configurations"></a>

O DynamoDB agora permite dois modelos de tabelas globais, cada um criado para padrões de arquitetura diferentes:
+ **Tabelas globais da mesma conta**: todas as réplicas são criadas e gerenciadas em uma única conta da AWS.
+ **Tabelas globais de várias contas**: as réplicas são implantadas em várias contas da AWS enquanto fazem parte de um grupo de replicação compartilhado.

Os modelos da mesma conta e de várias contas permitem gravações em várias regiões, replicação assíncrona, resolução de conflitos com o método “último gravador prevalece” e o mesmo modelo de faturamento. No entanto, eles diferem com relação à forma como as contas, as permissões, a criptografia e a governança de tabelas são gerenciadas.

As tabelas globais configuradas para a MRSC permitem somente configurações da mesma conta.

Você pode configurar uma tabela global usando o AWS Management Console. As tabelas globais usam as APIs existentes do DynamoDB para ler e gravar dados em suas tabelas, portanto, nenhuma alteração no aplicativo é necessária. Você paga apenas pelos recursos provisionados ou usados, sem nenhum custo ou compromisso inicial.


| **Propriedades** | **Tabelas globais da mesma conta** | **Tabelas global de várias contas** | 
| --- | --- | --- | 
| Caso de uso principal | Resiliência multirregional para aplicações em uma única conta da AWS | Replicação em várias regiões e várias contas para aplicações pertencentes a equipes diferentes, unidades de negócios distintas ou limites de segurança robustos entre contas | 
| Modelo de conta | Todas as réplicas criadas e gerenciadas em uma conta da AWS | Réplicas criadas em várias contas da AWS na mesma implantação | 
| Propriedade de recursos | A tabela e todas as réplicas pertencem a uma única conta | Cada conta detém sua réplica local; o grupo de replicação abrange contas | 
| Versão compatível | Tabela globais versão 2.019.11.21 (atual) e versão 2017.11.29 (legada) | Tabelas globais versão 2019.11.21 (atual) | 
| Operações de ambiente de gerenciamento | Criar, modificar e excluir réplicas por meio da conta do proprietário da tabela | Operações do ambiente de gerenciamento distribuído: as contas entram ou saem do grupo de replicação | 
| Operações de planos de dados | Endpoints padrão do DynamoDB por região | Acesso ao plano de dados por conta/região; roteamento por meio do grupo de replicação | 
| Limite de segurança | Um único limite do IAM e do KMS | IAM, KMS, faturamento, CloudTrail e governança distintos por conta | 
| Mais adequado | Organizações em que a propriedade das tabelas é centralizada | Organizações com equipes federadas, limites de governança ou configurações de várias contas | 

**Topics**
+ [Modos de consistência](#GlobalTables.consistency-modes)
+ [Configurações da conta](#GlobalTables.account-configurations)
+ [Principais conceitos sobre tabelas globais](globaltables-CoreConcepts.md)
+ [Tabela global da mesma conta do DynamoDB](globaltables-SameAccount.md)
+ [Tabelas globais de várias contas do DynamoDB](globaltables-MultiAccount.md)
+ [Conceitos básicos sobre faturamento do Amazon DynamoDB para tabelas globais](global-tables-billing.md)
+ [Versões de tabelas globais do DynamoDB](V2globaltables_versions.md)
+ [Melhores práticas para tabelas globais](globaltables-bestpractices.md)

# Principais conceitos sobre tabelas globais
<a name="globaltables-CoreConcepts"></a>

As seções a seguir descrevem os conceitos e os comportamentos das tabelas globais no Amazon DynamoDB.

## Conceitos
<a name="globaltables-CoreConcepts.KeyConcepts"></a>

As *tabelas globais* são um recurso do DynamoDB que replica os dados da tabela em todas as regiões da AWS.

Uma *tabela-réplica* (ou réplica) é uma única tabela do DynamoDB que funciona como parte de uma tabela global. Uma tabela global consiste em duas ou mais tabelas de réplica em diferentes regiões da AWS. Cada tabela global só pode ter uma réplica por região da AWS. Todas as réplicas em uma tabela global compartilham o mesmo nome da tabela, esquema de chave primária e dados do item.

Quando uma aplicação grava dados em uma réplica em uma região, o DynamoDB replica automaticamente a gravação para as outras réplicas na tabela global. Para ter mais informações para começar a usar tabelas globais, consulte [Tutoriais: Criação de tabelas globais](V2globaltables.tutorial.md) ou [Tutoriais: criar de tabelas globais de várias contas](V2globaltables_MA.tutorial.md).

## Versões
<a name="globaltables-CoreConcepts.Versions"></a>

Há duas versões disponíveis das tabelas globais do DynamoDB: [Global Tables versão 2019.11.21 (atual)](GlobalTables.md) e [Global Tables versão 2017.11.29 (herdada)](globaltables.V1.md). É necessário usar a versão de tabelas globais 2019.11.21 (atual) sempre que possível. As informações nesta seção de documentação são para a versão 2019.11.21 (atual). Para ter mais informações sobre como determinar a versão de uma tabela global, consulte [Determinar a versão de uma tabela global](V2globaltables_versions.md#globaltables.DetermineVersion).

## Disponibilidade
<a name="globaltables-CoreConcepts.availability"></a>

As tabelas globais ajudam a melhorar a continuidade de seus negócios, facilitando a implementação de uma arquitetura de alta disponibilidade multirregional. Se uma workload em uma única região da AWS se tornar prejudicada, você poderá transferir o tráfego do aplicativo para uma região diferente e executar leituras e gravações em uma tabela de réplica diferente na mesma tabela global.

Cada tabela de réplica em uma tabela global oferece a mesma durabilidade e disponibilidade de uma tabela do DynamoDB de região única. As tabelas globais oferecem um [Acordo de Serviço (SLA)](https://aws.amazon.com//dynamodb/sla/) com 99,999% de disponibilidade, em comparação com 99,99% das tabelas de região única.

## Teste de injeção de falhas
<a name="fault-injection-testing"></a>

As tabelas globais MREC e MRSC integram-se ao [Serviço de Injeção de Falhas da AWS](https://docs.aws.amazon.com/resilience-hub/latest/userguide/testing.html) (AWS FIS), um serviço totalmente gerenciado para executar experimentos de injeção de falhas controladas para melhorar a resiliência de uma aplicação. Por meio do AWS FIS, é possível:
+ Criar modelos de experimentos que definam cenários de falha específicos.
+ Injetar falhas para validar a resiliência da aplicação simulando o isolamento de região (isto é, pausando a replicação de e para uma réplica selecionada) para testar o tratamento de erros, os mecanismos de recuperação e o comportamento de mudança de tráfego em várias regiões quando uma região da AWS sofre interrupções.

Por exemplo, em uma tabela global com réplicas nas regiões Leste dos EUA (Norte da Virgínia), Leste dos EUA (Ohio) e Oeste dos EUA (Oregon), é possível executar um experimento na região Leste dos EUA (Ohio) para testar o isolamento de região lá e, ao mesmo tempo, continuar as operações normais na região Oeste dos EUA (Oregon). Esse teste controlado ajuda você a identificar e resolver possíveis problemas antes que eles afetem as workloads de produção. 

Consulte [Destinos da ação](https://docs.aws.amazon.com/fis/latest/userguide/action-sequence.html#action-targets) no *Guia do usuário do AWS FIS* para ver uma lista completa das ações permitidas pelo AWS FIS e da [conectividade entre regiões](https://docs.aws.amazon.com/fis/latest/userguide/cross-region-scenario.html) para pausar a replicação do DynamoDB entre regiões.

Para ter informações sobre as ações de tabelas globais do Amazon DynamoDB disponíveis no AWS FIS, consulte [Referência de ações de tabelas globais do DynamoDB](https://docs.aws.amazon.com/fis/latest/userguide/fis-actions-reference.html#dynamodb-actions-reference) no *Guia do usuário do AWS*.

Para começar a realizar experimentos de injeção de falhas, consulte [Planejar experimentos do AWS FIS](https://docs.aws.amazon.com/fis/latest/userguide/getting-started-planning.html) no “Guia do usuário do AWS FIS”.

**nota**  
Durante experimentos do AWS FIS no modo de consistência forte multirregional (MRSC), leituras finais consistentes são permitidas, mas atualizações de configuração de tabela, como alterar o modo de cobrança ou configurar o throughput da tabela, não são permitidas, de maneira semelhante ao modo de consistência final multirregional (MREC). Verifique a métrica [`FaultInjectionServiceInducedErrors`](metrics-dimensions.md#FaultInjectionServiceInducedErrors) do CloudWatch para ver detalhes adicionais sobre o código de erro.

## Vida útil (TTL)
<a name="global-tables-ttl"></a>

As tabelas globais configuradas para o MREC dão suporte à configuração da exclusão [Time To Live](TTL.md) (TTL). As configurações de TTL são sincronizadas automaticamente para todas as réplicas em uma tabela global. Quando o TTL exclui um item de uma réplica em uma região, a exclusão é replicada para todas as outras réplicas na tabela global. O TTL não consome capacidade de gravação, portanto, você não é cobrado pela exclusão TTL na região em que a exclusão ocorreu. No entanto, você é cobrado pela exclusão replicada em cada outra região com uma réplica na tabela global.

A replicação de exclusão TTL consome capacidade de gravação nas réplicas nas quais a exclusão está sendo replicada. As réplicas configuradas para capacidade provisionada podem limitar as solicitações de controle de utilização se a combinação de throughput de gravação e throughput de exclusão TTL for maior que a capacidade de gravação provisionada.

As tabelas globais configuradas para consistência forte multirregional (MRSC) não suportam a configuração da exclusão Time To Live (TTL).

## Fluxos
<a name="global-tables-streams"></a>

As tabelas globais configuradas para consistência final multirregional (MREC) replicam as alterações lendo essas alterações de um [DynamoDB Stream](Streams.md) em uma tabela de réplica e aplicando essa alteração a todas as outras tabelas de réplica. Portanto, os streams são habilitados por padrão em todas as réplicas em uma tabela global do MREC e não podem ser desativados nessas réplicas. O processo de replicação do MREC pode combinar várias alterações em um curto período de tempo em uma única gravação replicada, resultando em cada fluxo de réplica contendo registros ligeiramente diferentes. Os registros de fluxos nas réplicas com MREC mantêm a ordem de todas as alterações no mesmo item, mas a ordem relativa das alterações em itens diferentes pode variar entre as réplicas.

Se você quiser escrever um aplicativo que processe registros do Streams para alterações que ocorreram em uma determinada região, mas não em outras em uma tabela global, você pode adicionar um atributo a cada item que define em qual região a alteração desse item ocorreu. Você pode usar esse atributo para filtrar os registros do Streams em busca de alterações que ocorreram em outras regiões, incluindo o uso de filtros de eventos do Lambda para invocar somente as funções do Lambda para alterações em uma região específica.

As tabelas globais configuradas para consistência forte multirregionais (MRSC) não usam o DynamoDB Streams para replicação, portanto, o Streams não é habilitado por padrão nas réplicas do MRSC. Você pode habilitar o Streams em uma réplica do MRSC. Os registros de streams nas réplicas do MRSC são idênticos para cada réplica, incluindo a ordenação dos registros do Stream.

## Transações
<a name="global-tables-transactions"></a>

Em uma tabela global configurada para MREC, as operações de transação ([https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_TransactWriteItems.html](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_TransactWriteItems.html) e [https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_TransactGetItems.html](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_TransactGetItems.html)) do DynamoDB são atômicas somente na região em que a operação foi invocada. As gravações transacionais não são replicadas como uma unidade em todas as regiões, o que significa que somente algumas das gravações em uma transação podem ser retornadas por operações de leitura em outras réplicas em um determinado momento.

Por exemplo, se você tiver uma tabela global com réplicas nas regiões Leste dos EUA (Ohio) e Oeste dos EUA (Oregon) e realizar uma operação `TransactWriteItems` na região Leste dos EUA (Ohio), poderá observar transações parcialmente concluídas na região Oeste dos EUA (Oregon) à medida que as alterações forem replicadas. As alterações só serão replicadas para outras regiões quando forem confirmadas na região de origem.

As tabelas globais configuradas para consistência forte multirregional (MRSC) não dão suporte a operações de transação e retornarão um erro se essas operações forem invocadas em uma réplica do MRSC.

## Throughput de leitura e gravação
<a name="globaltables-CoreConcepts.Throughput"></a>

### Modo provisionado
<a name="gt_throughput.provisioned"></a>

A replicação consome capacidade de gravação. As réplicas configuradas para capacidade provisionada podem controlar a utilização de solicitações se a soma do throughput de gravação de aplicação e do throughput de gravação de replicação ultrapassar a capacidade de gravação provisionada. Para tabelas globais que usam o modo provisionado, as configurações de ajuste de escala automático das capacidades de leitura e gravação são sincronizadas entre as réplicas.

É possível definir de forma independente as configurações de capacidade de leitura para cada réplica em uma tabela global usando o parâmetro [https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_ProvisionedThroughputOverride.html](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_ProvisionedThroughputOverride.html) em nível de réplica. Por padrão, as alterações na capacidade de leitura provisionada são aplicadas a todas as réplicas na tabela global. Ao adicionar uma nova réplica a uma tabela global, a capacidade de leitura da tabela ou réplica de origem é usada como valor inicial, a menos que uma substituição em nível de réplica seja especificada explicitamente.

### Modo sob demanda
<a name="gt_throughput.on-demand"></a>

Para tabelas globais configuradas para o modo sob demanda, a capacidade de gravação é sincronizada automaticamente em todas as réplicas. O DynamoDB ajusta automaticamente a capacidade com base no tráfego, e não há configurações de capacidade de leitura ou gravação específicas da réplica para gerenciar.

## Monitorar tabelas globais
<a name="monitoring-global-tables"></a>

Tabelas globais configuradas para consistência final em várias regiões (MREC) publicam a métrica [`ReplicationLatency`](metrics-dimensions.md#ReplicationLatency) no CloudWatch. Essa métrica controla o tempo decorrido entre quando um item foi gravado em uma tabela-réplica e quando esse item aparece em outra réplica na tabela global. `ReplicationLatency` é expresso em milissegundos e é emitido para cada par de regiões de origem e destino em uma tabela global. 

Os valores típicos de `ReplicationLatency` dependem da distância entre as regiões da AWS escolhidas, bem como de outras variáveis como tipo de workload e throughput. Por exemplo, uma réplica de origem na região Oeste dos EUA (N. da Califórnia) (us-west-1) tem uma `ReplicationLatency` menor para a região Oeste dos EUA (Oregon) (us-west-2) em comparação com a região África (Cidade do Cabo) (af-south-1).

Um valor elevado para `ReplicationLatency` pode indicar que as atualizações de uma réplica não se propagaram para outras tabelas-réplica em tempo hábil. Nesse caso, você pode redirecionar temporariamente as atividades de leitura e gravação da aplicação para outra região da AWS.

As tabelas globais configuradas para consistência forte multirregional (MRSC) não publicam uma métrica de `ReplicationLatency`.

## Considerações para gerenciar tabelas globais
<a name="management-considerations"></a>

Você não pode excluir uma tabela usada para adicionar uma nova réplica de tabela global até que tenham decorrido 24 horas desde que a nova réplica foi criada.

Se você desabilitar uma região da AWS que contém réplicas de tabelas globais, essas réplicas serão convertidas permanentemente em tabelas de região única 20 horas após a desativação da região.

# Tabela global da mesma conta do DynamoDB
<a name="globaltables-SameAccount"></a>

As tabelas globais da mesma conta replicam automaticamente os dados da tabela do DynamoDB em várias regiões da AWS em uma única conta da AWS. As tabelas globais da mesma conta são o modelo mais simples para executar aplicações multirregionais porque todas as réplicas compartilham o mesmo modelo de limite de conta, propriedade e permissões. Quando você escolhe as regiões da AWS para suas tabelas-réplica, as tabelas globais lidam com todas as replicações automaticamente. As tabelas globais estão disponíveis em todas as regiões onde o DynamoDB está disponível.

As tabelas globais da mesma conta oferecem os seguintes benefícios:
+ Replicação automática dos dados da tabela do DynamoDB em todas as regiões da AWS de sua escolha para posicionar os dados mais perto dos usuários
+ Maior disponibilidade de aplicações durante isolamento ou degradação regional.
+ Utilização da resolução de conflitos integrada para que você possa se concentrar na lógica de negócios da sua aplicação.
+ Possibilidade de escolher entre [Consistência final multirregional (MREC)](V2globaltables_HowItWorks.md#V2globaltables_HowItWorks.consistency-modes.mrec) ou [Consistência forte multirregional (MRSC)](V2globaltables_HowItWorks.md#V2globaltables_HowItWorks.consistency-modes.mrsc) ao criar uma tabela global da mesma conta.

**Topics**
+ [Como funcionam as tabelas globais do DynamoDB](V2globaltables_HowItWorks.md)
+ [Tutoriais: Criação de tabelas globais](V2globaltables.tutorial.md)
+ [Segurança de tabelas globais do DynamoDB](globaltables-security.md)

# Como funcionam as tabelas globais do DynamoDB
<a name="V2globaltables_HowItWorks"></a>

As seções a seguir descrevem os conceitos e os comportamentos das tabelas globais no Amazon DynamoDB.

## Conceitos
<a name="V2globaltables_HowItWorks.KeyConcepts"></a>

*As tabelas globais* são um recurso do DynamoDB que replica os dados da tabela em todas as regiões da AWS. 

Uma *tabela-réplica* (ou réplica) é uma única tabela do DynamoDB que funciona como parte de uma tabela global. Uma tabela global consiste em duas ou mais tabelas de réplica em diferentes regiões da AWS. Cada tabela global só pode ter uma réplica por região da AWS. Todas as réplicas em uma tabela global compartilham o mesmo nome da tabela, esquema de chave primária e dados do item.

Quando uma aplicação grava dados em uma réplica em uma região, o DynamoDB replica automaticamente a gravação para as outras réplicas na tabela global. Para obter mais informações sobre conceitos básicos de tabelas globais, consulte [Tutoriais: Criação de tabelas globais](V2globaltables.tutorial.md).

## Versões
<a name="V2globaltables_HowItWorks.versions"></a>

Há duas versões disponíveis das tabelas globais do DynamoDB: versão 2019.11.21 (atual) e [versão 2017.11.29 (legada)](globaltables.V1.md). Você deve usar a versão 2019.11.21 (atual) sempre que possível. As informações nesta seção de documentação são para a versão 2019.11.21 (atual). Para obter mais informações, consulte [Determinar a versão de uma tabela global](V2globaltables_versions.md#globaltables.DetermineVersion).

## Disponibilidade
<a name="V2globaltables_HowItWorks.availability"></a>

As tabelas globais ajudam a melhorar a continuidade de seus negócios, facilitando a implementação de uma arquitetura de alta disponibilidade multirregional. Se uma workload em uma única região da AWS se tornar prejudicada, você poderá transferir o tráfego do aplicativo para uma região diferente e executar leituras e gravações em uma tabela de réplica diferente na mesma tabela global.

Cada tabela de réplica em uma tabela global oferece a mesma durabilidade e disponibilidade de uma tabela do DynamoDB de região única. As tabelas globais oferecem um [Acordo de Serviço (SLA)](https://aws.amazon.com//dynamodb/sla/) com 99,999% de disponibilidade, em comparação com 99,99% das tabelas de região única.

## Modos de consistência
<a name="V2globaltables_HowItWorks.consistency-modes"></a>

Ao criar uma tabela global, você pode configurar o modo de consistência. As tabelas globais permitem dois modos de consistência: consistência final multirregional (MREC) e consistência forte multirregional (MRSC).

Se você não especificar um modo de consistência ao criar uma tabela global, ela usará como padrão a consistência final multirregional (MREC). Uma tabela global não pode conter réplicas configuradas com modos de consistência diferentes. Não é possível alterar o modo de consistência de uma tabela global depois da criação.

### Consistência final multirregional (MREC)
<a name="V2globaltables_HowItWorks.consistency-modes.mrec"></a>

A consistência final multirregional (MREC) é o modo de consistência padrão para tabelas globais. As alterações feitas em um item em uma réplica da tabela global MREC são replicadas de forma assíncrona em todas as outras réplicas, normalmente em um segundo ou menos. No caso improvável de uma réplica em uma tabela global do MREC ficar isolada ou danificada, todos os dados ainda não replicados para outras regiões serão replicados quando a réplica ficar íntegra.

Se o mesmo item for modificado em várias regiões simultaneamente, o DynamoDB resolverá o conflito usando a modificação com o registro de data e hora interno mais recente por item, conhecido como método de resolução de conflitos do tipo “último escritor vence”. Um item acabará por convergir em todas as réplicas para a versão criada pela última gravação.

[Operações de leitura altamente consistentes](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_GetItem.html#DDB-GetItem-request-ConsistentRead) retornam a versão mais recente de um item se ele tiver sido atualizado pela última vez na região onde a leitura ocorreu, mas podem retornar dados obsoletos se o item tiver sido atualizado pela última vez em uma região diferente. As gravações condicionais avaliam a expressão da condição em relação à versão do item na região.

Você cria uma tabela global MREC adicionando uma réplica a uma tabela existente do DynamoDB. Adicionar uma réplica não afeta o desempenho das tabelas existentes do DynamoDB de região única ou nas réplicas de tabelas globais existentes. Você pode adicionar réplicas a uma tabela global do MREC para expandir o número de regiões em que os dados são replicados ou remover réplicas de uma tabela global do MREC se elas não forem mais necessárias. Uma tabela global do MREC pode ter uma réplica em qualquer região onde o DynamoDB esteja disponível e pode ter quantas réplicas houver regiões na partição [AWS](https://docs.aws.amazon.com/whitepapers/latest/aws-fault-isolation-boundaries/partitions.html).

### Consistência forte multirregional (MRSC)
<a name="V2globaltables_HowItWorks.consistency-modes.mrsc"></a>

Você pode configurar o modo de consistência forte multirregional (MRSC) ao criar uma tabela global. As alterações de item em uma réplica da tabela global do MRSC são replicadas de forma síncrona em pelo menos uma outra região antes que a operação de gravação retorne uma resposta bem-sucedida. Operações de leitura altamente consistentes em qualquer réplica do MRSC sempre retornam a versão mais recente de um item. As gravações condicionais sempre avaliam a expressão da condição em relação à versão mais recente de um item.

Uma tabela global do MRSC deve ser implantada em exatamente três regiões. Você pode configurar uma tabela global MRSC com três réplicas ou duas réplicas e uma testemunha. Uma testemunha é um componente de uma tabela global com MRSC que contém dados gravados em réplicas da tabela global e pode ser usado opcionalmente no lugar de uma réplica completa, ao mesmo tempo em que é compatível com a arquitetura de disponibilidade de MRSC. Você não pode realizar operações de leitura ou gravação em uma testemunha. Uma testemunha está localizada em uma região diferente das duas réplicas. Ao criar uma tabela global do MRSC, você escolhe as regiões para suas réplicas e para a implantação da testemunha no momento da criação da tabela MRSC. Você pode determinar se e em qual região uma tabela global do MRSC tem uma testemunha configurada a partir da saída da API [https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeTable.html](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeTable.html). A testemunha pertence e é gerenciada pelo DynamoDB, e a testemunha não aparecerá na sua conta da AWS na região em que está configurada.

As tabelas globais com MRSC estão disponíveis nos seguintes conjuntos de regiões: dos EUA [Leste dos EUA (Norte da Virgínia), Leste dos EUA (Ohio), Oeste dos EUA (Oregon)], da UE [Europa (Irlanda), Europa (Londres), Europa (Paris), Europa (Frankfurt)] e da Ásia-Pacífico [Ásia-Pacífico (Tóquio), Ásia-Pacífico (Seul) e Ásia-Pacífico (Osaka)]. As tabelas globais do MRSC não podem abranger conjuntos de regiões (por exemplo, uma tabela global do MRSC não pode conter réplicas dos conjuntos de regiões dos EUA e da UE).

Você cria uma tabela global MRSC adicionando uma réplica e uma testemunha ou duas réplicas a uma tabela existente do DynamoDB que não contém dados. Ao converter uma tabela de região única existente em uma tabela global com MRSC, é necessário garantir que a tabela esteja vazia. Não é possível converter uma tabela de região única em uma tabela global com MRSC que já contenha itens. Nenhum dado deve ser gravado na tabela durante o processo de conversão. Você não pode adicionar réplicas adicionais a uma tabela global MRSC existente. Não é possível excluir uma única réplica ou testemunha de uma tabela global do MRSC. Você pode excluir duas réplicas ou excluir uma réplica e uma testemunha de uma tabela global do MRSC, convertendo a réplica restante em uma tabela do DynamoDB de região única.

Uma operação de gravação falha com um erro `ReplicatedWriteConflictException` quando ela tenta modificar um item que já está sendo modificado em outra região. As gravações que falharem, exibindo o erro `ReplicatedWriteConflictException`, poderão ser repetidas e terão êxito se o item não estiver mais sendo modificado em outra região.

As seguintes considerações se aplicam às tabelas globais do MRSC:
+ Tempo de vida (TTL) não é aceito em tabelas globais do MRSC.
+ Índices secundários locais (LSIs) não são aceitos em tabelas globais do MRSC.
+ As informações do CloudWatch Contributor Insights são relatadas somente para a região em que uma operação ocorreu.

## Escolher um modo de consistência
<a name="V2globaltables_HowItWorks.choosing-consistency-mode"></a>

O principal critério para escolher um modo de consistência multirregional é se seu aplicativo prioriza gravações de menor latência e leituras altamente consistentes ou prioriza uma consistência global forte.

As tabelas globais MREC terão latências de gravação e de leitura altamente consistente mais baixas em comparação às tabelas globais MRSC. As tabelas globais com MREC têm um objetivo de ponto de recuperação (RPO) igual ao atraso de replicação entre as réplicas, geralmente de alguns segundos, dependendo das regiões da réplica.

Você deve usar o modo MREC quando:
+ A aplicação pode tolerar dados obsoletos exibidos por operações de leitura altamente consistente se esses dados tiverem sido atualizados em outra região.
+ Você prioriza latências de gravação e de leitura altamente consistente mais baixas em relação à consistência de leitura multirregional.
+ Sua estratégia de alta disponibilidade multirregional pode tolerar um RPO maior que zero.

As tabelas globais MRSC terão latências de gravação e leitura altamente consistente mais altas em comparação às tabelas globais MREC. As tabelas globais do MRSC oferecem suporte a um objetivo de ponto de recuperação (RPO) de zero.

É necessário usar o modo MRSC quando:
+ Você precisa de leituras altamente consistentes em várias regiões.
+ Você prioriza a consistência global de leitura em detrimento da menor latência de gravação.
+ Sua estratégia de alta disponibilidade multirregional exige um RPO igual a zero.

## Monitorar tabelas globais
<a name="monitoring-global-tables"></a>

Tabelas globais configuradas para consistência final em várias regiões (MREC) publicam a métrica [`ReplicationLatency`](metrics-dimensions.md#ReplicationLatency) no CloudWatch. Essa métrica controla o tempo decorrido entre quando um item foi gravado em uma tabela-réplica e quando esse item aparece em outra réplica na tabela global. `ReplicationLatency` é expresso em milissegundos e é emitido para cada par de regiões de origem e destino em uma tabela global. 

Os valores típicos de `ReplicationLatency` dependem da distância entre as regiões da AWS escolhidas, bem como de outras variáveis como tipo de workload e throughput. Por exemplo, uma réplica de origem na região Oeste dos EUA (N. da Califórnia) (us-west-1) tem uma `ReplicationLatency` menor para a região Oeste dos EUA (Oregon) (us-west-2) em comparação com a região África (Cidade do Cabo) (af-south-1).

Um valor elevado para `ReplicationLatency` pode indicar que as atualizações de uma réplica não se propagaram para outras tabelas-réplica em tempo hábil. Nesse caso, você pode redirecionar temporariamente as atividades de leitura e gravação da aplicação para outra região da AWS.

As tabelas globais configuradas para consistência forte multirregional (MRSC) não publicam uma métrica de `ReplicationLatency`.

## Teste de injeção de falhas
<a name="fault-injection-testing"></a>

As tabelas globais MREC e MRSC integram-se ao [Serviço de Injeção de Falhas da AWS](https://docs.aws.amazon.com/resilience-hub/latest/userguide/testing.html) (AWS FIS), um serviço totalmente gerenciado para executar experimentos de injeção de falhas controladas para melhorar a resiliência de uma aplicação. Por meio do AWS FIS, é possível:
+ Criar modelos de experimentos que definam cenários de falha específicos.
+ Injetar falhas para validar a resiliência da aplicação simulando o isolamento de região (isto é, pausando a replicação de e para uma réplica selecionada) para testar o tratamento de erros, os mecanismos de recuperação e o comportamento de mudança de tráfego em várias regiões quando uma região da AWS sofre interrupções.

Por exemplo, em uma tabela global com réplicas nas regiões Leste dos EUA (Norte da Virgínia), Leste dos EUA (Ohio) e Oeste dos EUA (Oregon), é possível executar um experimento na região Leste dos EUA (Ohio) para testar o isolamento de região lá e, ao mesmo tempo, continuar as operações normais na região Oeste dos EUA (Oregon). Esse teste controlado ajuda você a identificar e resolver possíveis problemas antes que eles afetem as workloads de produção. 

Consulte [Destinos da ação](https://docs.aws.amazon.com/fis/latest/userguide/action-sequence.html#action-targets) no *Guia do usuário do AWS FIS* para ver uma lista completa das ações permitidas pelo AWS FIS e da [conectividade entre regiões](https://docs.aws.amazon.com/fis/latest/userguide/cross-region-scenario.html) para pausar a replicação do DynamoDB entre regiões.

Para ter informações sobre as ações de tabelas globais do Amazon DynamoDB disponíveis no AWS FIS, consulte [Referência de ações de tabelas globais do DynamoDB](https://docs.aws.amazon.com/fis/latest/userguide/fis-actions-reference.html#dynamodb-actions-reference) no *Guia do usuário do AWS*.

Para começar a realizar experimentos de injeção de falhas, consulte [Planejar experimentos do AWS FIS](https://docs.aws.amazon.com/fis/latest/userguide/getting-started-planning.html) no “Guia do usuário do AWS FIS”.

**nota**  
Durante experimentos do AWS FIS no modo de consistência forte multirregional (MRSC), leituras finais consistentes são permitidas, mas atualizações de configuração de tabela, como alterar o modo de cobrança ou configurar o throughput da tabela, não são permitidas, de maneira semelhante ao modo de consistência final multirregional (MREC). Verifique a métrica [`FaultInjectionServiceInducedErrors`](metrics-dimensions.md#FaultInjectionServiceInducedErrors) do CloudWatch para ver detalhes adicionais sobre o código de erro.

## Vida útil (TTL)
<a name="global-tables-ttl"></a>

As tabelas globais configuradas para o MREC dão suporte à configuração da exclusão [Time To Live](TTL.md) (TTL). As configurações de TTL são sincronizadas automaticamente para todas as réplicas em uma tabela global. Quando o TTL exclui um item de uma réplica em uma região, a exclusão é replicada para todas as outras réplicas na tabela global. O TTL não consome capacidade de gravação, portanto, você não é cobrado pela exclusão TTL na região em que a exclusão ocorreu. No entanto, você é cobrado pela exclusão replicada em cada outra região com uma réplica na tabela global.

A replicação de exclusão TTL consome capacidade de gravação nas réplicas nas quais a exclusão está sendo replicada. As réplicas configuradas para capacidade provisionada podem limitar as solicitações de controle de utilização se a combinação de throughput de gravação e throughput de exclusão TTL for maior que a capacidade de gravação provisionada.

As tabelas globais configuradas para consistência forte multirregional (MRSC) não suportam a configuração da exclusão Time To Live (TTL).

## Fluxos
<a name="global-tables-streams"></a>

As tabelas globais configuradas para consistência final multirregional (MREC) replicam as alterações lendo essas alterações de um [DynamoDB Stream](Streams.md) em uma tabela de réplica e aplicando essa alteração a todas as outras tabelas de réplica. Portanto, os streams são habilitados por padrão em todas as réplicas em uma tabela global do MREC e não podem ser desativados nessas réplicas. O processo de replicação do MREC pode combinar várias alterações em um curto período de tempo em uma única gravação replicada, resultando em cada fluxo de réplica contendo registros ligeiramente diferentes. Os registros de streams em réplicas do MREC são sempre ordenados por item, mas a ordenação entre itens pode ser diferente entre as réplicas.

As tabelas globais configuradas para consistência forte multirregionais (MRSC) não usam o DynamoDB Streams para replicação, portanto, o Streams não é habilitado por padrão nas réplicas do MRSC. Você pode habilitar o Streams em uma réplica do MRSC. Os registros de streams nas réplicas do MRSC são idênticos para cada réplica, incluindo a ordenação dos registros do Stream.

Se você quiser escrever um aplicativo que processe registros do Streams para alterações que ocorreram em uma determinada região, mas não em outras em uma tabela global, você pode adicionar um atributo a cada item que define em qual região a alteração desse item ocorreu. Você pode usar esse atributo para filtrar os registros do Streams em busca de alterações que ocorreram em outras regiões, incluindo o uso de filtros de eventos do Lambda para invocar somente as funções do Lambda para alterações em uma região específica.

## Transações
<a name="global-tables-transactions"></a>

Em uma tabela global configurada para MREC, as operações de transação ([https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_TransactWriteItems.html](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_TransactWriteItems.html) e [https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_TransactGetItems.html](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_TransactGetItems.html)) do DynamoDB são atômicas somente na região em que a operação foi invocada. As gravações transacionais não são replicadas como uma unidade em todas as regiões, o que significa que somente algumas das gravações em uma transação podem ser retornadas por operações de leitura em outras réplicas em um determinado momento.

Por exemplo, se você tiver uma tabela global com réplicas nas regiões Leste dos EUA (Ohio) e Oeste dos EUA (Oregon) e realizar uma operação `TransactWriteItems` na região Leste dos EUA (Ohio), poderá observar transações parcialmente concluídas na região Oeste dos EUA (Oregon) à medida que as alterações forem replicadas. As alterações só serão replicadas para outras regiões quando forem confirmadas na região de origem.

As tabelas globais configuradas para consistência forte multirregional (MRSC) não dão suporte a operações de transação e retornarão um erro se essas operações forem invocadas em uma réplica do MRSC.

## Throughput de leitura e gravação
<a name="V2globaltables_HowItWorks.Throughput"></a>

### Modo provisionado
<a name="gt_throughput.provisioned"></a>

A replicação consome capacidade de gravação. As réplicas configuradas para capacidade provisionada podem controlar a utilização de solicitações se a soma do throughput de gravação de aplicação e do throughput de gravação de replicação ultrapassar a capacidade de gravação provisionada. Para tabelas globais que usam o modo provisionado, as configurações de ajuste de escala automático das capacidades de leitura e gravação são sincronizadas entre as réplicas.

É possível definir de forma independente as configurações de capacidade de leitura para cada réplica em uma tabela global usando o parâmetro [https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_ProvisionedThroughputOverride.html](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_ProvisionedThroughputOverride.html) em nível de réplica. Por padrão, as alterações na capacidade de leitura provisionada são aplicadas a todas as réplicas na tabela global. Ao adicionar uma nova réplica a uma tabela global, a capacidade de leitura da tabela ou réplica de origem é usada como valor inicial, a menos que uma substituição em nível de réplica seja especificada explicitamente.

### Modo sob demanda
<a name="gt_throughput.on-demand"></a>

Para tabelas globais configuradas para o modo sob demanda, a capacidade de gravação é sincronizada automaticamente em todas as réplicas. O DynamoDB ajusta automaticamente a capacidade com base no tráfego, e não há configurações de capacidade de leitura ou gravação específicas da réplica para gerenciar.

## Sincronização das configurações
<a name="V2globaltables_HowItWorks.setting-synchronization"></a>

As configurações nas tabelas globais do DynamoDB são parâmetros de configuração que controlam vários aspectos do comportamento e da replicação da tabela. Essas configurações são gerenciadas por meio das APIs do ambiente de gerenciamento do DynamoDB e podem ser configuradas ao criar ou modificar tabelas globais. As tabelas globais sincronizam automaticamente determinadas configurações em todas as réplicas para manter a consistência e, ao mesmo tempo, permitir flexibilidade para otimizações específicas da região. Entender quais configurações são sincronizadas e como elas se comportam ajuda você a configurar sua tabela global de forma eficaz. As configurações se dividem em três categorias principais com base em como elas são sincronizadas entre as réplicas.

As configurações a seguir são sempre sincronizadas entre as réplicas em uma tabela global:
+ Modo de capacidade (capacidade provisionada ou sob demanda)
+ Capacidade de gravação provisionada da tabela
+ Ajuste de escala automático de gravação da tabela
+ Definição de atributo do esquema de chaves
+ Definição do Índice Secundário Global (GSI)
+ Capacidade de gravação provisionada do GSI
+ Ajuste de escala automático de gravação do GSI
+ Tipo de criptografia do lado do servidor (SSE)
+ Definição de streams no modo MREC
+ Vida útil (TTL)
+ Throughput a quente
+ Throughput máximo de gravação sob demanda

As configurações a seguir são sincronizadas entre as réplicas, mas podem ser substituídas por réplica:
+ Capacidade de leitura provisionada da tabela
+ Ajuste de escala automático de leitura de tabela
+ Capacidade de leitura provisionadas do GSI
+ Ajuste de escala automático de leitura do GSI
+ Classe de tabela
+ Throughput máximo de leitura sob demanda

**nota**  
Os valores de configuração substituíveis são alterados se a configuração for modificada em qualquer outra réplica. Como exemplo, você tem uma tabela global do MREC com réplicas nas regiões Leste dos EUA (Norte da Virgínia) e Oeste dos EUA (Oregon). A réplica do Leste dos EUA (Norte da Virgínia) tem o throughput de leitura provisionada definido para 200 RCUs. A réplica no Oeste dos EUA (Oregon) tem a substituição do throughput de leitura provisionada definido para 100 RCUs. Se você atualizar a configuração de throughput de leitura provisionada na réplica do Leste dos EUA (Norte da Virgínia) de 200 RCUs para 300 RCUs, o novo valor da taxa de transferência de leitura provisionada também será aplicado à réplica no Oeste dos EUA (Oregon). Isso altera a configuração de throughput de leitura provisionada para a réplica do Oeste dos EUA (Oregon) do valor substituído de 100 RCUs para o novo valor de 300 RCUs.

As configurações a seguir nunca são sincronizadas entre as réplicas:
+ Proteção contra exclusão
+ Recuperação para um ponto no tempo
+ Tags
+ Habilitação da tabela do CloudWatch Contributor Insights
+ Habilitação do GSI do CloudWatch Contributor Insights
+ Definição do Kinesis Data Streams
+ Políticas de recursos
+ Definição de streams no modo MRSC

Todas as outras configurações não são sincronizadas entre as réplicas.

## DynamoDB Accelerator (DAX)
<a name="V2globaltables_HowItWorks.dax"></a>

As gravações em réplicas de tabelas globais ignoram o DynamoDB Accelerator (DAX), atualizando o DynamoDB diretamente. Como resultado, os caches do DAX podem ficar obsoletos, pois as gravações não estão atualizando o cache do DAX. Os caches do DAX configurados para réplicas de tabelas globais só serão atualizados quando o TTL do cache expirar.

## Considerações para gerenciar tabelas globais
<a name="management-considerations"></a>

Você não pode excluir uma tabela usada para adicionar uma nova réplica de tabela global até que tenham decorrido 24 horas desde que a nova réplica foi criada.

Se você desabilitar uma região da AWS que contém réplicas de tabelas globais, essas réplicas serão convertidas permanentemente em tabelas de região única 20 horas após a desativação da região.

# Tutoriais: Criação de tabelas globais
<a name="V2globaltables.tutorial"></a>

Esta seção fornece instruções passo a passo para criar tabelas globais do DynamoDB configuradas para o modo de consistência preferido. Escolha entre os modos consistência final multirregional (MREC) ou consistência forte multirregional (MRSC) com base nos requisitos do seu aplicativo.

As tabelas globais MREC fornecem menor latência de gravação com consistência final entre Regiões da AWS. As tabelas globais MRSC fornecem leituras altamente consistentes em todas as regiões com latências de gravação ligeiramente maiores do que as do MREC. Escolha o modo de consistência que melhor atenda às necessidades de consistência, latência e disponibilidade dos dados do seu aplicativo.

**Topics**
+ [Criação de uma tabela global configurada para MREC](#V2creategt_mrec)
+ [Criação de uma tabela global configurada para MRSC](#create-gt-mrsc)

## Criação de uma tabela global configurada para MREC
<a name="V2creategt_mrec"></a>

Esta seção mostra como criar uma tabela global com o modo consistência final multirregional (MREC). MREC é o modo de consistência padrão para tabelas globais e fornece gravações de baixa latência com replicação assíncrona em Regiões da AWS. As alterações feitas em um item em uma região geralmente são replicadas em todas as outras regiões em um segundo. Isso torna o MREC ideal para aplicativos que priorizam a baixa latência de gravação e podem tolerar breves períodos em que diferentes regiões podem retornar versões de dados ligeiramente diferentes.

Você pode criar tabelas globais MREC com réplicas em qualquer região da AWS que o DynamoDB esteja disponível e adicionar ou remover réplicas a qualquer momento. Os exemplos a seguir mostram como criar uma tabela global MREC com réplicas em várias regiões.

### Criação de uma tabela global MREC usando o DynamoDB Console
<a name="mrec-console"></a>

Siga estas etapas para criar uma tabela global usando o Console de gerenciamento da AWS. O exemplo a seguir cria uma tabela global com tabelas-réplica nos Estados Unidos e na Europa.

1. Faça login no Console de gerenciamento da AWS e abra o console do DynamoDB em [https://console.aws.amazon.com/dynamodb/](https://console.aws.amazon.com/dynamodb/).

1. Para este exemplo, escolha **Leste dos EUA (Ohio)** no seletor de região na barra de navegação.

1. No painel de navegação, no lado esquerdo do console, selecione **Tables** (Tabelas).

1. Selecione **Create Table** (Criar tabela).

1. Na página **Criar tabela**:

   1. Em **Table name** (Nome da tabela), insira **Music**.

   1. Em **Partition key**, (Chave de partição), insira **Artist**.

   1. Em **Chave de classificação**, insira **SongTitle**.

   1. Mantenha o restante das configurações padrão e escolha **Criar tabela**.

      Essa nova tabela serve como a primeira tabela de réplica em uma nova tabela global. Ela é o protótipo das outras tabelas-réplica que serão adicionadas posteriormente.

1. Depois que a tabela ficar ativa:

   1. Selecione a tabela **Music** (Música) na lista de tabelas.

   1. Selecione a guia **Global Tables (Tabelas globais)**.

   1. Escolha **Create replica (Criar réplica)**.

1. Na lista suspensa **Regiões de replicação disponíveis**, escolha **US West (Oregon) us-west-2** (Oeste dos EUA [Oregon], us-west-2).

   O console garante que não exista uma tabela com o mesmo nome na região selecionada. Se existir uma tabela com o mesmo nome, será necessário excluir a tabela existente para criar outra tabela-réplica nessa região.

1. Escolha **Create replica (Criar réplica)**. Isso inicia o processo de criação da tabela na região Oeste dos EUA (Oregon), us-west-2.

   A guia **Tabelas globais** da tabela **Music** (e de qualquer outra tabela-réplica) mostra que a tabela foi replicada em várias regiões.

1. Adicione outra região repetindo as etapas anteriores, mas escolha **Europa (Frankfurt) eu-central-1** como região.

1. Como testar a replicação:

   1. Continue usando o Console de gerenciamento da AWS na região Leste dos EUA (Ohio).

   1. Escolha **Explore table items** (Explorar itens da tabela).

   1. Selecione **Create Item** (Criar item).

   1. Insira **item\$11** para **Artist (Artista)** e **Song Value 1** para **SongTitle (Título da música)**.

   1. Selecione **Create Item** (Criar item).

1. Verifique a replicação mudando para outras regiões:

   1. No seletor de regiões no canto superior direito, escolha **Europa (Frankfurt)**.

   1. Verifique se a tabela **Music (Música)** contém o item que você criou.

   1. Repita a verificação para **Oeste dos EUA (Oregon)**.

### Criar uma tabela global MREC usando a AWS CLI ou Java
<a name="mrec-cli-java"></a>

------
#### [ CLI ]

O exemplo de código a seguir mostra como gerenciar tabelas globais do DynamoDB com consistência final de replicação mutirregional (MREC).
+ Crie uma tabela com replicação mutirregional (MREC).
+ Insira e obtenha itens de tabelas-réplica.
+ Remova as réplicas uma por uma.
+ Exclua a tabela para fazer uma limpeza.

**AWS CLI com script Bash**  
Crie uma tabela com replicação mutirregional.  

```
# Step 1: Create a new table (MusicTable) in US East (Ohio), with DynamoDB Streams enabled (NEW_AND_OLD_IMAGES)
aws dynamodb create-table \
    --table-name MusicTable \
    --attribute-definitions \
        AttributeName=Artist,AttributeType=S \
        AttributeName=SongTitle,AttributeType=S \
    --key-schema \
        AttributeName=Artist,KeyType=HASH \
        AttributeName=SongTitle,KeyType=RANGE \
    --billing-mode PAY_PER_REQUEST \
    --stream-specification StreamEnabled=true,StreamViewType=NEW_AND_OLD_IMAGES \
    --region us-east-2

# Step 2: Create an identical MusicTable table in US East (N. Virginia)
aws dynamodb update-table --table-name MusicTable --cli-input-json \
'{
  "ReplicaUpdates":
  [
    {
      "Create": {
        "RegionName": "us-east-1"
      }
    }
  ]
}' \
--region us-east-2

# Step 3: Create a table in Europe (Ireland)
aws dynamodb update-table --table-name MusicTable --cli-input-json \
'{
  "ReplicaUpdates":
  [
    {
      "Create": {
        "RegionName": "eu-west-1"
      }
    }
  ]
}' \
--region us-east-2
```
Descreva a tabela multirregional.  

```
# Step 4: View the list of replicas created using describe-table
aws dynamodb describe-table \
    --table-name MusicTable \
    --region us-east-2 \
    --query 'Table.{TableName:TableName,TableStatus:TableStatus,MultiRegionConsistency:MultiRegionConsistency,Replicas:Replicas[*].{Region:RegionName,Status:ReplicaStatus}}'
```
Insira itens em uma tabela-réplica.  

```
# Step 5: To verify that replication is working, add a new item to the Music table in US East (Ohio)
aws dynamodb put-item \
    --table-name MusicTable \
    --item '{"Artist": {"S":"item_1"},"SongTitle": {"S":"Song Value 1"}}' \
    --region us-east-2
```
Obtenha itens de tabelas-réplica.  

```
# Step 6: Wait for a few seconds, and then check to see whether the item has been 
# successfully replicated to US East (N. Virginia) and Europe (Ireland)
aws dynamodb get-item \
    --table-name MusicTable \
    --key '{"Artist": {"S":"item_1"},"SongTitle": {"S":"Song Value 1"}}' \
    --region us-east-1

aws dynamodb get-item \
    --table-name MusicTable \
    --key '{"Artist": {"S":"item_1"},"SongTitle": {"S":"Song Value 1"}}' \
    --region eu-west-1
```
Remova as réplicas.  

```
# Step 7: Delete the replica table in Europe (Ireland) Region
aws dynamodb update-table --table-name MusicTable --cli-input-json \
'{
  "ReplicaUpdates":
  [
    {
      "Delete": {
        "RegionName": "eu-west-1"
      }
    }
  ]
}' \
--region us-east-2

# Delete the replica table in US East (N. Virginia) Region
aws dynamodb update-table --table-name MusicTable --cli-input-json \
'{
  "ReplicaUpdates":
  [
    {
      "Delete": {
        "RegionName": "us-east-1"
      }
    }
  ]
}' \
--region us-east-2
```
Exclua a tabela para fazer uma limpeza.  

```
# Clean up: Delete the primary table
aws dynamodb delete-table --table-name MusicTable --region us-east-2

echo "Global table demonstration complete."
```
+ Consulte detalhes da API nos tópicos a seguir na *Referência de comandos da AWS CLI*.
  + [CreateTable](https://docs.aws.amazon.com/goto/aws-cli/dynamodb-2012-08-10/CreateTable)
  + [DeleteTable](https://docs.aws.amazon.com/goto/aws-cli/dynamodb-2012-08-10/DeleteTable)
  + [DescribeTable](https://docs.aws.amazon.com/goto/aws-cli/dynamodb-2012-08-10/DescribeTable)
  + [GetItem](https://docs.aws.amazon.com/goto/aws-cli/dynamodb-2012-08-10/GetItem)
  + [PutItem](https://docs.aws.amazon.com/goto/aws-cli/dynamodb-2012-08-10/PutItem)
  + [UpdateTable](https://docs.aws.amazon.com/goto/aws-cli/dynamodb-2012-08-10/UpdateTable)

------
#### [ Java ]

O exemplo de código a seguir mostra como criar e gerenciar tabelas globais do DynamoDB com réplicas entre várias regiões.
+ Crie uma tabela com um índice secundário global e DynamoDB Streams.
+ Adicione réplicas em diferentes regiões para criar uma tabela global.
+ Remova réplicas de uma tabela global.
+ Adicione itens de teste para verificar a replicação entre regiões.
+ Descreva a configuração da tabela global e o status da réplica.

**SDK para Java 2.x**  
Crie uma tabela com um índice secundário global e DynamoDB Streams usando AWS SDK for Java 2.x.  

```
    public static CreateTableResponse createTableWithGSI(
        final DynamoDbClient dynamoDbClient, final String tableName, final String indexName) {

        if (dynamoDbClient == null) {
            throw new IllegalArgumentException("DynamoDB client cannot be null");
        }
        if (tableName == null || tableName.trim().isEmpty()) {
            throw new IllegalArgumentException("Table name cannot be null or empty");
        }
        if (indexName == null || indexName.trim().isEmpty()) {
            throw new IllegalArgumentException("Index name cannot be null or empty");
        }

        try {
            LOGGER.info("Creating table: " + tableName + " with GSI: " + indexName);

            CreateTableRequest createTableRequest = CreateTableRequest.builder()
                .tableName(tableName)
                .attributeDefinitions(
                    AttributeDefinition.builder()
                        .attributeName("Artist")
                        .attributeType(ScalarAttributeType.S)
                        .build(),
                    AttributeDefinition.builder()
                        .attributeName("SongTitle")
                        .attributeType(ScalarAttributeType.S)
                        .build())
                .keySchema(
                    KeySchemaElement.builder()
                        .attributeName("Artist")
                        .keyType(KeyType.HASH)
                        .build(),
                    KeySchemaElement.builder()
                        .attributeName("SongTitle")
                        .keyType(KeyType.RANGE)
                        .build())
                .billingMode(BillingMode.PAY_PER_REQUEST)
                .globalSecondaryIndexes(GlobalSecondaryIndex.builder()
                    .indexName(indexName)
                    .keySchema(KeySchemaElement.builder()
                        .attributeName("SongTitle")
                        .keyType(KeyType.HASH)
                        .build())
                    .projection(
                        Projection.builder().projectionType(ProjectionType.ALL).build())
                    .build())
                .streamSpecification(StreamSpecification.builder()
                    .streamEnabled(true)
                    .streamViewType(StreamViewType.NEW_AND_OLD_IMAGES)
                    .build())
                .build();

            CreateTableResponse response = dynamoDbClient.createTable(createTableRequest);
            LOGGER.info("Table creation initiated. Status: "
                + response.tableDescription().tableStatus());

            return response;

        } catch (DynamoDbException e) {
            LOGGER.severe("Failed to create table: " + tableName + " - " + e.getMessage());
            throw e;
        }
    }
```
Aguarde até que uma tabela se torne ativa usando AWS SDK for Java 2.x.  

```
    public static void waitForTableActive(final DynamoDbClient dynamoDbClient, final String tableName) {

        if (dynamoDbClient == null) {
            throw new IllegalArgumentException("DynamoDB client cannot be null");
        }
        if (tableName == null || tableName.trim().isEmpty()) {
            throw new IllegalArgumentException("Table name cannot be null or empty");
        }

        try {
            LOGGER.info("Waiting for table to become active: " + tableName);

            try (DynamoDbWaiter waiter =
                DynamoDbWaiter.builder().client(dynamoDbClient).build()) {
                DescribeTableRequest request =
                    DescribeTableRequest.builder().tableName(tableName).build();

                waiter.waitUntilTableExists(request);
                LOGGER.info("Table is now active: " + tableName);
            }

        } catch (DynamoDbException e) {
            LOGGER.severe("Failed to wait for table to become active: " + tableName + " - " + e.getMessage());
            throw e;
        }
    }
```
Adicione uma réplica para criar ou estender uma tabela global usando AWS SDK for Java 2.x.  

```
    public static UpdateTableResponse addReplica(
        final DynamoDbClient dynamoDbClient,
        final String tableName,
        final Region replicaRegion,
        final String indexName,
        final Long readCapacity) {

        if (dynamoDbClient == null) {
            throw new IllegalArgumentException("DynamoDB client cannot be null");
        }
        if (tableName == null || tableName.trim().isEmpty()) {
            throw new IllegalArgumentException("Table name cannot be null or empty");
        }
        if (replicaRegion == null) {
            throw new IllegalArgumentException("Replica region cannot be null");
        }
        if (indexName == null || indexName.trim().isEmpty()) {
            throw new IllegalArgumentException("Index name cannot be null or empty");
        }
        if (readCapacity == null || readCapacity <= 0) {
            throw new IllegalArgumentException("Read capacity must be a positive number");
        }

        try {
            LOGGER.info("Adding replica in region: " + replicaRegion.id() + " for table: " + tableName);

            // Create a ReplicationGroupUpdate for adding a replica
            ReplicationGroupUpdate replicationGroupUpdate = ReplicationGroupUpdate.builder()
                .create(builder -> builder.regionName(replicaRegion.id())
                    .globalSecondaryIndexes(ReplicaGlobalSecondaryIndex.builder()
                        .indexName(indexName)
                        .provisionedThroughputOverride(ProvisionedThroughputOverride.builder()
                            .readCapacityUnits(readCapacity)
                            .build())
                        .build())
                    .build())
                .build();

            UpdateTableRequest updateTableRequest = UpdateTableRequest.builder()
                .tableName(tableName)
                .replicaUpdates(replicationGroupUpdate)
                .build();

            UpdateTableResponse response = dynamoDbClient.updateTable(updateTableRequest);
            LOGGER.info("Replica addition initiated in region: " + replicaRegion.id());

            return response;

        } catch (DynamoDbException e) {
            LOGGER.severe("Failed to add replica in region: " + replicaRegion.id() + " - " + e.getMessage());
            throw e;
        }
    }
```
Remova uma réplica de uma tabela global usando AWS SDK for Java 2.x.  

```
    public static UpdateTableResponse removeReplica(
        final DynamoDbClient dynamoDbClient, final String tableName, final Region replicaRegion) {

        if (dynamoDbClient == null) {
            throw new IllegalArgumentException("DynamoDB client cannot be null");
        }
        if (tableName == null || tableName.trim().isEmpty()) {
            throw new IllegalArgumentException("Table name cannot be null or empty");
        }
        if (replicaRegion == null) {
            throw new IllegalArgumentException("Replica region cannot be null");
        }

        try {
            LOGGER.info("Removing replica in region: " + replicaRegion.id() + " for table: " + tableName);

            // Create a ReplicationGroupUpdate for removing a replica
            ReplicationGroupUpdate replicationGroupUpdate = ReplicationGroupUpdate.builder()
                .delete(builder -> builder.regionName(replicaRegion.id()).build())
                .build();

            UpdateTableRequest updateTableRequest = UpdateTableRequest.builder()
                .tableName(tableName)
                .replicaUpdates(replicationGroupUpdate)
                .build();

            UpdateTableResponse response = dynamoDbClient.updateTable(updateTableRequest);
            LOGGER.info("Replica removal initiated in region: " + replicaRegion.id());

            return response;

        } catch (DynamoDbException e) {
            LOGGER.severe("Failed to remove replica in region: " + replicaRegion.id() + " - " + e.getMessage());
            throw e;
        }
    }
```
Adicione itens de teste para verificar a replicação usando AWS SDK for Java 2.x.  

```
    public static PutItemResponse putTestItem(
        final DynamoDbClient dynamoDbClient, final String tableName, final String artist, final String songTitle) {

        if (dynamoDbClient == null) {
            throw new IllegalArgumentException("DynamoDB client cannot be null");
        }
        if (tableName == null || tableName.trim().isEmpty()) {
            throw new IllegalArgumentException("Table name cannot be null or empty");
        }
        if (artist == null || artist.trim().isEmpty()) {
            throw new IllegalArgumentException("Artist cannot be null or empty");
        }
        if (songTitle == null || songTitle.trim().isEmpty()) {
            throw new IllegalArgumentException("Song title cannot be null or empty");
        }

        try {
            LOGGER.info("Adding test item to table: " + tableName);

            Map<String, software.amazon.awssdk.services.dynamodb.model.AttributeValue> item = new HashMap<>();
            item.put(
                "Artist",
                software.amazon.awssdk.services.dynamodb.model.AttributeValue.builder()
                    .s(artist)
                    .build());
            item.put(
                "SongTitle",
                software.amazon.awssdk.services.dynamodb.model.AttributeValue.builder()
                    .s(songTitle)
                    .build());

            PutItemRequest putItemRequest =
                PutItemRequest.builder().tableName(tableName).item(item).build();

            PutItemResponse response = dynamoDbClient.putItem(putItemRequest);
            LOGGER.info("Test item added successfully");

            return response;

        } catch (DynamoDbException e) {
            LOGGER.severe("Failed to add test item to table: " + tableName + " - " + e.getMessage());
            throw e;
        }
    }
```
Descreva a configuração e as réplicas da tabela global usando AWS SDK for Java 2.x.  

```
    public static DescribeTableResponse describeTable(final DynamoDbClient dynamoDbClient, final String tableName) {

        if (dynamoDbClient == null) {
            throw new IllegalArgumentException("DynamoDB client cannot be null");
        }
        if (tableName == null || tableName.trim().isEmpty()) {
            throw new IllegalArgumentException("Table name cannot be null or empty");
        }

        try {
            LOGGER.info("Describing table: " + tableName);

            DescribeTableRequest request =
                DescribeTableRequest.builder().tableName(tableName).build();

            DescribeTableResponse response = dynamoDbClient.describeTable(request);

            LOGGER.info("Table status: " + response.table().tableStatus());
            if (response.table().replicas() != null
                && !response.table().replicas().isEmpty()) {
                LOGGER.info("Number of replicas: " + response.table().replicas().size());
                response.table()
                    .replicas()
                    .forEach(replica -> LOGGER.info(
                        "Replica region: " + replica.regionName() + ", Status: " + replica.replicaStatus()));
            }

            return response;

        } catch (ResourceNotFoundException e) {
            LOGGER.severe("Table not found: " + tableName + " - " + e.getMessage());
            throw e;
        } catch (DynamoDbException e) {
            LOGGER.severe("Failed to describe table: " + tableName + " - " + e.getMessage());
            throw e;
        }
    }
```
Exemplo completo de operações de tabela global usando AWS SDK for Java 2.x.  

```
    public static void exampleUsage(final Region sourceRegion, final Region replicaRegion) {

        String tableName = "Music";
        String indexName = "SongTitleIndex";
        Long readCapacity = 15L;

        // Create DynamoDB client for the source region
        try (DynamoDbClient dynamoDbClient =
            DynamoDbClient.builder().region(sourceRegion).build()) {

            try {
                // Step 1: Create the initial table with GSI and streams
                LOGGER.info("Step 1: Creating table in source region: " + sourceRegion.id());
                createTableWithGSI(dynamoDbClient, tableName, indexName);

                // Step 2: Wait for table to become active
                LOGGER.info("Step 2: Waiting for table to become active");
                waitForTableActive(dynamoDbClient, tableName);

                // Step 3: Add replica in destination region
                LOGGER.info("Step 3: Adding replica in region: " + replicaRegion.id());
                addReplica(dynamoDbClient, tableName, replicaRegion, indexName, readCapacity);

                // Step 4: Wait a moment for replica creation to start
                Thread.sleep(5000);

                // Step 5: Describe table to view replica information
                LOGGER.info("Step 5: Describing table to view replicas");
                describeTable(dynamoDbClient, tableName);

                // Step 6: Add a test item to verify replication
                LOGGER.info("Step 6: Adding test item to verify replication");
                putTestItem(dynamoDbClient, tableName, "TestArtist", "TestSong");

                LOGGER.info("Global table setup completed successfully!");
                LOGGER.info("You can verify replication by checking the item in region: " + replicaRegion.id());

                // Step 7: Remove replica and clean up table
                LOGGER.info("Step 7: Removing replica from region: " + replicaRegion.id());
                removeReplica(dynamoDbClient, tableName, replicaRegion);
                DeleteTableResponse deleteTableResponse = dynamoDbClient.deleteTable(
                    DeleteTableRequest.builder().tableName(tableName).build());
                LOGGER.info("MREC global table demonstration completed successfully!");

            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
                throw new RuntimeException("Thread was interrupted", e);
            } catch (DynamoDbException e) {
                LOGGER.severe("DynamoDB operation failed: " + e.getMessage());
                throw e;
            }
        }
    }
```
+ Para obter detalhes da API, consulte os tópicos a seguir na *Referência da API AWS SDK for Java 2.x*.
  + [CreateTable](https://docs.aws.amazon.com/goto/SdkForJavaV2/dynamodb-2012-08-10/CreateTable)
  + [DescribeTable](https://docs.aws.amazon.com/goto/SdkForJavaV2/dynamodb-2012-08-10/DescribeTable)
  + [PutItem](https://docs.aws.amazon.com/goto/SdkForJavaV2/dynamodb-2012-08-10/PutItem)
  + [UpdateTable](https://docs.aws.amazon.com/goto/SdkForJavaV2/dynamodb-2012-08-10/UpdateTable)

------

## Criação de uma tabela global configurada para MRSC
<a name="create-gt-mrsc"></a>

Esta seção mostra como criar uma tabela global de consistência forte multirregional (MRSC). As tabelas globais do MRSC replicam de forma síncrona as alterações de itens em todas as regiões, garantindo que as operações de leitura altamente consistentes em qualquer réplica sempre retornem a versão mais recente de um item. Ao converter uma tabela de região única em uma tabela global com MRSC, você deve garantir que a tabela esteja vazia. Não é possível converter uma tabela de região única em uma tabela global com MRSC que já contenha itens. Nenhum dado deve ser gravado na tabela durante o processo de conversão.

Você pode configurar uma tabela global MRSC com três réplicas ou duas réplicas e uma testemunha. Ao criar uma tabela global do MRSC, você escolhe as regiões em que as réplicas e uma testemunha opcional são implantadas. O exemplo a seguir cria uma tabela global MRSC com réplicas nas regiões Leste dos EUA (Norte da Virgínia) e Leste dos EUA (Ohio), com uma testemunha na região Oeste dos EUA (Oregon).

**nota**  
Antes de criar uma tabela global, verifique se os limites de throughput da cota de serviço são consistentes em todas as regiões de destino, pois isso é necessário para criar uma tabela global. Para ter mais informações sobre os limites globais de throughput de tabelas, consulte as [cotas para tabelas globais](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ServiceQuotas.html#gt-limits-throughput).

### Criação de uma tabela global MRSC usando o DynamoDB Console
<a name="mrsc_console"></a>

Siga estas etapas para criar uma tabela global MRSC usando o Console de gerenciamento da AWS.

1. Faça login no Console de gerenciamento da AWS e abra o console do DynamoDB em [https://console.aws.amazon.com/dynamodb/](https://console.aws.amazon.com/dynamodb/).

1. No seletor de regiões na barra de navegação, escolha a região onde as tabelas globais com MRSC são [aceitas](V2globaltables_HowItWorks.md#V2globaltables_HowItWorks.consistency-modes), por exemplo, **us-east-2**.

1. No painel de navegação, selecione **Tabelas**.

1. Escolha **Criar tabela**.

1. Na página **Criar tabela**:

   1. Em **Table name** (Nome da tabela), insira **Music**.

   1. Para a **Chave de partição**, insira **Artist** e mantenha o tipo **String** padrão.

   1. Em **Chave de classificação**, insira **SongTitle** e mantenha o tipo **String** padrão.

   1. Mantenha o restante das configurações padrão e escolha **Criar tabela**.

      Essa nova tabela serve como a primeira tabela de réplica em uma nova tabela global. Ela é o protótipo das outras tabelas-réplica que serão adicionadas posteriormente.

1. Aguarde até que a tabela fique ativa e, em seguida, selecione-a na lista de tabelas.

1. Selecione a guia **Tabelas globais** e escolha **Criar réplica**.

1. Na página **Criar réplica**:

   1. Em **Consistência multirregional**, escolha **Consistência forte**.

   1. Para a **Região de Replicação 1**, escolha **US East (N. Virginia) us-east-1**.

   1. Para a **Região de Replicação 2**, escolha **US West (Oregon) us-west-2**.

   1. Marque **Configurar como Testemunha** para a região Oeste dos EUA (Oregon).

   1. Escolha **Criar réplicas**.

1. Aguarde a conclusão do processo de criação da réplica e da testemunha. O status da tabela será exibido como **Ativo** quando a tabela estiver pronta para uso.

### Criar uma tabela global MRSC usando a AWS CLI ou Java
<a name="mrsc-cli-java"></a>

Antes de começar, verifique se a entidade principal do IAM tem as permissões necessárias para criar uma tabela global com MRSC com uma região testemunha.

O seguinte exemplo de política do IAM permite que você crie uma tabela do DynamoDB (`MusicTable`) no Leste dos EUA (Ohio) com uma réplica no Leste dos EUA (Norte da Virgínia) e uma região testemunha no Oeste dos EUA (Oregon):

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "dynamodb:CreateTable",
                "dynamodb:CreateTableReplica",
                "dynamodb:CreateGlobalTableWitness",
                "dynamodb:DescribeTable",
                "dynamodb:UpdateTable",
                "dynamodb:DeleteTable",
                "dynamodb:DeleteTableReplica",
                "dynamodb:DeleteGlobalTableWitness",
                "dynamodb:Scan",
                "dynamodb:Query",
                "dynamodb:UpdateItem",
                "dynamodb:PutItem",
                "dynamodb:GetItem",
                "dynamodb:DeleteItem",
                "dynamodb:BatchWriteItem"
            ],
            "Resource": [
                "arn:aws:dynamodb:us-east-1:123456789012:table/MusicTable",
                "arn:aws:dynamodb:us-east-2:123456789012:table/MusicTable",
                "arn:aws:dynamodb:us-west-2:123456789012:table/MusicTable"
            ]
        },
        {
            "Effect": "Allow",
            "Action": "iam:CreateServiceLinkedRole",
            "Resource": "arn:aws:iam::*:role/aws-service-role/replication.dynamodb.amazonaws.com/AWSServiceRoleForDynamoDBReplication",
            "Condition": {
                "StringLike": {
                    "iam:AWSServiceName": "replication.dynamodb.amazonaws.com"
                }
            }
        }
    ]
}
```

------

O exemplo de código a seguir mostra como criar e gerenciar tabelas globais do DynamoDB com consistência forte multirregional (MRSC).
+ Crie uma tabela com consistência forte multirregional.
+ Verifique a configuração de MRSC e o status da réplica.
+ Teste a consistência forte entre regiões com leituras imediatas.
+ Faça gravações condicionais com garantia de MRSC.
+ Limpe os recursos da tabela global com MRSC.

------
#### [ Bash ]

**AWS CLI com script Bash**  
Crie uma tabela com consistência forte multirregional.  

```
# Step 1: Create a new table in us-east-2 (primary region for MRSC)
# Note: Table must be empty when enabling MRSC
aws dynamodb create-table \
    --table-name MusicTable \
    --attribute-definitions \
        AttributeName=Artist,AttributeType=S \
        AttributeName=SongTitle,AttributeType=S \
    --key-schema \
        AttributeName=Artist,KeyType=HASH \
        AttributeName=SongTitle,KeyType=RANGE \
    --billing-mode PAY_PER_REQUEST \
    --region us-east-2

# Wait for table to become active
aws dynamodb wait table-exists --table-name MusicTable --region us-east-2

# Step 2: Add replica and witness with Multi-Region Strong Consistency
# MRSC requires exactly three replicas in supported regions
aws dynamodb update-table \
    --table-name MusicTable \
    --replica-updates '[{"Create": {"RegionName": "us-east-1"}}]' \
    --global-table-witness-updates '[{"Create": {"RegionName": "us-west-2"}}]' \
    --multi-region-consistency STRONG \
    --region us-east-2
```
Verifique a configuração de MRSC e o status da réplica.  

```
# Verify the global table configuration and MRSC setting
aws dynamodb describe-table \
    --table-name MusicTable \
    --region us-east-2 \
    --query 'Table.{TableName:TableName,TableStatus:TableStatus,MultiRegionConsistency:MultiRegionConsistency,Replicas:Replicas[*],GlobalTableWitnesses:GlobalTableWitnesses[*].{Region:RegionName,Status:ReplicaStatus}}'
```
Teste a consistência forte com leituras imediatas entre regiões.  

```
# Write an item to the primary region
aws dynamodb put-item \
    --table-name MusicTable \
    --item '{"Artist": {"S":"The Beatles"},"SongTitle": {"S":"Hey Jude"},"Album": {"S":"The Beatles 1967-1970"},"Year": {"N":"1968"}}' \
    --region us-east-2

# Read the item from replica region to verify strong consistency (cannot read or write to witness)
# No wait time needed - MRSC provides immediate consistency
echo "Reading from us-east-1 (immediate consistency):"
aws dynamodb get-item \
    --table-name MusicTable \
    --key '{"Artist": {"S":"The Beatles"},"SongTitle": {"S":"Hey Jude"}}' \
    --consistent-read \
    --region us-east-1
```
Faça gravações condicionais com garantia de MRSC.  

```
# Perform a conditional update from a different region
# This demonstrates that conditions work consistently across all regions
aws dynamodb update-item \
    --table-name MusicTable \
    --key '{"Artist": {"S":"The Beatles"},"SongTitle": {"S":"Hey Jude"}}' \
    --update-expression "SET #rating = :rating" \
    --condition-expression "attribute_exists(Artist)" \
    --expression-attribute-names '{"#rating": "Rating"}' \
    --expression-attribute-values '{":rating": {"N":"5"}}' \
    --region us-east-1
```
Limpe os recursos da tabela global com MRSC.  

```
# Remove replica tables (must be done before deleting the primary table)
aws dynamodb update-table \
    --table-name MusicTable \
    --replica-updates '[{"Delete": {"RegionName": "us-east-1"}}]' \
    --global-table-witness-updates '[{"Delete": {"RegionName": "us-west-2"}}]' \
    --region us-east-2

# Wait for replicas to be deleted
echo "Waiting for replicas to be deleted..."
sleep 30

# Delete the primary table
aws dynamodb delete-table \
    --table-name MusicTable \
    --region us-east-2
```
+ Consulte detalhes da API nos tópicos a seguir na *Referência de comandos da AWS CLI*.
  + [CreateTable](https://docs.aws.amazon.com/goto/aws-cli/dynamodb-2012-08-10/CreateTable)
  + [DeleteTable](https://docs.aws.amazon.com/goto/aws-cli/dynamodb-2012-08-10/DeleteTable)
  + [DescribeTable](https://docs.aws.amazon.com/goto/aws-cli/dynamodb-2012-08-10/DescribeTable)
  + [GetItem](https://docs.aws.amazon.com/goto/aws-cli/dynamodb-2012-08-10/GetItem)
  + [PutItem](https://docs.aws.amazon.com/goto/aws-cli/dynamodb-2012-08-10/PutItem)
  + [UpdateItem](https://docs.aws.amazon.com/goto/aws-cli/dynamodb-2012-08-10/UpdateItem)
  + [UpdateTable](https://docs.aws.amazon.com/goto/aws-cli/dynamodb-2012-08-10/UpdateTable)

------
#### [ Java ]

**SDK para Java 2.x**  
Crie uma tabela regional pronta para conversão MRSC usando AWS SDK for Java 2.x.  

```
    public static CreateTableResponse createRegionalTable(final DynamoDbClient dynamoDbClient, final String tableName) {

        if (dynamoDbClient == null) {
            throw new IllegalArgumentException("DynamoDB client cannot be null");
        }
        if (tableName == null || tableName.trim().isEmpty()) {
            throw new IllegalArgumentException("Table name cannot be null or empty");
        }

        try {
            LOGGER.info("Creating regional table: " + tableName + " (must be empty for MRSC)");

            CreateTableRequest createTableRequest = CreateTableRequest.builder()
                .tableName(tableName)
                .attributeDefinitions(
                    AttributeDefinition.builder()
                        .attributeName("Artist")
                        .attributeType(ScalarAttributeType.S)
                        .build(),
                    AttributeDefinition.builder()
                        .attributeName("SongTitle")
                        .attributeType(ScalarAttributeType.S)
                        .build())
                .keySchema(
                    KeySchemaElement.builder()
                        .attributeName("Artist")
                        .keyType(KeyType.HASH)
                        .build(),
                    KeySchemaElement.builder()
                        .attributeName("SongTitle")
                        .keyType(KeyType.RANGE)
                        .build())
                .billingMode(BillingMode.PAY_PER_REQUEST)
                .build();

            CreateTableResponse response = dynamoDbClient.createTable(createTableRequest);
            LOGGER.info("Regional table creation initiated. Status: "
                + response.tableDescription().tableStatus());

            return response;

        } catch (DynamoDbException e) {
            LOGGER.severe("Failed to create regional table: " + tableName + " - " + e.getMessage());
            throw DynamoDbException.builder()
                .message("Failed to create regional table: " + tableName)
                .cause(e)
                .build();
        }
    }
```
Converta uma tabela regional para MRSC com réplicas e testemunhas usando AWS SDK for Java 2.x.  

```
    public static UpdateTableResponse convertToMRSCWithWitness(
        final DynamoDbClient dynamoDbClient,
        final String tableName,
        final Region replicaRegion,
        final Region witnessRegion) {

        if (dynamoDbClient == null) {
            throw new IllegalArgumentException("DynamoDB client cannot be null");
        }
        if (tableName == null || tableName.trim().isEmpty()) {
            throw new IllegalArgumentException("Table name cannot be null or empty");
        }
        if (replicaRegion == null) {
            throw new IllegalArgumentException("Replica region cannot be null");
        }
        if (witnessRegion == null) {
            throw new IllegalArgumentException("Witness region cannot be null");
        }

        try {
            LOGGER.info("Converting table to MRSC with replica in " + replicaRegion.id() + " and witness in "
                + witnessRegion.id());

            // Create replica update using ReplicationGroupUpdate
            ReplicationGroupUpdate replicaUpdate = ReplicationGroupUpdate.builder()
                .create(CreateReplicationGroupMemberAction.builder()
                    .regionName(replicaRegion.id())
                    .build())
                .build();

            // Create witness update
            GlobalTableWitnessGroupUpdate witnessUpdate = GlobalTableWitnessGroupUpdate.builder()
                .create(CreateGlobalTableWitnessGroupMemberAction.builder()
                    .regionName(witnessRegion.id())
                    .build())
                .build();

            UpdateTableRequest updateTableRequest = UpdateTableRequest.builder()
                .tableName(tableName)
                .replicaUpdates(List.of(replicaUpdate))
                .globalTableWitnessUpdates(List.of(witnessUpdate))
                .multiRegionConsistency(MultiRegionConsistency.STRONG)
                .build();

            UpdateTableResponse response = dynamoDbClient.updateTable(updateTableRequest);
            LOGGER.info("MRSC conversion initiated. Status: "
                + response.tableDescription().tableStatus());
            LOGGER.info("UpdateTableResponse full object: " + response);
            return response;

        } catch (DynamoDbException e) {
            LOGGER.severe("Failed to convert table to MRSC: " + tableName + " - " + e.getMessage());
            throw DynamoDbException.builder()
                .message("Failed to convert table to MRSC: " + tableName)
                .cause(e)
                .build();
        }
    }
```
Descreva uma configuração de tabela global do MRSC usando AWS SDK for Java 2.x.  

```
    public static DescribeTableResponse describeMRSCTable(final DynamoDbClient dynamoDbClient, final String tableName) {

        if (dynamoDbClient == null) {
            throw new IllegalArgumentException("DynamoDB client cannot be null");
        }
        if (tableName == null || tableName.trim().isEmpty()) {
            throw new IllegalArgumentException("Table name cannot be null or empty");
        }

        try {
            LOGGER.info("Describing MRSC global table: " + tableName);

            DescribeTableRequest request =
                DescribeTableRequest.builder().tableName(tableName).build();

            DescribeTableResponse response = dynamoDbClient.describeTable(request);

            LOGGER.info("Table status: " + response.table().tableStatus());
            LOGGER.info("Multi-region consistency: " + response.table().multiRegionConsistency());

            if (response.table().replicas() != null
                && !response.table().replicas().isEmpty()) {
                LOGGER.info("Number of replicas: " + response.table().replicas().size());
                response.table()
                    .replicas()
                    .forEach(replica -> LOGGER.info(
                        "Replica region: " + replica.regionName() + ", Status: " + replica.replicaStatus()));
            }

            if (response.table().globalTableWitnesses() != null
                && !response.table().globalTableWitnesses().isEmpty()) {
                LOGGER.info("Number of witnesses: "
                    + response.table().globalTableWitnesses().size());
                response.table()
                    .globalTableWitnesses()
                    .forEach(witness -> LOGGER.info(
                        "Witness region: " + witness.regionName() + ", Status: " + witness.witnessStatus()));
            }

            return response;

        } catch (ResourceNotFoundException e) {
            LOGGER.severe("Table not found: " + tableName + " - " + e.getMessage());
            throw DynamoDbException.builder()
                .message("Table not found: " + tableName)
                .cause(e)
                .build();
        } catch (DynamoDbException e) {
            LOGGER.severe("Failed to describe table: " + tableName + " - " + e.getMessage());
            throw DynamoDbException.builder()
                .message("Failed to describe table: " + tableName)
                .cause(e)
                .build();
        }
    }
```
Adicione itens de teste para verificar a forte consistência do MRSC usando AWS SDK for Java 2.x.  

```
    public static PutItemResponse putTestItem(
        final DynamoDbClient dynamoDbClient,
        final String tableName,
        final String artist,
        final String songTitle,
        final String album,
        final String year) {

        if (dynamoDbClient == null) {
            throw new IllegalArgumentException("DynamoDB client cannot be null");
        }
        if (tableName == null || tableName.trim().isEmpty()) {
            throw new IllegalArgumentException("Table name cannot be null or empty");
        }
        if (artist == null || artist.trim().isEmpty()) {
            throw new IllegalArgumentException("Artist cannot be null or empty");
        }
        if (songTitle == null || songTitle.trim().isEmpty()) {
            throw new IllegalArgumentException("Song title cannot be null or empty");
        }

        try {
            LOGGER.info("Adding test item to MRSC global table: " + tableName);

            Map<String, AttributeValue> item = new HashMap<>();
            item.put("Artist", AttributeValue.builder().s(artist).build());
            item.put("SongTitle", AttributeValue.builder().s(songTitle).build());

            if (album != null && !album.trim().isEmpty()) {
                item.put("Album", AttributeValue.builder().s(album).build());
            }
            if (year != null && !year.trim().isEmpty()) {
                item.put("Year", AttributeValue.builder().n(year).build());
            }

            PutItemRequest putItemRequest =
                PutItemRequest.builder().tableName(tableName).item(item).build();

            PutItemResponse response = dynamoDbClient.putItem(putItemRequest);
            LOGGER.info("Test item added successfully with strong consistency");

            return response;

        } catch (DynamoDbException e) {
            LOGGER.severe("Failed to add test item to table: " + tableName + " - " + e.getMessage());
            throw DynamoDbException.builder()
                .message("Failed to add test item to table: " + tableName)
                .cause(e)
                .build();
        }
    }
```
Leia itens com leituras consistentes de réplicas do MRSC usando AWS SDK for Java 2.x.  

```
    public static GetItemResponse getItemWithConsistentRead(
        final DynamoDbClient dynamoDbClient, final String tableName, final String artist, final String songTitle) {

        if (dynamoDbClient == null) {
            throw new IllegalArgumentException("DynamoDB client cannot be null");
        }
        if (tableName == null || tableName.trim().isEmpty()) {
            throw new IllegalArgumentException("Table name cannot be null or empty");
        }
        if (artist == null || artist.trim().isEmpty()) {
            throw new IllegalArgumentException("Artist cannot be null or empty");
        }
        if (songTitle == null || songTitle.trim().isEmpty()) {
            throw new IllegalArgumentException("Song title cannot be null or empty");
        }

        try {
            LOGGER.info("Reading item from MRSC global table with consistent read: " + tableName);

            Map<String, AttributeValue> key = new HashMap<>();
            key.put("Artist", AttributeValue.builder().s(artist).build());
            key.put("SongTitle", AttributeValue.builder().s(songTitle).build());

            GetItemRequest getItemRequest = GetItemRequest.builder()
                .tableName(tableName)
                .key(key)
                .consistentRead(true)
                .build();

            GetItemResponse response = dynamoDbClient.getItem(getItemRequest);

            if (response.hasItem()) {
                LOGGER.info("Item found with strong consistency - no wait time needed");
            } else {
                LOGGER.info("Item not found");
            }

            return response;

        } catch (DynamoDbException e) {
            LOGGER.severe("Failed to read item from table: " + tableName + " - " + e.getMessage());
            throw DynamoDbException.builder()
                .message("Failed to read item from table: " + tableName)
                .cause(e)
                .build();
        }
    }
```
Faça atualizações condicionais com garantias de MRSC usando AWS SDK for Java 2.x.  

```
    public static UpdateItemResponse performConditionalUpdate(
        final DynamoDbClient dynamoDbClient,
        final String tableName,
        final String artist,
        final String songTitle,
        final String rating) {

        if (dynamoDbClient == null) {
            throw new IllegalArgumentException("DynamoDB client cannot be null");
        }
        if (tableName == null || tableName.trim().isEmpty()) {
            throw new IllegalArgumentException("Table name cannot be null or empty");
        }
        if (artist == null || artist.trim().isEmpty()) {
            throw new IllegalArgumentException("Artist cannot be null or empty");
        }
        if (songTitle == null || songTitle.trim().isEmpty()) {
            throw new IllegalArgumentException("Song title cannot be null or empty");
        }
        if (rating == null || rating.trim().isEmpty()) {
            throw new IllegalArgumentException("Rating cannot be null or empty");
        }

        try {
            LOGGER.info("Performing conditional update on MRSC global table: " + tableName);

            Map<String, AttributeValue> key = new HashMap<>();
            key.put("Artist", AttributeValue.builder().s(artist).build());
            key.put("SongTitle", AttributeValue.builder().s(songTitle).build());

            Map<String, String> expressionAttributeNames = new HashMap<>();
            expressionAttributeNames.put("#rating", "Rating");

            Map<String, AttributeValue> expressionAttributeValues = new HashMap<>();
            expressionAttributeValues.put(
                ":rating", AttributeValue.builder().n(rating).build());

            UpdateItemRequest updateItemRequest = UpdateItemRequest.builder()
                .tableName(tableName)
                .key(key)
                .updateExpression("SET #rating = :rating")
                .conditionExpression("attribute_exists(Artist)")
                .expressionAttributeNames(expressionAttributeNames)
                .expressionAttributeValues(expressionAttributeValues)
                .build();

            UpdateItemResponse response = dynamoDbClient.updateItem(updateItemRequest);
            LOGGER.info("Conditional update successful - demonstrates strong consistency");

            return response;

        } catch (ConditionalCheckFailedException e) {
            LOGGER.warning("Conditional check failed: " + e.getMessage());
            throw e;
        } catch (DynamoDbException e) {
            LOGGER.severe("Failed to perform conditional update: " + tableName + " - " + e.getMessage());
            throw DynamoDbException.builder()
                .message("Failed to perform conditional update: " + tableName)
                .cause(e)
                .build();
        }
    }
```
Aguarde até que as réplicas e testemunhas do MRSC se tornem ativas usando AWS SDK for Java 2.x.  

```
    public static void waitForMRSCReplicasActive(
        final DynamoDbClient dynamoDbClient, final String tableName, final int maxWaitTimeSeconds)
        throws InterruptedException {

        if (dynamoDbClient == null) {
            throw new IllegalArgumentException("DynamoDB client cannot be null");
        }
        if (tableName == null || tableName.trim().isEmpty()) {
            throw new IllegalArgumentException("Table name cannot be null or empty");
        }
        if (maxWaitTimeSeconds <= 0) {
            throw new IllegalArgumentException("Max wait time must be positive");
        }

        try {
            LOGGER.info("Waiting for MRSC replicas and witnesses to become active: " + tableName);

            final long startTime = System.currentTimeMillis();
            final long maxWaitTimeMillis = maxWaitTimeSeconds * 1000L;
            int backoffSeconds = 5; // Start with 5 second intervals
            final int maxBackoffSeconds = 30; // Cap at 30 seconds

            while (System.currentTimeMillis() - startTime < maxWaitTimeMillis) {
                DescribeTableResponse response = describeMRSCTable(dynamoDbClient, tableName);

                boolean allActive = true;
                StringBuilder statusReport = new StringBuilder();

                if (response.table().multiRegionConsistency() == null
                    || !MultiRegionConsistency.STRONG
                        .toString()
                        .equals(response.table().multiRegionConsistency().toString())) {
                    allActive = false;
                    statusReport
                        .append("MultiRegionConsistency: ")
                        .append(response.table().multiRegionConsistency())
                        .append(" ");
                }
                if (response.table().replicas() == null
                    || response.table().replicas().isEmpty()) {
                    allActive = false;
                    statusReport.append("No replicas found. ");
                }
                if (response.table().globalTableWitnesses() == null
                    || response.table().globalTableWitnesses().isEmpty()) {
                    allActive = false;
                    statusReport.append("No witnesses found. ");
                }

                // Check table status
                if (!"ACTIVE".equals(response.table().tableStatus().toString())) {
                    allActive = false;
                    statusReport
                        .append("Table: ")
                        .append(response.table().tableStatus())
                        .append(" ");
                }

                // Check replica status
                if (response.table().replicas() != null) {
                    for (var replica : response.table().replicas()) {
                        if (!"ACTIVE".equals(replica.replicaStatus().toString())) {
                            allActive = false;
                            statusReport
                                .append("Replica(")
                                .append(replica.regionName())
                                .append("): ")
                                .append(replica.replicaStatus())
                                .append(" ");
                        }
                    }
                }

                // Check witness status
                if (response.table().globalTableWitnesses() != null) {
                    for (var witness : response.table().globalTableWitnesses()) {
                        if (!"ACTIVE".equals(witness.witnessStatus().toString())) {
                            allActive = false;
                            statusReport
                                .append("Witness(")
                                .append(witness.regionName())
                                .append("): ")
                                .append(witness.witnessStatus())
                                .append(" ");
                        }
                    }
                }

                if (allActive) {
                    LOGGER.info("All MRSC replicas and witnesses are now active: " + tableName);
                    return;
                }

                LOGGER.info("Waiting for MRSC components to become active. Status: " + statusReport.toString());
                LOGGER.info("Next check in " + backoffSeconds + " seconds...");

                tempWait(backoffSeconds);

                // Exponential backoff with cap
                backoffSeconds = Math.min(backoffSeconds * 2, maxBackoffSeconds);
            }

            throw DynamoDbException.builder()
                .message("Timeout waiting for MRSC replicas to become active after " + maxWaitTimeSeconds + " seconds")
                .build();

        } catch (DynamoDbException | InterruptedException e) {
            LOGGER.severe("Failed to wait for MRSC replicas to become active: " + tableName + " - " + e.getMessage());
            throw e;
        }
    }
```
Limpe as réplicas e testemunhas do MRSC usando AWS SDK for Java 2.x.  

```
    public static UpdateTableResponse cleanupMRSCReplicas(
        final DynamoDbClient dynamoDbClient,
        final String tableName,
        final Region replicaRegion,
        final Region witnessRegion) {

        if (dynamoDbClient == null) {
            throw new IllegalArgumentException("DynamoDB client cannot be null");
        }
        if (tableName == null || tableName.trim().isEmpty()) {
            throw new IllegalArgumentException("Table name cannot be null or empty");
        }
        if (replicaRegion == null) {
            throw new IllegalArgumentException("Replica region cannot be null");
        }
        if (witnessRegion == null) {
            throw new IllegalArgumentException("Witness region cannot be null");
        }

        try {
            LOGGER.info("Cleaning up MRSC replicas and witnesses for table: " + tableName);

            // Remove replica using ReplicationGroupUpdate
            ReplicationGroupUpdate replicaUpdate = ReplicationGroupUpdate.builder()
                .delete(DeleteReplicationGroupMemberAction.builder()
                    .regionName(replicaRegion.id())
                    .build())
                .build();

            // Remove witness
            GlobalTableWitnessGroupUpdate witnessUpdate = GlobalTableWitnessGroupUpdate.builder()
                .delete(DeleteGlobalTableWitnessGroupMemberAction.builder()
                    .regionName(witnessRegion.id())
                    .build())
                .build();

            UpdateTableRequest updateTableRequest = UpdateTableRequest.builder()
                .tableName(tableName)
                .replicaUpdates(List.of(replicaUpdate))
                .globalTableWitnessUpdates(List.of(witnessUpdate))
                .build();

            UpdateTableResponse response = dynamoDbClient.updateTable(updateTableRequest);
            LOGGER.info("MRSC cleanup initiated - removing replica and witness. Response: " + response);

            return response;

        } catch (DynamoDbException e) {
            LOGGER.severe("Failed to cleanup MRSC replicas: " + tableName + " - " + e.getMessage());
            throw DynamoDbException.builder()
                .message("Failed to cleanup MRSC replicas: " + tableName)
                .cause(e)
                .build();
        }
    }
```
Demonstração completa do fluxo de trabalho do MRSC usando AWS SDK for Java 2.x.  

```
    public static void demonstrateCompleteMRSCWorkflow(
        final DynamoDbClient primaryClient,
        final DynamoDbClient replicaClient,
        final String tableName,
        final Region replicaRegion,
        final Region witnessRegion)
        throws InterruptedException {

        if (primaryClient == null) {
            throw new IllegalArgumentException("Primary DynamoDB client cannot be null");
        }
        if (replicaClient == null) {
            throw new IllegalArgumentException("Replica DynamoDB client cannot be null");
        }
        if (tableName == null || tableName.trim().isEmpty()) {
            throw new IllegalArgumentException("Table name cannot be null or empty");
        }
        if (replicaRegion == null) {
            throw new IllegalArgumentException("Replica region cannot be null");
        }
        if (witnessRegion == null) {
            throw new IllegalArgumentException("Witness region cannot be null");
        }

        try {
            LOGGER.info("=== Starting Complete MRSC Workflow Demonstration ===");

            // Step 1: Create an empty single-Region table
            LOGGER.info("Step 1: Creating empty single-Region table");
            createRegionalTable(primaryClient, tableName);

            // Use the existing GlobalTableOperations method for basic table waiting
            LOGGER.info("Intermediate step: Waiting for table [" + tableName + "] to become active before continuing");
            GlobalTableOperations.waitForTableActive(primaryClient, tableName);

            // Step 2: Convert to MRSC with replica and witness
            LOGGER.info("Step 2: Converting to MRSC with replica and witness");
            convertToMRSCWithWitness(primaryClient, tableName, replicaRegion, witnessRegion);

            // Wait for MRSC conversion to complete using MRSC-specific waiter
            LOGGER.info("Waiting for MRSC conversion to complete...");
            waitForMRSCReplicasActive(primaryClient, tableName);

            LOGGER.info("Intermediate step: Waiting for table [" + tableName + "] to become active before continuing");
            GlobalTableOperations.waitForTableActive(primaryClient, tableName);

            // Step 3: Verify MRSC configuration
            LOGGER.info("Step 3: Verifying MRSC configuration");
            describeMRSCTable(primaryClient, tableName);

            // Step 4: Test strong consistency with data operations
            LOGGER.info("Step 4: Testing strong consistency with data operations");

            // Add test item to primary region
            putTestItem(primaryClient, tableName, "The Beatles", "Hey Jude", "The Beatles 1967-1970", "1968");

            // Immediately read from replica region (no wait needed with MRSC)
            LOGGER.info("Reading from replica region immediately (strong consistency):");
            GetItemResponse getResponse =
                getItemWithConsistentRead(replicaClient, tableName, "The Beatles", "Hey Jude");

            if (getResponse.hasItem()) {
                LOGGER.info("✓ Strong consistency verified - item immediately available in replica region");
            } else {
                LOGGER.warning("✗ Item not found in replica region");
            }

            // Test conditional update from replica region
            LOGGER.info("Testing conditional update from replica region:");
            performConditionalUpdate(replicaClient, tableName, "The Beatles", "Hey Jude", "5");
            LOGGER.info("✓ Conditional update successful - demonstrates strong consistency");

            // Step 5: Cleanup
            LOGGER.info("Step 5: Cleaning up resources");
            cleanupMRSCReplicas(primaryClient, tableName, replicaRegion, witnessRegion);

            // Wait for cleanup to complete using basic table waiter
            LOGGER.info("Waiting for replica cleanup to complete...");
            GlobalTableOperations.waitForTableActive(primaryClient, tableName);

            // "Halt" until replica/witness cleanup is complete
            DescribeTableResponse cleanupVerification = describeMRSCTable(primaryClient, tableName);
            int backoffSeconds = 5; // Start with 5 second intervals
            while (cleanupVerification.table().multiRegionConsistency() != null) {
                LOGGER.info("Waiting additional time (" + backoffSeconds + " seconds) for MRSC cleanup to complete...");
                tempWait(backoffSeconds);

                // Exponential backoff with cap
                backoffSeconds = Math.min(backoffSeconds * 2, 30);
                cleanupVerification = describeMRSCTable(primaryClient, tableName);
            }

            // Delete the primary table
            deleteTable(primaryClient, tableName);

            LOGGER.info("=== MRSC Workflow Demonstration Complete ===");
            LOGGER.info("");
            LOGGER.info("Key benefits of Multi-Region Strong Consistency (MRSC):");
            LOGGER.info("- Immediate consistency across all regions (no eventual consistency delays)");
            LOGGER.info("- Simplified application logic (no need to handle eventual consistency)");
            LOGGER.info("- Support for conditional writes and transactions across regions");
            LOGGER.info("- Consistent read operations from any region without waiting");

        } catch (DynamoDbException | InterruptedException e) {
            LOGGER.severe("MRSC workflow failed: " + e.getMessage());
            throw e;
        }
    }
```
+ Para obter detalhes da API, consulte os tópicos a seguir na *Referência da API AWS SDK for Java 2.x*.
  + [CreateTable](https://docs.aws.amazon.com/goto/SdkForJavaV2/dynamodb-2012-08-10/CreateTable)
  + [DeleteTable](https://docs.aws.amazon.com/goto/SdkForJavaV2/dynamodb-2012-08-10/DeleteTable)
  + [DescribeTable](https://docs.aws.amazon.com/goto/SdkForJavaV2/dynamodb-2012-08-10/DescribeTable)
  + [GetItem](https://docs.aws.amazon.com/goto/SdkForJavaV2/dynamodb-2012-08-10/GetItem)
  + [PutItem](https://docs.aws.amazon.com/goto/SdkForJavaV2/dynamodb-2012-08-10/PutItem)
  + [UpdateItem](https://docs.aws.amazon.com/goto/SdkForJavaV2/dynamodb-2012-08-10/UpdateItem)
  + [UpdateTable](https://docs.aws.amazon.com/goto/SdkForJavaV2/dynamodb-2012-08-10/UpdateTable)

------

# Segurança de tabelas globais do DynamoDB
<a name="globaltables-security"></a>

As réplicas de tabelas globais são tabelas do DynamoDB, então você usa os mesmos métodos para controlar o acesso às réplicas que usa para tabelas de região única, incluindo políticas de identidade e políticas baseadas em recursos do AWS Identity and Access Management (IAM).

Este tópico aborda como proteger tabelas globais do DynamoDB usando permissões do IAM e criptografia AWS Key Management Service (AWS KMS). Você aprenderá mais sobre os perfis vinculados a serviços (SLR) que permitem a replicação e o ajuste de escala automático entre regiões, as permissões do IAM necessárias para criar, atualizar e excluir tabelas globais e as diferenças entre as tabelas com consistência final multirregional (MREC) e com consistência forte multirregional (MRSC). Você também aprenderá mais sobre chaves de criptografia do AWS KMS para gerenciar a replicação entre regiões com segurança.

## Perfis vinculados a serviços para tabelas globais
<a name="globaltables-slr"></a>

As tabelas globais do DynamoDB dependem de perfis vinculados a serviços (SLRs) para gerenciar a replicação entre regiões e os recursos de ajuste de escala automático.

Você precisa configurar esses perfis somente uma vez por conta da AWS. Depois de criados, os mesmos perfis atendem a todas as tabelas globais da sua conta. Para ter mais informações sobre perfis vinculados ao serviço, consulte [Criar um perfil vinculado ao serviço](https://docs.aws.amazon.com/IAM/latest/UserGuide/using-service-linked-roles.html) no *Guia do usuário do IAM*.

### Função vinculada ao serviço de replicação
<a name="globaltables-replication-slr"></a>

O Amazon DynamoDB cria automaticamente o perfil vinculado a serviços `AWSServiceRoleForDynamoDBReplication` (SLR) quando você cria sua primeira tabela global. Esse perfil gerencia a replicação entre regiões para você.

Ao aplicar políticas baseadas em recursos às réplicas, não negue nenhuma das permissões definidas em `AWSServiceRoleForDynamoDBReplicationPolicy` à entidade principal SLR, pois isso interromperá a replicação. Se você negar as permissões SLR necessárias, a replicação de e para as réplicas afetadas será interrompida e o status da tabela de réplicas mudará para `REPLICATION_NOT_AUTHORIZED`.
+ No caso de tabelas globais de consistência eventual multirregional (MREC), se uma réplica permanecer no estado `REPLICATION_NOT_AUTHORIZED` por mais de 20 horas, ela será convertida irreversivelmente em uma tabela do DynamoDB de região única.
+ Para tabelas globais de consistência forte multirregional (MRSC), negar as permissões necessárias resulta em `AccessDeniedException` para operações de gravação e leitura altamente consistente. Se uma réplica permanecer no estado `REPLICATION_NOT_AUTHORIZED` por mais de sete dias, a réplica ficará permanentemente inacessível e as operações de gravação e leitura altamente consistentes continuarão falhando com um erro. Algumas operações de gerenciamento, como a exclusão de réplicas, serão bem-sucedidas.

### Função vinculada a serviço do IAM para ajuste de escala automático
<a name="globaltables-autoscaling-slr"></a>

Quando você configura uma tabela global para o modo de capacidade provisionada, também deve configurar o ajuste de escala automático para ela. O ajuste de escala automático do DynamoDB usa o serviço AWS Application Auto Scaling para ajustar dinamicamente a capacidade de throughput em suas réplicas de tabela global. O serviço Application Auto Scaling cria um perfil vinculado ao serviço (SLR) chamado [https://docs.aws.amazon.com/autoscaling/application/userguide/application-auto-scaling-service-linked-roles.html](https://docs.aws.amazon.com/autoscaling/application/userguide/application-auto-scaling-service-linked-roles.html). Esse perfil vinculado a serviços é criado automaticamente em sua conta da AWS quando você configura o ajuste de escala automático para uma tabela do DynamoDB. Ele permite que o Application Auto Scaling gerencie a capacidade provisionada da tabela e crie alarmes do CloudWatch. 

 Quando você aplicar políticas baseadas em recursos às réplicas, não negue nenhuma das permissões definidas em [https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSApplicationAutoscalingDynamoDBTablePolicy.html](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSApplicationAutoscalingDynamoDBTablePolicy.html) à entidade principal de SLR do Application Auto Scaling, pois isso interromperá a funcionalidade de ajuste de escala automático.

### Exemplo de políticas do IAM para perfis vinculados a serviços
<a name="globaltables-example-slr"></a>

Uma política do IAM com a condição a seguir não afeta as permissões necessárias para a SLR de replicação e a SLR de ajuste de escala automático da AWS do DynamoDB. Essa condição pode ser adicionada a políticas amplamente restritivas para evitar a interrupção involuntária da replicação ou do ajuste de escala automático:

#### Excluir as permissões SLR necessárias das políticas de negação
<a name="example-exclude-slr-policy"></a>

O exemplo a seguir mostra como excluir as entidades principais do perfil vinculado a serviços das instruções de negação:

```
"Condition": {
    "StringNotEquals": {
        "aws:PrincipalArn": [
            "arn:aws::iam::111122223333:role/aws-service-role/replication.dynamodb.amazonaws.com/AWSServiceRoleForDynamoDBReplication",
            "arn:aws::iam::111122223333:role/aws-service-role/dynamodb.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_DynamoDBTable"
        ]
    }
}
```

## Como as tabelas globais usam o IAM da AWS
<a name="globaltables-iam"></a>

As seções a seguir descrevem as permissões necessárias para diferentes operações de tabela global e contêm exemplos de políticas para ajudar você a configurar o acesso apropriado para seus usuários e aplicações.

**nota**  
Todas as permissões descritas devem ser aplicadas ao ARN do recurso de tabela específico nas regiões afetadas. O ARN do recurso de tabela segue o formato `arn:aws:dynamodb:region:account-id:table/table-name`, no qual você precisa especificar os valores reais de região, ID da conta e nome da tabela.

**Topics**
+ [Criar tabelas globais e adicionar réplicas](#globaltables-creation-iam)
+ [Atualizar tabelas globais](#globaltables-update-iam)
+ [Excluir tabelas globais e remover réplicas](#globaltables-delete-iam)

### Criar tabelas globais e adicionar réplicas
<a name="globaltables-creation-iam"></a>

As tabelas globais do DynamoDB comportam dois modos de consistência: consistência eventual multirregional (MREC) e consistência forte multirregional (MRSC). As tabelas globais MREC podem ter várias réplicas em qualquer número de regiões e fornecer consistência eventual. As tabelas globais MRSC exigem exatamente três regiões (três réplicas ou duas réplicas e uma testemunha) e fornecem consistência forte com objetivo de ponto de recuperação (RPO) zero.

As permissões necessárias para criar tabelas globais dependem de você criar uma tabela global com ou sem uma testemunha.

#### Permissões para criar tabelas globais
<a name="globaltables-creation-iam-all-types"></a>

As permissões a seguir são necessárias tanto para a criação de tabelas globais iniciais quanto para adicionar réplicas posteriormente. Essas permissões se aplicam às tabelas globais de consistência final multirregional (MREC) e consistência forte multirregional (MRSC).
+ As tabelas globais exigem replicação entre regiões, que o DynamoDB gerencia por meio do perfil vinculado a serviços (SLR) [`AWSServiceRoleForDynamoDBReplication`](#globaltables-replication-slr). A permissão a seguir permite que o DynamoDB crie esse perfil automaticamente quando você cria uma tabela global pela primeira vez:
  + `iam:CreateServiceLinkedRole`
+ Para criar uma tabela global ou adicionar uma réplica usando a API [https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateTable.html](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateTable.html), é necessário ter a seguinte permissão no recurso da tabela de origem:
  + `dynamodb:UpdateTable`
+ É necessário ter as seguintes permissões no recurso de tabela nas regiões para que as réplicas sejam adicionadas:
  + `dynamodb:CreateTable`
  + `dynamodb:CreateTableReplica`
  + `dynamodb:Query`
  + `dynamodb:Scan`
  + `dynamodb:UpdateItem`
  + `dynamodb:PutItem`
  + `dynamodb:GetItem`
  + `dynamodb:DeleteItem`
  + `dynamodb:BatchWriteItem`

#### Permissões adicionais para tabelas globais MRSC usando uma testemunha
<a name="globaltables-creation-iam-witness"></a>

Ao criar uma tabela global de consistência forte multirregional (MRSC) com uma região testemunha, você deve ter a seguinte permissão no recurso de tabela em todas as regiões participantes (incluindo as regiões de réplica e a região testemunha):
+ `dynamodb:CreateGlobalTableWitness`

#### Exemplos de política do IAM para criar tabelas globais
<a name="globaltables-creation-iam-example"></a>

##### Criar uma tabela global MREC ou MRSC em três regiões
<a name="globaltables-creation-iam-example-three-regions"></a>

A política baseada em identidade a seguir permite criar uma tabela global MREC ou MRSC chamada “usuários” em três regiões, incluindo a criação do perfil vinculado a serviços de replicação do DynamoDB necessário.

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AllowCreatingUsersGlobalTable",
      "Effect": "Allow",
      "Action": [
        "dynamodb:CreateTable",
        "dynamodb:CreateTableReplica",
        "dynamodb:UpdateTable",
        "dynamodb:Query",
        "dynamodb:Scan",
        "dynamodb:UpdateItem",
        "dynamodb:PutItem",
        "dynamodb:GetItem",
        "dynamodb:DeleteItem",
        "dynamodb:BatchWriteItem"
      ],
      "Resource": [
        "arn:aws:dynamodb:us-east-1:123456789012:table/users",
        "arn:aws:dynamodb:us-east-2:123456789012:table/users",
        "arn:aws:dynamodb:us-west-2:123456789012:table/users"
      ]
    },
    {
      "Sid": "AllowCreatingSLR",
      "Effect": "Allow",
      "Action": [
        "iam:CreateServiceLinkedRole"
      ],
      "Resource": [
        "arn:aws:iam::123456789012:role/aws-service-role/replication.dynamodb.amazonaws.com/AWSServiceRoleForDynamoDBReplication"
      ]
    }
  ]
}
```

------

##### Restringir a criação de tabelas globais MREC ou MRSC a regiões específicas
<a name="globaltables-creation-iam-example-restrict-regions"></a>

A política baseada em identidade a seguir permite criar réplicas de tabelas globais do DynamoDB em regiões específicas usando a chave de condição [aws:RequestedRegion](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-requestedregion), incluindo a criação do perfil vinculado a serviços de replicação do DynamoDB necessário.

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AllowAddingReplicasToSourceTable",
      "Effect": "Allow",
      "Action": [
        "dynamodb:UpdateTable"
      ],
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "aws:RequestedRegion": [
            "us-east-1"
          ]
        }
      }
    },
    {
      "Sid": "AllowCreatingReplicas",
      "Effect": "Allow",
      "Action": [
        "dynamodb:CreateTable",
        "dynamodb:CreateTableReplica",
        "dynamodb:UpdateTable",
        "dynamodb:Query",
        "dynamodb:Scan",
        "dynamodb:UpdateItem",
        "dynamodb:PutItem",
        "dynamodb:GetItem",
        "dynamodb:DeleteItem",
        "dynamodb:BatchWriteItem"
      ],
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "aws:RequestedRegion": [
            "us-east-2",
            "us-west-2"
          ]
        }
      }
    },
    {
      "Sid": "AllowCreatingSLR",
      "Effect": "Allow",
      "Action": [
        "iam:CreateServiceLinkedRole"
      ],
      "Resource": [
        "arn:aws:iam::123456789012:role/aws-service-role/replication.dynamodb.amazonaws.com/AWSServiceRoleForDynamoDBReplication"
      ]
    }
  ]
}
```

------

##### Criar uma tabela global MRSC com testemunha
<a name="globaltables-creation-iam-example-witness"></a>

A política baseada em identidade a seguir permite criar uma tabela global do DynamoDB MRSC chamada “users” com réplicas em us-east-1 e us-east-2 e uma testemunha em us-west-2, incluindo a criação do perfil vinculado a serviços de replicação do DynamoDB necessário.

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AllowCreatingUsersGlobalTableWithWitness",
      "Effect": "Allow",
      "Action": [
        "dynamodb:CreateTable",
        "dynamodb:CreateTableReplica",
        "dynamodb:CreateGlobalTableWitness",
        "dynamodb:UpdateTable",
        "dynamodb:Query",
        "dynamodb:Scan",
        "dynamodb:UpdateItem",
        "dynamodb:PutItem",
        "dynamodb:GetItem",
        "dynamodb:DeleteItem",
        "dynamodb:BatchWriteItem"
      ],
      "Resource": [
        "arn:aws:dynamodb:us-east-1:123456789012:table/users",
        "arn:aws:dynamodb:us-east-2:123456789012:table/users"
      ]
    },
    {
      "Sid": "AllowCreatingSLR",
      "Effect": "Allow",
      "Action": [
        "iam:CreateServiceLinkedRole"
      ],
      "Resource": [
        "arn:aws:iam::123456789012:role/aws-service-role/replication.dynamodb.amazonaws.com/AWSServiceRoleForDynamoDBReplication"
      ]
    }
  ]
}
```

------

##### Restringir a criação de testemunhas MRSC a regiões específicas
<a name="globaltables-creation-iam-example-restrict-witness-regions"></a>

A política baseada em identidade permite criar uma tabela global MRSC com réplicas restrita a regiões específicas usando a chave de condição [aws:RequestedRegion](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-requestedregion) e criação de testemunhas sem restrições em todas as regiões, incluindo a criação do perfil vinculado a serviços de replicação do DynamoDB necessário.

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AllowCreatingReplicas",
      "Effect": "Allow",
      "Action": [
        "dynamodb:CreateTable",
        "dynamodb:CreateTableReplica",
        "dynamodb:UpdateTable",
        "dynamodb:Query",
        "dynamodb:Scan",
        "dynamodb:UpdateItem",
        "dynamodb:PutItem",
        "dynamodb:GetItem",
        "dynamodb:DeleteItem",
        "dynamodb:BatchWriteItem"
      ],
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "aws:RequestedRegion": [
            "us-east-1",
            "us-east-2"
          ]
        }
      }
    },
    {
      "Sid": "AllowCreatingWitness",
      "Effect": "Allow",
      "Action": [
        "dynamodb:CreateGlobalTableWitness"
      ],
      "Resource": "*"
    },
    {
      "Sid": "AllowCreatingSLR",
      "Effect": "Allow",
      "Action": [
        "iam:CreateServiceLinkedRole"
      ],
      "Resource": [
        "arn:aws:iam::123456789012:role/aws-service-role/replication.dynamodb.amazonaws.com/AWSServiceRoleForDynamoDBReplication"
      ]
    }
  ]
}
```

------

### Atualizar tabelas globais
<a name="globaltables-update-iam"></a>

Para modificar as configurações de réplica de uma tabela global existente usando a API [https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateTable.html](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateTable.html), é preciso ter a seguinte permissão no recurso de tabela na região em que você está fazendo a chamada de API:
+ `dynamodb:UpdateTable`

Além disso, você pode atualizar outras configurações da tabela global, como políticas de ajuste de escala automático e configurações de tempo de vida. As seguintes permissões são necessárias para essas operações adicionais de atualização:
+ Para atualizar uma política de ajuste de escala automático da réplica com a API [https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateTableReplicaAutoScaling.html](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateTableReplicaAutoScaling.html), é necessário ter as seguintes permissões no recurso de tabela em todas as regiões que contêm réplicas:
  + `application-autoscaling:DeleteScalingPolicy`
  + `application-autoscaling:DeleteScheduledAction`
  + `application-autoscaling:DeregisterScalableTarget`
  + `application-autoscaling:DescribeScalableTargets`
  + `application-autoscaling:DescribeScalingActivities`
  + `application-autoscaling:DescribeScalingPolicies`
  + `application-autoscaling:DescribeScheduledActions`
  + `application-autoscaling:PutScalingPolicy`
  + `application-autoscaling:PutScheduledAction`
  + `application-autoscaling:RegisterScalableTarget`
+ Para atualizar as configurações de tempo de vida com a API [https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateTimeToLive.html](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateTimeToLive.html), você deve ter a seguinte permissão no recurso de tabela em todas as regiões que contêm réplicas:
  + `dynamodb:UpdateTimeToLive`

  Observe que o tempo de vida (TTL) é compatível somente com tabelas globais configuradas com consistência eventual multirregional (MREC). Para acessar mais informações sobre como tabelas globais funcionam com TTL, consulte [Como funcionam as tabelas globais do DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/V2globaltables_HowItWorks.html).

### Excluir tabelas globais e remover réplicas
<a name="globaltables-delete-iam"></a>

Para excluir uma tabela global, você deve remover todas as réplicas. As permissões necessárias para essa operação variam dependendo se você está excluindo uma tabela global com ou sem uma região testemunha.

#### Permissões para excluir tabelas globais e remover réplicas
<a name="globaltables-delete-iam-all-types"></a>

As permissões a seguir são necessárias tanto para remover réplicas individuais quanto para excluir completamente as tabelas globais. A exclusão de uma configuração de tabela global só remove o relacionamento de replicação entre tabelas em diferentes regiões. Ela não exclui a tabela subjacente do DynamoDB na última região restante. A tabela na última região continua existindo como uma tabela padrão do DynamoDB com os mesmos dados e configurações. Essas permissões se aplicam às tabelas globais de consistência final multirregional (MREC) e consistência forte multirregional (MRSC). 
+ Para remover réplicas de uma tabela global usando a API [https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateTable.html](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateTable.html), você precisa da seguinte permissão no recurso de tabela na região em que está fazendo a chamada de API:
  + `dynamodb:UpdateTable`
+ Você precisa das seguintes permissões no recurso de tabela em cada região em que você está removendo uma réplica:
  + `dynamodb:DeleteTable`
  + `dynamodb:DeleteTableReplica`

#### Permissões adicionais para tabelas globais MRSC usando uma testemunha
<a name="globaltables-delete-iam-witness"></a>

Ao excluir uma tabela global de consistência forte multirregional (MRSC) com uma testemunha, você deve ter a seguinte permissão no recurso de tabela em todas as regiões participantes (incluindo as regiões de réplica e a região testemunha):
+ `dynamodb:DeleteGlobalTableWitness`

#### Exemplos de política do IAM para excluir réplicas de uma tabela global
<a name="globaltables-delete-iam-example"></a>

##### Excluir réplicas de tabelas globais
<a name="globaltables-delete-replicas-iam-example"></a>

Essa política baseada em identidade permite que você exclua uma tabela global do DynamoDB chamada “users” e suas respectivas réplicas em três regiões:

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "dynamodb:UpdateTable",
        "dynamodb:DeleteTable",
        "dynamodb:DeleteTableReplica"
      ],
      "Resource": [
        "arn:aws:dynamodb:us-east-1:123456789012:table/users",
        "arn:aws:dynamodb:us-east-2:123456789012:table/users",
        "arn:aws:dynamodb:us-west-2:123456789012:table/users"
      ]
    }
  ]
}
```

------

##### Excluir uma tabela global MRSC com uma testemunha
<a name="globaltables-delete-witness-iam-example"></a>

Essa política baseada em identidade permite que você exclua a réplica e a testemunha de uma tabela global MRSC chamada “users”:

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "dynamodb:UpdateTable",
        "dynamodb:DeleteTable",
        "dynamodb:DeleteTableReplica",
        "dynamodb:DeleteGlobalTableWitness"
      ],
      "Resource": [
        "arn:aws:dynamodb:us-east-1:123456789012:table/users",
        "arn:aws:dynamodb:us-east-2:123456789012:table/users"
      ]
    }
  ]
}
```

------

## Como as tabelas globais usam AWS KMS
<a name="globaltables-kms"></a>

Como todas as tabelas do DynamoDB, as réplicas de tabelas globais sempre criptografam dados em repouso usando chaves de criptografia armazenadas no AWS Key Management Service (AWS KMS).

Todas as réplicas em uma tabela global devem ser configuradas com o mesmo tipo de chave KMS (chave própria da AWS, chave gerenciada da AWS ou chave gerenciada pelo cliente).

**Importante**  
O DynamoDB exige acesso à chave de criptografia da réplica para excluir uma réplica. Se você quiser desativar ou excluir uma chave gerenciada pelo cliente usada para criptografar uma réplica porque você está excluindo a réplica, primeiro exclua a réplica, aguarde até que o status da tabela em uma das réplicas restantes mude para `ACTIVE`, então desative ou exclua a chave.

Para uma tabela global configurada para consistência final multirregional (MREC), se você desativar ou revogar o acesso do DynamoDB a uma chave gerenciada pelo cliente usada para criptografar uma réplica, a replicação de e para a réplica será interrompida e o status da réplica mudará para `INACCESSIBLE_ENCRYPTION_CREDENTIALS`. Se uma réplica em uma tabela global do MREC permanecer no estado `INACCESSIBLE_ENCRYPTION_CREDENTIALS` por mais de 20 horas, a réplica será convertida irreversivelmente em uma tabela do DynamoDB de região única.

Para uma tabela global configurada para consistência forte multirregional (MRSC), se você desativar ou revogar o acesso do DynamoDB a uma chave gerenciada pelo cliente usada para criptografar uma réplica, a replicação de e para a réplica será interrompida, as tentativas de realizar gravações ou leituras altamente consistentes na réplica retornarão um erro, e o status da réplica mudará para `INACCESSIBLE_ENCRYPTION_CREDENTIALS`. Se uma réplica em uma tabela global do MRSC permanecer no estado `INACCESSIBLE_ENCRYPTION_CREDENTIALS` por mais de sete dias, dependendo das permissões específicas revogadas, a réplica será arquivada ou ficará permanentemente inacessível.

# Tabelas globais de várias contas do DynamoDB
<a name="globaltables-MultiAccount"></a>

As tabelas globais de várias contas replicam automaticamente os dados da tabela do DynamoDB em várias regiões da AWS e várias contas da AWS para melhorar a resiliência, isolar workloads em nível de conta e aplicar controles distintos de segurança e governança. Cada tabela-réplica reside em uma conta da AWS distinta, permitindo o isolamento de falhas em nível de região e de conta. Também é possível alinhar as réplicas à sua estrutura organizacional da AWS. As tabelas globais de várias contas oferecem benefícios adicionais de isolamento, governança e segurança em comparação às tabelas globais da mesma conta.

As tabelas globais de várias contas oferecem os seguintes benefícios:
+ Replicação automática de tabelas do DynamoDB nas regiões da AWS escolhidas por você.
+ Fortalecimento da segurança e da governança ao replicar dados entre contas com políticas, barreiras de proteção e limites de conformidade distintos.
+ Aprimoramento da resiliência operacional e do isolamento de falhas em nível de conta ao posicionar réplicas em contas AWS separadas.
+ Alinhamento das workloads por unidade de negócios ou propriedade usando uma estratégia de várias contas.
+ Simplificação da atribuição de custos, faturando cada réplica na respectiva conta da AWS.

Para ter mais informações, consulte [Benefícios do uso de várias contas da AWS](https://docs.aws.amazon.com/whitepapers/latest/organizing-your-aws-environment/benefits-of-using-multiple-aws-accounts.html). Se suas workloads não precisarem de replicação em várias contas ou se quiser simplificar o gerenciamento de réplicas com substituições locais, você pode continuar usando tabelas globais da mesma conta.

É possível configurar tabelas globais de várias contas com [Consistência final multirregional (MREC)](V2globaltables_HowItWorks.md#V2globaltables_HowItWorks.consistency-modes.mrec). Não é possível usar tabelas globais configuradas para [Consistência forte multirregional (MRSC)](V2globaltables_HowItWorks.md#V2globaltables_HowItWorks.consistency-modes.mrsc) no modelo de várias contas.

**Topics**
+ [Como funcionam as tabelas globais do DynamoDB](V2globaltables_MA_HowItWorks.md)
+ [Tutoriais: criar de tabelas globais de várias contas](V2globaltables_MA.tutorial.md)
+ [Segurança de tabelas globais do DynamoDB](globaltables_MA_security.md)

# Como funcionam as tabelas globais do DynamoDB
<a name="V2globaltables_MA_HowItWorks"></a>

As tabelas globais de várias contas estendem os recursos totalmente gerenciados, multirregionais, sem servidor e multiativos das tabelas globais do DynamoDB para abranger várias contas da AWS. As tabelas globais de várias contas replicam dados entre regiões e contas da AWS, oferecendo a mesma funcionalidade ativa-ativa das tabelas globais da mesma conta. Quando você grava em qualquer réplica, o DynamoDB replica os dados em todas as outras réplicas.

As principais diferenças em relação às tabelas globais da mesma conta incluem:
+ É possível usar a replicação multirregional com tabelas globais com consistência final multirregional (MREC).
+ Só é possível adicionar réplicas começando com uma tabela de região única. Não é possível converter uma tabela global existente da mesma conta em uma configuração de várias contas. Para migrar e criar uma tabela global de várias contas, primeiro é necessário excluir as réplicas existentes para retornar a uma tabela de região única.
+ Cada réplica deve residir em uma conta da AWS separada. Para uma tabela global de várias contas com *N* réplicas, é necessário ter *N* contas.
+ Por padrão, as tabelas globais de várias contas usam configurações de tabela unificadas em todas as réplicas. Todas as réplicas compartilham automaticamente a mesma configuração (como modo de throughput e TTL) e, diferentemente das tabelas globais da mesma conta, essas configurações não podem ser substituídas por réplicas.
+ Os clientes devem fornecer permissões de replicação à entidade principal do serviço de tabelas globais do DynamoDB em suas políticas de recursos.

As tabelas globais de várias contas usam a mesma tecnologia de replicação subjacente das tabelas globais da mesma conta. As configurações da tabela são replicadas automaticamente em todas as réplicas regionais e os clientes não podem substituí-las por réplicas nem personalizá-las. Isso garante uma configuração consistente e um comportamento previsível em várias contas da AWS que compartilham a mesma tabela global.

As configurações nas tabelas globais do DynamoDB definem como uma tabela se comporta e como os dados são replicados nas regiões. Essas configurações são definidas por meio de APIs do ambiente de gerenciamento do DynamoDB durante a criação da tabela ou ao adicionar uma nova réplica regional.

Ao criar uma tabela global de várias contas, os clientes devem definir `GlobalTableSettingsReplicationMode = ENABLED` para cada réplica regional. Isso garante que as alterações de configuração feitas em uma região se propaguem automaticamente para todas as outras regiões que compartilham a tabela global.

É possível habilitar a replicação das configurações após a criação da tabela. Isso é adequado para o cenário em que uma tabela é criada originalmente como uma tabela regional e depois atualizada para uma tabela global de várias contas.

**Configurações sincronizadas**

As seguintes configurações são sempre sincronizadas entre as réplicas em uma tabela global de várias contas:

**nota**  
Diferentemente das tabelas globais da mesma conta, as tabelas globais de várias contas não permitem substituições por região para essas configurações. A única exceção é que as substituições de políticas de ajuste de escala automático de leitura (tabelas e GSIs) são permitidas, pois são recursos externos separados.
+ Modo de capacidade (capacidade provisionada ou sob demanda)
+ Capacidade provisionada de leitura e gravação da tabela
+ Ajuste de escala automático de leitura e gravação da tabela
+ Definição do índice secundário local (LSI)
+ Definição do Índice Secundário Global (GSI)
+ Capacidade provisionada de leitura e gravação do GSI
+ Ajuste de escala automático de leitura e gravação do GSI
+ Definição de streams no modo MREC
+ Vida útil (TTL)
+ Throughput a quente
+ Throughput máximo sob demanda de leitura e gravação

**Configurações não sincronizadas**

As configurações a seguir não são sincronizadas entre as réplicas e devem ser definidas de forma independente para cada tabela-réplica em cada região.
+ Classe de tabela
+ Tipo de criptografia do lado do servidor (SSE)
+ Recuperação para um ponto no tempo
+ ID da chave do KMS da criptografia do lado do servidor (SSE)
+ Proteção contra exclusão
+ Kinesis Data Streams (KDSD)
+ Tags
+ Política de recursos
+ Tabela Cloudwatch-Contributor Insights (CCI)
+ GSI Cloudwatch-Contributor Insights (CCI)

## Monitoramento
<a name="V2globaltables_MA_HowItWorks.monitoring"></a>

Tabelas globais configuradas para consistência final em várias regiões (MREC) publicam a métrica [`ReplicationLatency`](metrics-dimensions.md#ReplicationLatency) no CloudWatch. Essa métrica controla o tempo decorrido entre quando um item foi gravado em uma tabela-réplica e quando esse item aparece em outra réplica na tabela global. `ReplicationLatency` é expresso em milissegundos e é emitido para cada par de regiões de origem e destino em uma tabela global.

Os valores típicos de `ReplicationLatency` dependem da distância entre as regiões da AWS escolhidas, bem como de outras variáveis como tipo de workload e throughput. Por exemplo, uma réplica de origem na região Oeste dos EUA (N. da Califórnia) (us-west-1) tem uma `ReplicationLatency` menor para a região Oeste dos EUA (Oregon) (us-west-2) em comparação com a região África (Cidade do Cabo) (af-south-1).

Um valor elevado para `ReplicationLatency` pode indicar que as atualizações de uma réplica não se propagaram para outras tabelas-réplica em tempo hábil. Nesse caso, você pode redirecionar temporariamente as atividades de leitura e gravação da aplicação para outra região da AWS.

**Lidar com problemas de latência de replicação em tabelas globais de várias contas**

Se `ReplicationLatency` exceder três horas devido a problemas causados pelo cliente em uma tabela-réplica, o DynamoDB enviará uma notificação solicitando que o cliente resolva o problema subjacente. Os problemas comuns causados pelo cliente que podem impedir a replicação incluem:
+ Remover as permissões necessárias da política de recursos da tabela-réplica.
+ Optar por não aderir a uma região da AWS que hospede uma réplica da tabela global de várias contas.
+ Negar as permissões da chave do AWS KMS da tabela necessárias para descriptografar dados.

Dentro de três horas, o DynamoDB enviará uma notificação inicial de alta latência de replicação, seguida de uma segunda notificação após vinte horas se o problema continuar sem solução. Se o problema não for corrigido dentro do período exigido, o DynamoDB desassociará automaticamente a réplica da tabela global. Depois, a réplica afetada será convertida em uma tabela regional.

# Tutoriais: criar de tabelas globais de várias contas
<a name="V2globaltables_MA.tutorial"></a>

Esta seção contém instruções passo a passo para criar tabelas globais do DynamoDB que abrangem várias contas da AWS.

## Criar uma tabela global de várias contas usando o console do DynamoDB
<a name="create-ma-gt-console"></a>

Siga estas etapas para criar uma tabela global de várias contas usando o Console de gerenciamento da AWS. O exemplo a seguir cria uma tabela global com tabelas-réplica nos Estados Unidos.

1. Faça login no Console de gerenciamento da AWS e abra o console do DynamoDB em [https://console.aws.amazon.com/dynamodb/](https://console.aws.amazon.com/dynamodb/) para a primeira conta (por exemplo, *111122223333*).

1. Para este exemplo, escolha **Leste dos EUA (Ohio)** no seletor de região na barra de navegação.

1. No painel de navegação, no lado esquerdo do console, selecione **Tables** (Tabelas).

1. Selecione **Create Table** (Criar tabela).

1. Na página **Criar tabela**:

   1. Em **Table name** (Nome da tabela), insira **MusicTable**.

   1. Em **Partition key**, (Chave de partição), insira **Artist**.

   1. Em **Chave de classificação**, insira **SongTitle**.

   1. Mantenha o restante das configurações padrão e escolha **Criar tabela**.

1. Adicione a seguinte política de recursos à tabela.

------
#### [ JSON ]

****  

   ```
   {
   "Version":"2012-10-17",		 	 	 
   "Statement": [
       {
           "Sid": "DynamoDBActionsNeededForSteadyStateReplication",
           "Effect": "Allow",
           "Action": [
               "dynamodb:ReadDataForReplication",
               "dynamodb:WriteDataForReplication",
               "dynamodb:ReplicateSettings"
           ],
           "Resource": "arn:aws:dynamodb:us-east-2:111122223333:table/MusicTable",
           "Principal": {"Service": ["replication.dynamodb.amazonaws.com"]},
           "Condition": {
               "StringEquals": {
                   "aws:SourceAccount": ["444455556666","111122223333"],
                   "aws:SourceArn": [
                       "arn:aws:dynamodb:us-east-1:444455556666:table/MusicTable",
                       "arn:aws:dynamodb:us-east-2:111122223333:table/MusicTable"
                   ]
               }
           }
       },
       {
           "Sid": "AllowTrustedAccountsToJoinThisGlobalTable",
           "Effect": "Allow",
           "Action": [
               "dynamodb:AssociateTableReplica"
           ],
           "Resource": "arn:aws:dynamodb:us-east-2:111122223333:table/MusicTable",
           "Principal": {"AWS": ["444455556666"]}
       }
   ]
   }
   ```

------

1. Essa nova tabela serve como a primeira tabela de réplica em uma nova tabela global. Ela é o protótipo das outras tabelas-réplica que serão adicionadas posteriormente.

1. Aguarde a tabela se tornar **ativa**. Para a tabela recém-criada, na guia **Tabelas globais**, acesse **Replicação de configurações** e clique em **Habilitar**.

1. Saia dessa conta (aqui, *111122223333*).

1. Faça login no Console de gerenciamento da AWS e abra o console do DynamoDB em [https://console.aws.amazon.com/dynamodb/](https://console.aws.amazon.com/dynamodb/) para a segunda conta (por exemplo, *444455556666*).

1. Para este exemplo, escolha **Leste dos EUA (Norte da Virgínia)** no seletor de região na barra de navegação.

1. O console garante que não exista uma tabela com o mesmo nome na região selecionada. Se existir uma tabela com o mesmo nome, será necessário excluir a tabela existente para criar outra tabela-réplica nessa região.

1. No menu suspenso próximo a **Criar tabela**, escolha **Criar de outra conta**

1. Na página **Criar tabela de outra conta**:

   1. Adicione **arn:aws:dynamodb:us-east-2:*111122223333*:table/MusicTable** como ARN da tabela de origem.

   1. Em **ARNs das réplicas da tabela**, adicione novamente o ARN **arn:aws:dynamodb:us-east-2:*111122223333*:table/MusicTable** da tabela de origem. Se várias réplicas já existirem como parte de uma tabela global de várias contas, será necessário adicionar todas as réplicas existentes a ReplicaTableARN.

   1. Mantenha o restante das configurações padrão e escolha **Enviar**.

1. A guia **Tabelas globais** da tabela “Music” (e de qualquer outra tabela-réplica) mostra que a tabela foi replicada em várias regiões.

1. Como testar a replicação:

   1. É possível usar qualquer uma das regiões em que exista uma réplica para essa tabela.

   1. Escolha **Explore table items** (Explorar itens da tabela).

   1. Selecione **Create Item** (Criar item).

   1. Insira **item\$11** para **Artist (Artista)** e **Song Value 1** para **SongTitle (Título da música)**.

   1. Selecione **Create Item** (Criar item).

   1. Verifique a replicação mudando para outras regiões:

   1. Verifique se a tabela Music (Música) contém o item que você criou.

## Criar uma tabela global de várias contas usando a AWS CLI
<a name="ma-gt-cli"></a>

Os exemplos a seguir mostram como criar uma tabela global de várias contas usando a AWS CLI. Esses exemplos demonstram o fluxo de trabalho completo para configurar a replicação entre contas.

------
#### [ CLI ]

Use os comandos da AWS CLI a seguir para criar uma tabela global de várias contas com replicação entre contas.

```
# STEP 1: Setting resource policy for the table in account 111122223333

cat > /tmp/source-resource-policy.json << 'EOF'
{
    "Version": "2012-10-17", 		 	 	 
    "Statement": [
        {
            "Sid": "DynamoDBActionsNeededForSteadyStateReplication",
            "Effect": "Allow",
            "Action": [
                "dynamodb:ReadDataForReplication",
                "dynamodb:WriteDataForReplication",
                "dynamodb:ReplicateSettings"
            ],
            "Resource": "arn:aws:dynamodb:us-east-2:111122223333:table/MusicTable",
            "Principal": {"Service": ["replication.dynamodb.amazonaws.com"]},
            "Condition": {
                "StringEquals": {
                    "aws:SourceAccount": ["444455556666","111122223333"],
                    "aws:SourceArn": [
                        "arn:aws:dynamodb:us-east-1:444455556666:table/MusicTable",
                        "arn:aws:dynamodb:us-east-2:111122223333:table/MusicTable"
                    ]
                }
            }
        },
        {
            "Sid": "AllowTrustedAccountsToJoinThisGlobalTable",
            "Effect": "Allow",
            "Action": [
                "dynamodb:AssociateTableReplica"
            ],
            "Resource": "arn:aws:dynamodb:us-east-2:111122223333:table/MusicTable",
            "Principal": {"AWS": ["444455556666"]}
        }
    ]
}
EOF

# Step 2: Create a new table (MusicTable) in US East (Ohio), 
#   with DynamoDB Streams enabled (NEW_AND_OLD_IMAGES),
#   and Settings Replication ENABLED on the account 111122223333

aws dynamodb create-table \
    --table-name MusicTable \
    --attribute-definitions \
        AttributeName=Artist,AttributeType=S \
        AttributeName=SongTitle,AttributeType=S \
    --key-schema \
        AttributeName=Artist,KeyType=HASH \
        AttributeName=SongTitle,KeyType=RANGE \
    --billing-mode PAY_PER_REQUEST \
    --stream-specification StreamEnabled=true,StreamViewType=NEW_AND_OLD_IMAGES \
    --global-table-settings-replication-mode ENABLED \
    --resource-policy file:///tmp/source-resource-policy.json \
    --region us-east-2 


# Step 3: Creating replica table in account 444455556666

# Resource policy for account 444455556666
cat > /tmp/dest-resource-policy.json << 'EOF'
{
    "Version": "2012-10-17", 		 	 	 
    "Statement": [
        {
            "Sid": "DynamoDBActionsNeededForSteadyStateReplication",
            "Effect": "Allow",
            "Action": [
                "dynamodb:ReadDataForReplication",
                "dynamodb:WriteDataForReplication",
                "dynamodb:ReplicateSettings"
            ],
            "Resource": "arn:aws:dynamodb:us-east-1:444455556666:table/MusicTable",
            "Principal": {"Service": ["replication.dynamodb.amazonaws.com"]},
            "Condition": {
                "StringEquals": {
                    "aws:SourceAccount": ["444455556666","111122223333"],
                    "aws:SourceArn": [
                        "arn:aws:dynamodb:us-east-1:444455556666:table/MusicTable",
                        "arn:aws:dynamodb:us-east-2:111122223333:table/MusicTable"
                    ]
                }
            }
        }
    ]
}
EOF

# Execute the replica table creation
aws dynamodb create-table \
    --table-name MusicTable \
    --global-table-source-arn "arn:aws:dynamodb:us-east-2:111122223333:table/MusicTable" \
    --resource-policy file:///tmp/dest-resource-policy.json \
    --global-table-settings-replication-mode ENABLED \
    --region us-east-1

# Step 4: View the list of replicas created using describe-table
aws dynamodb describe-table \
    --table-name MusicTable \
    --region us-east-2 \
    --query 'Table.{TableName:TableName,TableStatus:TableStatus,MultiRegionConsistency:MultiRegionConsistency,Replicas:Replicas[*].{Region:RegionName,Status:ReplicaStatus}}'

# Step 5: To verify that replication is working, add a new item to the Music table in US East (Ohio)
aws dynamodb put-item \
    --table-name MusicTable \
    --item '{"Artist": {"S":"item_1"},"SongTitle": {"S":"Song Value 1"}}' \
    --region us-east-2

# Step 6: Wait for a few seconds, and then check to see whether the item has been 
# successfully replicated to US East (N. Virginia) and Europe (Ireland)
aws dynamodb get-item \
    --table-name MusicTable \
    --key '{"Artist": {"S":"item_1"},"SongTitle": {"S":"Song Value 1"}}' \
    --region us-east-1

aws dynamodb get-item \
    --table-name MusicTable \
    --key '{"Artist": {"S":"item_1"},"SongTitle": {"S":"Song Value 1"}}' \
    --region us-east-2

# Step 7: Delete the replica table in US East (N. Virginia) Region
aws dynamodb delete-table \
    --table-name MusicTable \
    --region us-east-1

# Clean up: Delete the primary table
aws dynamodb delete-table \
    --table-name MusicTable \
    --region us-east-2
```

------

# Segurança de tabelas globais do DynamoDB
<a name="globaltables_MA_security"></a>

As réplicas de tabelas globais são tabelas do DynamoDB, então você usa os mesmos métodos para controlar o acesso às réplicas que usa para tabelas de região única, incluindo políticas de identidade e políticas baseadas em recursos do AWS Identity and Access Management (IAM). Este tópico aborda como proteger tabelas globais de várias contas do DynamoDB usando permissões do IAM e a criptografia do AWS Key Management Service (AWS KMS). Você aprenderá mais sobre políticas baseadas em recursos e perfis vinculados ao serviço (SLR) que permitem a replicação e o ajuste de escala automático entre contas e entre regiões, bem como sobre as permissões do IAM necessárias para criar, atualizar e excluir tabelas globais, para ter tabelas com consistência final multirregional (MREC). Você também aprenderá mais sobre chaves de criptografia do AWS KMS para gerenciar a replicação entre regiões com segurança.

Este tópico contém informações detalhadas sobre as políticas e permissões baseadas em recursos necessárias para estabelecer a replicação de tabelas entre contas e entre regiões. Compreender esse modelo de segurança é fundamental para clientes que precisam implementar soluções seguras de replicação de dados entre contas.

## Autorização de replicação à entidade principal do serviço
<a name="globaltables_MA_service_principal"></a>

As tabelas globais de várias contas do DynamoDB usam uma abordagem de autorização distinta porque a replicação é realizada entre os limites da conta. Isso é feito usando a entidade principal do serviço de replicação do DynamoDB: `replication.dynamodb.amazonaws.com`. Cada conta participante deve dar permissão explícita a essa entidade principal na política de recursos da tabela-réplica, concedendo a ela permissões que podem se restringir a réplicas específicas de acordo com as condições de contexto da origem em chaves como `aws:SourceAccount`, `aws:SourceArn` etc. Para ver detalhes, consulte [Chaves de condição globais da AWS](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html). As permissões são bidirecionais, o que significa que todas as réplicas devem conceder permissões explicitamente umas às outras para que a replicação seja estabelecida em qualquer par específico de réplicas.

As seguintes permissões de entidade principal de serviço são essenciais para a replicação entre contas:
+ `dynamodb:ReadDataForReplication` concede permissão para ler dados para fins de replicação. Esta permissão possibilita que as alterações em uma réplica sejam lidas e propagadas para outras réplicas.
+ `dynamodb:WriteDataForReplication` permite a gravação de dados replicados nas tabelas de destino. Esta permissão possibilita que as alterações sejam sincronizadas em todas as réplicas na tabela global.
+ `dynamodb:ReplicateSettings` permite a sincronização das configurações da tabela entre as réplicas, oferecendo uma configuração consistente em todas as tabelas participantes.

Cada réplica deve conceder as permissões acima a todas as outras réplicas e a si mesma; isto é, as condições de contexto da origem devem incluir o conjunto completo de réplicas que compõe a tabela global. Essas permissões são verificadas para cada nova réplica quando ela é adicionada a uma tabela global de várias contas. Esse processo verifica se as operações de replicação são realizadas somente pelo serviço autorizado do DynamoDB e apenas entre as tabelas pretendidas.

## Perfis vinculados ao serviço para tabelas globais de várias contas
<a name="globaltables_MA_service_linked_roles"></a>

As tabelas globais de várias contas do DynamoDB replicam as configurações em todas as réplicas para que cada réplica seja configurada de forma idêntica com um throughput consistente e ofereça uma experiência de failover contínua. A replicação das configurações é controlada por meio da permissão `ReplicateSettings` da entidade principal do serviço, mas também dependemos de perfis vinculados ao serviço (SLRs) para gerenciar determinados recursos de replicação e ajuste de escala automático entre contas e entre regiões. É necessário configurar esses perfis somente uma vez por conta da AWS. Depois de criados, os mesmos perfis atendem a todas as tabelas globais da sua conta. Para ter mais informações sobre perfis vinculados ao serviço, consulte [Criar um perfil vinculado ao serviço](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create-service-linked-role.html) no Guia do usuário do IAM.

### Perfil vinculado ao serviço de gerenciamento de configurações
<a name="globaltables_MA_settings_management_slr"></a>

O Amazon DynamoDB cria automaticamente o perfil vinculado ao serviço (SLR) AWSServiceRoleForDynamoDBGlobalTableSettingsManagement quando a primeira réplica de tabela global de várias contas é criada na conta. Esse perfil gerencia a replicação de configurações entre contas e entre regiões para você.

Ao aplicar políticas baseadas em recursos às réplicas, não negue nenhuma das permissões definidas em `AWSServiceRoleForDynamoDBGlobalTableSettingsManagement` à entidade principal do SLR, pois isso pode interferir no gerenciamento de configurações e prejudicar a replicação se o throughput não corresponder entre as réplicas ou os GSIs. Se você negar as permissões de SLR necessárias, a replicação entre as réplicas afetadas será interrompida e o status da tabela-réplica mudará para `REPLICATION_NOT_AUTHORIZED`. No caso de tabelas globais de várias contas, se uma réplica permanecer no estado `REPLICATION_NOT_AUTHORIZED` por mais de vinte horas, ela será convertida irreversivelmente em uma tabela do DynamoDB de região única. O SLR tem as seguintes permissões:
+ `application-autoscaling:DeleteScalingPolicy`
+ `application-autoscaling:DescribeScalableTargets`
+ `application-autoscaling:DescribeScalingPolicies`
+ `application-autoscaling:DeregisterScalableTarget`
+ `application-autoscaling:PutScalingPolicy`
+ `application-autoscaling:RegisterScalableTarget`

### Função vinculada a serviço do IAM para ajuste de escala automático
<a name="globaltables_MA_autoscaling_slr"></a>

Quando você configura uma tabela global para o modo de capacidade provisionada, também deve configurar o ajuste de escala automático para ela. O ajuste de escala automático do DynamoDB usa o serviço AWS Application Auto Scaling para ajustar dinamicamente a capacidade de throughput em suas réplicas de tabela global. O serviço Application Auto Scaling cria um perfil vinculado ao serviço (SLR) chamado [AWSServiceRoleForApplicationAutoScaling\$1DynamoDBTable](https://docs.aws.amazon.com/autoscaling/application/userguide/application-auto-scaling-service-linked-roles.html). Esse perfil vinculado ao serviço é criado automaticamente em sua conta da AWS quando você configura o ajuste de escala automático para uma tabela do DynamoDB. Isso permite que o Application Auto Scaling gerencie a capacidade provisionada da tabela e crie alarmes do CloudWatch.

Ao aplicar políticas baseadas em recursos às réplicas, verifique se você não negou nenhuma permissão definida em [AWSApplicationAutoscalingDynamoDBTablePolicy](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSApplicationAutoscalingDynamoDBTablePolicy.html) à entidade principal de SLR do Application Auto Scaling, pois isso interromperá a funcionalidade de ajuste de escala automático.

## Como as tabelas globais usam o IAM da AWS
<a name="globaltables_MA_iam"></a>

As seções a seguir descrevem as permissões necessárias para diferentes operações de tabela global e contêm exemplos de políticas para ajudar você a configurar o acesso apropriado para seus usuários e aplicações.

**nota**  
Todas as permissões descritas devem ser aplicadas ao ARN do recurso de tabela específico nas regiões afetadas. O ARN do recurso de tabela segue o formato `arn:aws:dynamodb:region:account-id:table/table-name`, no qual você precisa especificar os valores reais de região, ID da conta e nome da tabela.

Estes são os tópicos detalhados que abordamos nas seções abaixo:
+ Criar tabelas globais de várias contas e adicionar réplicas
+ Atualizar uma tabela global de várias contas
+ Excluir tabelas globais e remover réplicas

### Criar tabelas globais e adicionar réplicas
<a name="globaltables_MA_creating"></a>

#### Permissões para criar tabelas globais
<a name="globaltables_MA_creating_permissions"></a>

Quando uma nova réplica é adicionada a uma tabela regional para formar uma tabela global de várias contas ou a uma tabela global de várias contas existente, a entidade principal do IAM que executa a ação deve ser autorizada por todos os membros existentes. Todos os membros existentes precisam conceder a seguinte permissão em sua política de tabela para que a inclusão da réplica seja bem-sucedida:
+ `dynamodb:AssociateTableReplica`: esta permissão possibilita que as tabelas sejam unidas em uma configuração de tabela global. Ela é fundamental para o estabelecimento inicial da relação de replicação.

Esse controle preciso permite que somente contas autorizadas participem da configuração da tabela global.

#### Exemplos de política do IAM para criar tabelas globais
<a name="globaltables_MA_creating_examples"></a>

##### Exemplos de política do IAM para a configuração de duas réplicas
<a name="globaltables_MA_2replica_example"></a>

A configuração de tabelas globais de várias contas segue um fluxo de autorização específico que oferece uma replicação segura. Vamos examinar como isso funciona na prática, analisando um cenário prático em que um cliente deseja estabelecer uma tabela global com duas réplicas. A primeira réplica (ReplicaA) reside na conta A na região ap-east-1, enquanto a segunda réplica (ReplicaB) está na conta B na região eu-south-1.
+ Na conta de origem (conta A), o processo começa com a criação da tabela-réplica primária. O administrador da conta deve anexar uma política baseada em recursos a essa tabela que conceda explicitamente as permissões necessárias à conta de destino (conta B) para realizar a associação. Essa política também autoriza o serviço de replicação do DynamoDB a realizar ações essenciais de replicação.
+ A conta de destino (conta B) segue um processo semelhante, anexando uma política baseada em recursos correspondente ao criar a réplica e mencionando o ARN da tabela de origem a ser usado para criar a réplica. Essa política reflete as permissões concedidas pela conta A, criando uma relação bidirecional confiável. Antes de estabelecer a replicação, o DynamoDB valida essas permissões entre contas para verificar se a autorização adequada está em vigor.

Para estabelecer essa configuração:
+ O administrador da conta A deve primeiro anexar a política baseada em recursos à ReplicaA. Essa política concede explicitamente as permissões necessárias à conta B e ao serviço de replicação do DynamoDB.
+ Da mesma forma, o administrador da conta B deve anexar uma política correspondente à ReplicaB na chamada de criação da tabela, revertendo as referências da conta para conceder as permissões correspondentes à conta A e criar a ReplicaB fazendo referência à ReplicaA como tabela de origem.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "DynamoDBActionsNeededForSteadyStateReplication",
            "Effect": "Allow",
            "Action": [
                "dynamodb:ReadDataForReplication",
                "dynamodb:WriteDataForReplication",
                "dynamodb:ReplicateSettings"
            ],
            "Resource": "arn:aws:dynamodb:ap-east-1:111122223333:table/ReplicaA",
            "Principal": {"Service": ["replication.dynamodb.amazonaws.com"]},
            "Condition": {
                "StringEquals": {
                    "aws:SourceAccount": [ "111122223333", "444455556666" ],
                    "aws:SourceArn": [
                        "arn:aws:dynamodb:ap-east-1:111122223333:table/ReplicaA",
                        "arn:aws:dynamodb:eu-south-1:444455556666:table/ReplicaB"
                    ]
                }
            }
        },
        {
            "Sid": "AllowTrustedAccountsToJoinThisGlobalTable",
            "Effect": "Allow",
            "Action": [
                "dynamodb:AssociateTableReplica"
            ],
            "Resource": "arn:aws:dynamodb:ap-east-1:111122223333:table/ReplicaA",
            "Principal": {"AWS": ["444455556666"]}
        }
    ]
}
```

------

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "DynamoDBActionsNeededForSteadyStateReplication",
            "Effect": "Allow",
            "Action": [
                "dynamodb:ReadDataForReplication",
                "dynamodb:WriteDataForReplication",
                "dynamodb:ReplicateSettings"
            ],
            "Resource": "arn:aws:dynamodb:eu-south-1:444455556666:table/ReplicaB",
            "Principal": {"Service": ["replication.dynamodb.amazonaws.com"]},
            "Condition": {
                "StringEquals": {
                    "aws:SourceAccount": [ "111122223333", "444455556666" ],
                    "aws:SourceArn": [
                        "arn:aws:dynamodb:ap-east-1:111122223333:table/ReplicaA",
                        "arn:aws:dynamodb:eu-south-1:444455556666:table/ReplicaB"
                    ]
                }
            }
        }
    ]
}
```

------

##### Exemplos de política do IAM para a configuração de três réplicas
<a name="globaltables_MA_3replica_example"></a>

Nesta configuração, temos três réplicas ReplicaA, ReplicaB e ReplicaC na conta A, conta B e conta C, respectivamente. A ReplicaA é a primeira e começa como uma tabela regional; em seguida, a ReplicaB e a ReplicaC são adicionadas a ela.
+ O administrador da conta A deve primeiro anexar a política baseada em recursos à ReplicaA, permitindo a replicação com todos os membros e que a entidade principal do IAM tanto da conta B quanto da conta C adicione réplicas.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "DynamoDBActionsNeededForSteadyStateReplication",
            "Effect": "Allow",
            "Action": [
                "dynamodb:ReadDataForReplication",
                "dynamodb:WriteDataForReplication",
                "dynamodb:ReplicateSettings"
            ],
            "Resource": "arn:aws:dynamodb:ap-east-1:111122223333:table/ReplicaA",
            "Principal": {"Service": ["replication.dynamodb.amazonaws.com"]},
            "Condition": {
                "StringEquals": {
                    "aws:SourceAccount": [ "111122223333", "444455556666", "123456789012" ],
                    "aws:SourceArn": [
                        "arn:aws:dynamodb:ap-east-1:111122223333:table/ReplicaA",
                        "arn:aws:dynamodb:eu-south-1:444455556666:table/ReplicaB",
                        "arn:aws:dynamodb:us-east-1:123456789012:table/ReplicaC"
                    ]
                }
            }
        },
        {
            "Sid": "AllowTrustedAccountsToJoinThisGlobalTable",
            "Effect": "Allow",
            "Action": [
                "dynamodb:AssociateTableReplica"
            ],
            "Resource": "arn:aws:dynamodb:ap-east-1:111122223333:table/ReplicaA",
            "Principal": { "AWS": [ "444455556666", "123456789012" ] }
        }
    ]
}
```

------
+ O administrador da conta B deve adicionar uma réplica (ReplicaB) apontando para a ReplicaA como origem. A ReplicaB tem a seguinte política, que permite a replicação entre todos os membros e que a conta C adicione uma réplica:

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "DynamoDBActionsNeededForSteadyStateReplication",
            "Effect": "Allow",
            "Action": [
                "dynamodb:ReadDataForReplication",
                "dynamodb:WriteDataForReplication",
                "dynamodb:ReplicateSettings"
            ],
            "Resource": "arn:aws:dynamodb:eu-south-1:444455556666:table/ReplicaB",
            "Principal": {"Service": ["replication.dynamodb.amazonaws.com"]},
            "Condition": {
                "StringEquals": {
                    "aws:SourceAccount": [ "111122223333", "444455556666", "123456789012" ],
                    "aws:SourceArn": [
                        "arn:aws:dynamodb:ap-east-1:111122223333:table/ReplicaA",
                        "arn:aws:dynamodb:eu-south-1:444455556666:table/ReplicaB",
                        "arn:aws:dynamodb:us-east-1:123456789012:table/ReplicaC"
                    ]
                }
            }
        },
        {
            "Sid": "AllowTrustedAccountsToJoinThisGlobalTable",
            "Effect": "Allow",
            "Action": [
                "dynamodb:AssociateTableReplica"
            ],
            "Resource": "arn:aws:dynamodb:eu-south-1:444455556666:table/ReplicaB",
            "Principal": { "AWS": [ "123456789012" ] }
        }
    ]
}
```

------
+ Por fim, o administrador da conta C cria uma réplica com a política a seguir, que concede permissões de replicação entre todos os membros. A política não permite que nenhuma outra réplica seja adicionada.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "DynamoDBActionsNeededForSteadyStateReplication",
            "Effect": "Allow",
            "Action": [
                "dynamodb:ReadDataForReplication",
                "dynamodb:WriteDataForReplication",
                "dynamodb:ReplicateSettings"
            ],
            "Resource": "arn:aws:dynamodb:us-east-1:123456789012:table/ReplicaC",
            "Principal": {"Service": ["replication.dynamodb.amazonaws.com"]},
            "Condition": {
                "StringEquals": {
                    "aws:SourceAccount": [ "111122223333", "444455556666" ],
                    "aws:SourceArn": [
                        "arn:aws:dynamodb:ap-east-1:111122223333:table/ReplicaA",
                        "arn:aws:dynamodb:eu-south-1:444455556666:table/ReplicaB"
                    ]
                }
            }
        }
    ]
}
```

------

### Atualizar uma tabela global de várias contas
<a name="globaltables_MA_updating"></a>

Para modificar as configurações de réplica de uma tabela global existente usando a API UpdateTable, é preciso ter a seguinte permissão no recurso de tabela na região em que você está fazendo a chamada de API: `dynamodb:UpdateTable`.

Além disso, você pode atualizar outras configurações da tabela global, como políticas de ajuste de escala automático e configurações de tempo de vida. As seguintes permissões são necessárias para essas operações adicionais de atualização:

Para atualizar as configurações de vida útil com a API `UpdateTimeToLive`, é necessário ter a seguinte permissão no recurso de tabela em todas as regiões que contêm réplicas: `dynamodb:UpdateTimeToLive`.

Para atualizar uma política de ajuste de escala automático da réplica com a API `UpdateTableReplicaAutoScaling`, é necessário ter as seguintes permissões no recurso de tabela em todas as regiões que contêm réplicas:
+ `application-autoscaling:DeleteScalingPolicy`
+ `application-autoscaling:DeleteScheduledAction`
+ `application-autoscaling:DeregisterScalableTarget`
+ `application-autoscaling:DescribeScalableTargets`
+ `application-autoscaling:DescribeScalingActivities`
+ `application-autoscaling:DescribeScalingPolicies`
+ `application-autoscaling:DescribeScheduledActions`
+ `application-autoscaling:PutScalingPolicy`
+ `application-autoscaling:PutScheduledAction`
+ `application-autoscaling:RegisterScalableTarget`

**nota**  
É preciso fornecer permissões `dynamodb:ReplicateSettings` em todas as regiões e contas de réplica para que a tabela de atualização tenha êxito. Se alguma réplica não fornecer permissões para replicar configurações em qualquer réplica na tabela global de várias contas, todas as operações de atualização em todas as réplicas falharão, exibindo `AccessDeniedException`, enquanto as permissões não forem corrigidas.

### Excluir tabelas globais e remover réplicas
<a name="globaltables_MA_deleting"></a>

Para excluir uma tabela global, você deve remover todas as réplicas. Ao contrário da tabela global da mesma conta, não é possível usar `UpdateTable` para excluir uma tabela-réplica em uma região remota e cada réplica deve ser excluída por meio da API `DeleteTable` da conta que a controla.

#### Permissões para excluir tabelas globais e remover réplicas
<a name="globaltables_MA_deleting_permissions"></a>

As permissões a seguir são necessárias tanto para remover réplicas individuais quanto para excluir completamente as tabelas globais. A exclusão de uma configuração de tabela global só remove o relacionamento de replicação entre tabelas em diferentes regiões. Ela não exclui a tabela subjacente do DynamoDB na última região restante. A tabela na última região continua existindo como uma tabela padrão do DynamoDB com os mesmos dados e configurações.

Você precisa das seguintes permissões no recurso de tabela em cada região em que você está removendo uma réplica:
+ `dynamodb:DeleteTable`
+ `dynamodb:DeleteTableReplica`

## Como as tabelas globais usam AWS KMS
<a name="globaltables_MA_kms"></a>

Como todas as tabelas do DynamoDB, as réplicas de tabela global sempre criptografam dados em repouso usando chaves de criptografia armazenadas no AWS Key Management Service (AWS KMS).

**nota**  
Ao contrário da tabela global da mesma conta, réplicas diferentes em uma tabela global de várias contas podem ser configuradas com diferentes tipos de chave do AWS KMS (chave de propriedade da AWS ou chave gerenciada pelo cliente). Não é possível usar chaves gerenciadas pela AWS em tabelas globais de várias contas.

As tabelas globais de várias contas que usam CMKs exigem que a política de chave de cada réplica conceda permissões à entidade principal do serviço de replicação (`replication.dynamodb.amazonaws.com`) do DynamoDB para acessar a chave e usá-la na replicação e no gerenciamento de configurações. As seguintes permissões são necessárias:
+ `kms:Decrypt`
+ `kms:ReEncrypt*`
+ `kms:GenerateDataKey*`
+ `kms:DescribeKey`

**Importante**

O DynamoDB exige acesso à chave de criptografia da réplica para excluir uma réplica. Se você quiser desabilitar ou excluir uma chave gerenciada pelo cliente usada para criptografar uma réplica porque está excluindo a réplica, primeiro exclua a réplica, aguarde a remoção da tabela do grupo de replicação chamando describe em uma das outras réplicas e, em seguida, desabilite ou exclua a chave.

Se você desabilitar ou revogar o acesso do DynamoDB a uma chave gerenciada pelo cliente usada para criptografar uma réplica, a replicação de e para a réplica será interrompida e o status da réplica mudará para `INACCESSIBLE_ENCRYPTION_CREDENTIALS`. Se uma réplica permanecer no estado `INACCESSIBLE_ENCRYPTION_CREDENTIALS` por mais de vinte horas, ela será convertida irreversivelmente em uma tabela do DynamoDB de região única.

### Exemplo de política do AWS KMS
<a name="globaltables_MA_kms_example"></a>

A política AWS KMS permite que o DynamoDB acesse ambas as chaves do AWS KMS para replicação entre as réplicas A e B. As chaves do AWS KMS anexadas à réplica do DynamoDB em cada conta precisam ser atualizadas com a seguinte política:

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
      {
        "Effect": "Allow",
        "Principal": { "Service": "replication.dynamodb.amazonaws.com" },
        "Action": [
            "kms:Decrypt",
            "kms:ReEncrypt*",
            "kms:GenerateDataKey*",
            "kms:DescribeKey"
        ],
        "Resource": "*",
        "Condition": {
            "StringEquals": {
                "aws:SourceAccount": [ "111122223333", "444455556666" ],
                "aws:SourceArn": [
                    "arn:aws:dynamodb:ap-east-1:111122223333:table/ReplicaA",
                    "arn:aws:dynamodb:eu-south-1:444455556666:table/ReplicaB"
                ]
            }
        }
      }
   ]
 }
```

------

# Conceitos básicos sobre faturamento do Amazon DynamoDB para tabelas globais
<a name="global-tables-billing"></a>

Este guia descreve como o faturamento do DynamoDB funciona para tabelas globais, identificando os componentes que contribuem com o custo das tabelas globais, incluindo um exemplo prático. 

As [tabelas globais do Amazon DynamoDB](GlobalTables.md) são um banco de dados totalmente gerenciado, multirregional e sem servidor. As tabelas globais oferecem [disponibilidade de 99,999%](https://aws.amazon.com/dynamodb/sla/), entregando maior resiliência das aplicações e melhor continuidade dos negócios. As tabelas globais replicam as tabelas do DynamoDB automaticamente nas regiões da AWS de sua escolha, portanto, é possível ter alta performance e rapidez de leitura e gravação locais. 

## Como funciona
<a name="global-tables-billing-how-it-works"></a>

O modelo de faturamento para tabelas globais é diferente do aplicado a tabelas de região única do DynamoDB. As operações de gravação para tabelas do DynamoDB de região única são cobradas usando as seguintes unidades:
+ Unidades de solicitação de gravação (WRUs) para o modo de capacidade sob demanda, em que uma WRU é cobrada por cada gravação de até 1 KB
+ Unidades de capacidade de gravação (WCUs) para o modo de capacidade provisionada, em que uma WCU fornece uma gravação por segundo para até 1 KB

Quando você cria uma tabela global adicionando uma tabela de réplica a uma tabela de região única existente, essa tabela de região única se torna uma tabela de réplica, o que significa que as unidades usadas para faturar as gravações na tabela também mudam. As operações de gravação em tabelas de réplica são cobradas usando as seguintes unidades: 
+ Unidades de solicitação de gravação replicadas (rWRUs) para o modo de capacidade sob demanda, em que uma rWRU por tabela de réplica é cobrada por cada gravação de até 1 KB
+ Unidades de capacidade de gravação replicadas (rWCUs) para o modo de capacidade provisionada, em que uma WCU por tabela de réplica fornece uma gravação por segundo para até 1 KB

As atualizações dos índices secundários globais (GSIs) são cobradas usando as mesmas unidades das tabelas do DynamoDB de região única, mesmo que a tabela base do GSI seja uma tabela de réplica. As operações de atualização de GSIs são cobradas usando as seguintes unidades:
+ Unidades de solicitação de gravação (WRUs) para o modo de capacidade sob demanda, em que uma WRU é cobrada por cada gravação de até 1 KB
+ Unidades de capacidade de gravação (WCUs) para o modo de capacidade provisionada, em que uma WCU fornece uma gravação por segundo para até 1 KB

As unidades de gravação replicadas (rWCUs e rWRUs) têm o mesmo preço das unidades de gravação de região única (WCUs e WRUs). Além disso, as taxas de transferência de dados entre regiões se aplicam às tabelas globais, pois os dados são replicados entre regiões. As cobranças de gravação replicada (rWCU ou rWRU) são geradas em cada região que contém uma tabela de réplica para a tabela global.

As operações de leitura de tabelas de região única e de tabelas de réplica usam as seguintes unidades:
+ Unidades de solicitação de leitura (RRUs) para o modo de capacidade sob demanda, em que uma RRU é cobrada por cada leitura altamente consistente de até 4 KB
+ Unidades de capacidade de leitura (RCUs) para tabelas provisionadas, em que uma RCU fornece uma leitura altamente consistente por segundo de até 4 KB

## Modos de consistência e cobrança
<a name="global-tables-billing-consistency-modes"></a>

As unidades de gravação replicadas (rWCUs e rWRUs) usadas para cobrar as operações de gravação são idênticas nos modos de consistência forte multirregional (MRSC) e consistência final multirregional (MREC). As tabelas globais que usam o modo de consistência forte multirregional (MRSC) configurado com testemunha não incorrem em custos de unidades de gravação replicadas (rWCUs e rWRUs), custos de armazenamento ou custos de transferência de dados para replicação para a testemunha.

## Exemplo de faturamento para tabelas globais do DynamoDB
<a name="global-tables-billing-example"></a>

Vamos analisar um exemplo de cenário de vários dias para ver como o faturamento de solicitações de gravação de tabela global funciona na prática (observe que este exemplo leva em conta apenas solicitações de gravação e não inclui as cobranças de restauração de tabelas e transferência de dados entre regiões que seriam geradas no exemplo):

**Dia 1: tabela de região única: **você tem uma tabela de região única sob demanda do DynamoDB chamada Tabela\$1A na região us-west-2. Você grava cem itens de 1 KB na Tabela\$1A. Com relação a operações de gravação de região única, você paga uma unidade de solicitação de gravação (WRU) por 1 KB gravado. Suas cobranças do dia 1 são:
+ 100 WRUs na região us-west-2 para gravações em região única

O total de unidades de solicitação cobradas no dia 1: **100 WRUs**.

**Dia 2: criar uma tabela global:** você cria uma tabela global adicionando uma réplica à Tabela\$1A na região us-east-2. Agora, a Tabela\$1A é uma tabela global com duas tabelas de réplica; uma na região us-west-2 e uma na região us-east-2. Você grava 150 itens de 1 KB na tabela de réplica na região us-west-2. Suas cobranças do dia 2 são:
+ 150 rWRUs na região us-west-2 para gravações replicadas
+ 150 rWRUs na região us-east-2 para gravações replicadas

O total de unidades de solicitação cobradas no dia 2: **300 rWRUs**.

**Dia 3: adicionar um índice secundário global: **você adiciona um índice secundário global (GSI) à tabela de réplica na região us-east-2 que projeta todos os atributos da tabela base (réplica). A tabela global cria automaticamente o GSI na tabela de réplica na região us-west-2. Você grava 200 novos registros de 1 KB na tabela de réplica na região us-west-2. Suas cobranças do dia 3 são:
+ • 200 rWRUs na região us-west-2 para gravações replicadas
+ • 200 WRUs na região us-west-2 para atualizações de GSI
+ • 200 rWRUs na região us-east-2 para gravações replicadas
+ • 200 WRUs na região us-east-2 para atualizações de GSI

Total de unidades de solicitação de gravação cobradas no dia 3: **400 WRUs e 400 rWRUs**.

O total de cobranças de unidade de gravação nos três dias equivale a 500 WRUs (100 WRUs no dia 1 \$1 400 WRUs no dia 3) e 700 rWRUs (300 rWRUs no dia 2 \$1 400 rWRUs no dia 3).

Em resumo, as operações de gravação da tabela de réplica são faturadas em unidades de gravação replicadas em todas as regiões que contêm uma tabela de réplica. Se você tiver índices secundários globais, serão cobradas unidades de gravação pelas atualizações dos GSIs em todas as regiões que contêm um GSI (que em uma tabela global são todas as regiões que contêm uma tabela de réplica). 

# Versões de tabelas globais do DynamoDB
<a name="V2globaltables_versions"></a>

Há duas versões disponíveis das tabelas globais do DynamoDB: tabelas globais versão 2019.11.21 (atual) e tabelas globais versão 2017.11.29 (legada). Recomendamos usar a versão 2019.11.21 (atual) das tabelas globais, pois ela é mais fácil de usar, com suporte em mais regiões e oferece menor custo para a maioria das workloads em comparação com a versão 2017.11.29 (legada).

## Determinar a versão de uma tabela global
<a name="globaltables.DetermineVersion"></a>

### Determinar a versão usando a AWS CLI
<a name="globaltables.CLI"></a>

#### Identificar uma réplica de tabela global da versão 2019.11.21 (atual)
<a name="globaltables.CLI.current"></a>

Para determinar se uma tabela é uma réplica da versão 2019.11.21 (atual) das tabelas globais, invoque o comando `describe-table` para a tabela. Se a saída contiver o atributo `GlobalTableVersion` com o valor "2019.11.21", a tabela é uma réplica da tabela global da versão 2019.11.21 (atual).

Um exemplo de comando CLI para `describe-table`:

```
aws dynamodb describe-table \
--table-name users \
--region us-east-2
```

A saída (abreviada) contém o atributo `GlobalTableVersion` com o valor "2019.11.21", então essa tabela é uma réplica da tabela global da versão 2019.11.21 (atual).

```
{
    "Table": {
        "AttributeDefinitions": [
            {
                "AttributeName": "id",
                "AttributeType": "S"
            },
            {
                "AttributeName": "name",
                "AttributeType": "S"
            }
        ],
        "TableName": "users",
        ...
        "GlobalTableVersion": "2019.11.21",
        "Replicas": [
            {
                "RegionName": "us-west-2",
                "ReplicaStatus": "ACTIVE",
            }
        ],
        ...
    }
}
```

#### Identificar uma réplica de tabela global da versão 2017.11.29 (legada)
<a name="globaltables.CLI.legacy"></a>

As tabelas globais versão 2017.11.29 (legada) usam um conjunto dedicado de comandos para gerenciamento global de tabelas. Para determinar se uma tabela é uma réplica da versão 2017.11.21 (legada) das tabelas globais, invoque o comando `describe-global-table` para a tabela. Se você receber uma resposta bem-sucedida, a tabela será uma réplica de tabela global da versão 2017.11.29 (legada). Se o comando `describe-global-table` retornar um erro `GlobalTableNotFoundException`, a tabela não será uma réplica da versão 2017.11.29 (legada).

Um exemplo de comando CLI para `describe-global-table`:

```
aws dynamodb describe-global-table \
--table-name users \
--region us-east-2
```

O comando retorna uma resposta bem-sucedida, então essa tabela será uma réplica de tabela global da versão 2017.11.29 (legada).

```
{
    "GlobalTableDescription": {
        "ReplicationGroup": [
            {
                "RegionName": "us-west-2"
            },
            {
                "RegionName": "us-east-2"
            }
        ],
        "GlobalTableArn": "arn:aws:dynamodb::123456789012:global-table/users",
        "CreationDateTime": "2025-06-10T13:55:53.630000-04:00",
        "GlobalTableStatus": "ACTIVE",
        "GlobalTableName": "users"
    }
}
```

### Determinar a versão usando o DynamoDB Console
<a name="globaltables.console"></a>

Para identificar a versão de uma réplica de tabela global, faça o seguinte:

1. Abra o console do DynamoDB em [https://console.aws.amazon.com/dynamodb/](https://console.aws.amazon.com/dynamodb/home).

1. No painel de navegação, no lado esquerdo do console, selecione **Tables** (Tabelas).

1. Selecione a tabela para a qual você deseja identificar a versão das tabelas globais.

1. Selecione a guia **Global Tables (Tabelas globais)**.

   A seção *Resumo* exibe a versão das tabelas globais em uso.

## Diferenças de comportamento entre as versões herdada e atual
<a name="DiffLegacyVsCurrent"></a>

A lista a seguir descreve as diferenças de comportamento entre as versões herdada e atual das tabelas globais.
+ A versão 2019.11.21 (atual) consome menor capacidade de gravação para várias operações do DynamoDB em comparação à versão 2017.11.29 (herdada) e, portanto, é mais econômica para a maioria dos clientes. As diferenças dessas operações do DynamoDB são as seguintes:
  + Invocar [PutItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutItem.html) para um item de 1 KB em uma região e replicar para outras regiões requer 2 rWRUs por região para a 2017.11.29 (herdada), mas apenas 1 rWRU para a 2019.11.21 (atual).
  + Invocar [UpdateItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateItem.html) para um item de 1 KB requer 2 rWRUs na região de origem e 1 rWRU por região de destino para a 2017.11.29 (herdada), mas apenas 1 rWRU para as regiões de origem e de destino para a 2019.11.21 (atual).
  + Invocar [DeleteItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DeleteItem.html) para um item de 1 KB requer 1 rWRU na região de origem e 2 rWRUs por região de destino para a 2017.11.29 (herdada), mas apenas 1 rWRU para as regiões de origem e de destino para a 2019.11.21 (atual).

  A tabela a seguir mostra o consumo de rWRU das tabelas das versões 2017.11.29 (herdada) e 2019.11.21 (atual) de um item de 1 KB em duas regiões.    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/amazondynamodb/latest/developerguide/V2globaltables_versions.html)
+ A versão 2017.11.29 (herdada) está disponível somente em 11 Regiões da AWS. No entanto, a versão 2019.11.21 (atual) está disponível em todas as Regiões da AWS.
+ Você deve criar tabelas globais da versão 2017.11.29 (herdada) criando primeiro um conjunto de tabelas regionais vazias e, depois, invocando a API [CreateGlobalTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_CreateGlobalTable.html) para formar a tabela global. As tabelas globais da versão 2019.11.21 (atual) são criadas invocando a API [UpdateTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateTable.html) para adicionar uma réplica a uma tabela regional existente.
+ A versão 2017.11.29 (herdada) exige que você esvazie todas as réplicas na tabela antes de adicionar uma réplica em uma nova região (inclusive durante a criação). A versão 2019.11.21 (atual) aceita adicionar réplicas a regiões e removê-las em uma tabela que já contenha dados.
+ A versão 2017.11.29 (herdada) usa o seguinte conjunto dedicado de APIs de ambiente de gerenciamento para gerenciar réplicas:
  + [CreateGlobalTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_CreateGlobalTable.html)
  + [DescribeGlobalTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeGlobalTable.html)
  + [DescribeGlobalTableSettings](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeGlobalTableSettings.html)
  + [ListGlobalTables](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_ListGlobalTables.html)
  + [UpdateGlobalTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateGlobalTable.html)
  + [UpdateGlobalTableSettings](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateGlobalTableSettings.html)

  A versão 2019.11.21 (atual) usa as APIs [DescribeTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeTable.html) e [UpdateTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateTable.html) para gerenciar réplicas.
+ A versão 2017.11.29 (herdada) publica dois registros do DynamoDB Streams para cada gravação. A versão 2019.11.21 (atual) publica apenas um registro do DynamoDB Streams para cada gravação.
+ A versão 2017.11.29 (herdada) preenche e atualiza os atributos `aws:rep:deleting`,`aws:rep:updateregion` e `aws:rep:updatetime`. A versão 2019.11.21 (atual) não preenche nem atualiza esses atributos.
+ A versão 2017.11.29 (herdada) não sincroniza as configurações [Usar a vida útil (TTL) no DynamoDB](TTL.md) entre réplicas. A versão 2019.11.21 (atual) sincroniza as configurações de TTL entre réplicas.
+ A versão 2017.11.29 (herdada) não replica exclusões de TTL para outras réplicas. A versão 2019.11.21 (atual) replica exclusões de TTL para todas as réplicas.
+ A versão 2017.11.29 (herdada) não sincroniza configurações de [ajuste de escala automático](AutoScaling.md) entre réplicas. A versão 2019.11.21 (atual) sincroniza as configurações de ajuste de escala automático entre réplicas.
+ A versão 2017.11.29 (herdada) não sincroniza as configurações de [índice secundário global (GSI)](GSI.md) entre réplicas. A versão 2019.11.21 (atual) sincroniza as configurações do GSI entre réplicas.
+ A versão 2017.11.29 (herdada) não sincroniza as configurações de [criptografia em repouso](encryption.usagenotes.md) entre réplicas. A versão 2019.11.21 (atual) sincroniza as configurações de criptografia em repouso entre réplicas.
+ A versão 2017.11.29 (herdada) publica a métrica `PendingReplicationCount`. A versão 2019.11.21 (atual) não publica essa métrica.

## Atualizar para a versão atual
<a name="upgrading-to-current-version"></a>

### Permissões obrigatórias para a atualização de tabelas globais
<a name="V2globaltables_versions.Notes-permissions"></a>

Para realizar a atualização para a versão 2019.11.21 (atual), é necessário ter permissões `dynamodb:UpdateGlobalTableversion` em todas as regiões com réplicas. Essas permissões se somam às permissões necessárias para acessar o console do DynamoDB e visualizar tabelas.

A política do IAM a seguir concede permissões para atualizar qualquer tabela global para a versão 2019.11.21 (atual).

```
{
    "version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "dynamodb:UpdateGlobalTableversion",
            "Resource": "*"
        }
    ]
}
```

A política do IAM a seguir concede permissões para atualizar apenas a tabela global `Music`, com réplicas em duas regiões, para a versão 2019.11.21 (atual).

```
{
    "version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "dynamodb:UpdateGlobalTableversion",
            "Resource": [
                "arn:aws:dynamodb::123456789012:global-table/Music",
                "arn:aws:dynamodb:ap-southeast-1:123456789012:table/Music",
                "arn:aws:dynamodb:us-east-2:123456789012:table/Music"
            ]
        }
    ]
}
```

### O que esperar durante a atualização
<a name="V2GlobalTablesUpgradeExpectations"></a>
+ Todas as réplicas de tabelas globais continuarão processando o tráfego de leitura e gravação durante a atualização.
+ O processo de atualização requer de alguns minutos a várias horas, dependendo do tamanho da tabela e do número de réplicas.
+ Durante o processo de atualização, o valor de [TableStatus](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_TableDescription.html#DDB-Type-TableDescription-TableStatus) mudará de `ACTIVE` para `UPDATING`. É possível ver o status da tabela invocando a API [DescribeTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeTable.html) ou com a visualização **Tabelas** no console do DynamoDB.
+ O ajuste de escala automático não alterará as configurações de capacidade provisionada para uma tabela global enquanto a tabela estiver sendo atualizada. É altamente recomendável definir a tabela como o modo de capacidade [sob demanda](capacity-mode.md#capacity-mode-on-demand) durante a atualização.
+ Se você optar por usar o modo de capacidade [provisionada](provisioned-capacity-mode.md) com ajuste de escala automático durante a atualização, será necessário aumentar o throughput mínimo de leitura e gravação em suas políticas para atender aos aumentos esperados no tráfego e evitar o controle de utilização durante a atualização.
+ A métrica `ReplicationLatency` pode relatar temporariamente picos de latência ou parar de relatar dados de métricas durante o processo de atualização. Consulte mais informações em [ReplicationLatency](metrics-dimensions.md#ReplicationLatency). 
+ Quando o processo de atualização estiver concluído, o status da tabela mudará para `ACTIVE`.

### Comportamento do DynamoDB Streams antes, durante e depois da atualização
<a name="V2GlobalTablesUpgradeDDBStreamsBehavior"></a>

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/amazondynamodb/latest/developerguide/V2globaltables_versions.html)

### Atualizar para a versão 2019.11.21 (atual)
<a name="V2globaltables_versions.upgrade"></a>

Siga estas etapas para atualizar a versão das tabelas globais do DynamoDB usando o Console de gerenciamento da AWS.

**Como atualizar tabelas globais para a versão 2019.11.21 (atual)**

1. Abra o console do DynamoDB em [https://console.aws.amazon.com/dynamodb/](https://console.aws.amazon.com/dynamodb/home). 

1. No painel de navegação no lado esquerdo do console, escolha **Tabelas** e, depois, selecione a tabela global que você deseja atualizar para a versão 2019.11.21 (atual). 

1. Selecione a guia **Global Tables (Tabelas globais)**.

1. Escolha **Update version (Atualizar versão)**.  
![\[Captura de tela do console mostrando o botão Update version (Atualizar versão).\]](http://docs.aws.amazon.com/pt_br/amazondynamodb/latest/developerguide/images/GlobalTables-upgrade.png)

1. Leia e concorde com os novos requisitos e escolha **Update version (Atualizar versão)**.

1. Após a conclusão do processo de atualização, a versão de tabelas globais exibida no console muda para **2019.11.21**.

# Melhores práticas para tabelas globais
<a name="globaltables-bestpractices"></a>

As seções a seguir descrevem as melhores práticas para implantar e usar tabelas globais.

## Versão
<a name="globaltables-bestpractices-version"></a>

Há duas versões disponíveis das tabelas globais do DynamoDB: versão 2019.11.21 (atual) e [versão 2017.11.29 (legada)](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/globaltables.V1.html). Você deve usar a versão 2019.11.21 (atual) sempre que possível. 

## Proteção contra exclusão
<a name="globaltables-bestpractices-deletionprotection"></a>

Você deve ativar a proteção contra exclusão nas réplicas de tabelas globais que deseja proteger contra exclusão acidental. Você deve ativar a proteção contra exclusão em cada réplica.

## Usar o AWS CloudFormation
<a name="globaltables-bestpractices-cloudformation"></a>

O CloudFormation atualmente não oferece suporte à coordenação de recursos multirregionais, como tabelas globais entre pilhas. Se você definir cada réplica de uma tabela global em uma pilha regional separada, encontrará erros devido ao desvio detectado entre as pilhas ao realizar atualizações de réplicas. Para evitar esse problema, você deve escolher uma região como a região de referência para implantar suas tabelas globais e definir todas as réplicas da tabela global na pilha dessa região.

**Importante**  
Você não pode alterar o tipo de um recurso no seu modelo para converter um recurso `AWS::DynamoDB::Table` em um recurso `AWS::DynamoDB::GlobalTable`. Tentar converter uma tabela de região única em uma tabela global alterando o tipo de recurso do CloudFormation pode resultar na exclusão da tabela do DynamoDB.

Em vez disso, você pode utilizar o recurso `AWS::DynamoDB::GlobalTable` para criar uma tabela em uma única região. Essa tabela será implantada como qualquer outra tabela de região única. Se você atualizar a pilha posteriormente para adicionar outras regiões a um recurso, as réplicas serão adicionadas à tabela e ela será convertida com segurança em uma tabela global.

Se você tiver um recurso `AWS::DynamoDB::Table` existente que deseja converter em um recurso `AWS::DynamoDB::GlobalTable`, as etapas recomendadas para converter o tipo de recurso são:

1. Defina a política de exclusão `AWS::DynamoDB::Table` a ser mantida.

1. Remova a tabela da definição de pilha.

1. Adicione réplicas à tabela de região única no console da AWS, convertendo-a em uma tabela global.

1. Importe a tabela global como um novo recurso `AWS::DynamoDB::GlobalTable` para a pilha.

## Backups e recuperação pontual
<a name="globaltables-bestpractices-backups"></a>

Habilitar backups automatizados e recuperação para um ponto no tempo (PITR) para uma réplica em uma tabela global pode ser suficiente para atingir seus objetivos de recuperação de desastres. Os backups de réplicas criados com backup para AWS podem ser replicados automaticamente em todas as regiões para maior resiliência. Considere as metas do seu plano de recuperação de desastres no contexto da alta disponibilidade multirregional ao escolher sua estratégia de backup e habilitação de PITR.

## Projetando para alta disponibilidade multirregional
<a name="globaltables-bestpractices-multiregion"></a>

Para obter orientação prescritiva sobre a implantação de tabelas globais, consulte [Melhores práticas para o design de tabelas globais do DynamoDB](bp-global-table-design.md).