

# Tablas globales: multiactivas, replicación en varias regiones
<a name="GlobalTables"></a>

Las *tablas globales de Amazon DynamoDB* son una característica de base de datos totalmente administrada, de varias regiones y multiactiva que proporciona una replicación de datos fácil de usar y un rendimiento de lectura y escritura rápido y local para aplicaciones escaladas de forma global.

Las tablas globales replican automáticamente los datos de las tablas de DynamoDB en todas las Regiones de AWS y opcionalmente en todas las cuentas de AWS sin necesidad de que cree y mantenga su propia solución de replicación. Las tablas globales son ideales para aplicaciones que requieren continuidad empresarial y alta disponibilidad a través de una implementación en varias regiones. Cualquier réplica de una tabla global puede servir para lecturas y escrituras. Las aplicaciones pueden lograr una alta resiliencia con un objetivo de punto de recuperación (RPO) bajo o nulo al desplazar el tráfico a una región diferente si el procesamiento de la aplicación se interrumpe en una región. Las tablas globales están disponibles en todas las regiones donde DynamoDB está disponible.

## Modos de coherencia
<a name="GlobalTables.consistency-modes"></a>

Al crear una tabla global, puede configurar el modo de consistencia. Las tablas globales admiten dos modos de coherencia: coherencia final de varias regiones (MREC) y coherencia alta de varias regiones (MRSC).

Si no especifica un modo de coherencia al crear una tabla global, esta adoptará de forma predeterminada la coherencia final de varias regiones (MREC). Una tabla global no puede contener réplicas configuradas con diferentes modos de coherencia. No puede cambiar el modo de coherencia de una tabla global después de la creación.

## Configuraciones de cuentas
<a name="GlobalTables.account-configurations"></a>

DynamoDB ahora admite dos modelos de tablas globales, cada uno diseñado para patrones arquitectónicos diferentes:
+ **Tablas globales con la misma cuenta**: todas las réplicas se crean y administran en una sola cuenta de AWS.
+ **Tablas globales de varias cuentas**: las réplicas se implementan en varias cuentas de AWS mientras participan en un grupo de replicación compartido.

Los modelos con la misma cuenta y con múltiples cuentas admiten escrituras en varias regiones, la replicación asíncrona, la resolución de conflictos en la que gana el último autor y el mismo modelo de facturación. Sin embargo, difieren en la forma en que se gestionan las cuentas, los permisos, el cifrado y la gobernanza de las tablas.

Las tablas globales configuradas para MRSC solo admiten configuraciones de la misma cuenta.

Puede configurar una tabla global mediante la consola de administración de AWS. Las tablas globales utilizan las API de DynamoDB existentes para leer y escribir datos en las tablas, por lo que no se requieren cambios en la aplicación. Solo paga por los recursos que aprovisione o use, sin costos iniciales ni compromisos.


| **Propiedades de** | **Tablas globales de la misma cuenta** | **Tablas globales de varias cuentas** | 
| --- | --- | --- | 
| Caso de uso principal | Resiliencia de varias regiones para aplicaciones dentro de una sola cuenta de AWS | Replicación de varias regiones y varias cuentas para aplicaciones que pertenecen a diferentes equipos o unidades de negocio, o bien existen estrictos límites de seguridad entre las cuentas | 
| Modelo de cuenta | Todas las réplicas se crean y administran en una sola cuenta de AWS | Réplicas creadas en varias cuentas de AWS dentro de la misma implementación | 
| Propiedad del recurso | La tabla y todas las réplicas son propiedad de una sola cuenta | Cada cuenta es propietaria de su réplica local; el grupo de replicación abarca las cuentas | 
| Versión admitida | Versión 2019.11.21 (actual) y versión 2017.11.29 (antigua) de tablas globales | Versión 2019.11.21 (actual) de tablas globales | 
| Operaciones del plano de control | Creación, modificación y eliminación de réplicas a través de la cuenta del propietario de la tabla | Operaciones del plano de control distribuido: las cuentas se unen o abandonan el grupo de replicación | 
| Operaciones de plano de datos de | Puntos de conexión de DynamoDB estándar por región | Acceso al plano de datos por cuenta o región; enrutamiento a través del grupo de replicación | 
| Límite de seguridad | Un único límite de IAM y KMS | IAM, KMS, facturación, CloudTrail y gobernanza distintos por cuenta | 
| Mejor ajuste | Organizaciones con propiedad centralizada de las tablas | Organizaciones con equipos federados, límites de gobernanza o configuraciones de varias cuentas | 

**Topics**
+ [Modos de coherencia](#GlobalTables.consistency-modes)
+ [Configuraciones de cuentas](#GlobalTables.account-configurations)
+ [Conceptos clave de tablas globales](globaltables-CoreConcepts.md)
+ [Tabla global de la misma cuenta de DynamoDB](globaltables-SameAccount.md)
+ [Tablas globales de varias cuentas de DynamoDB](globaltables-MultiAccount.md)
+ [Descripción de la facturación de tablas globales en Amazon DynamoDB](global-tables-billing.md)
+ [Versiones de tablas globales de DynamoDB](V2globaltables_versions.md)
+ [Prácticas recomendadas para tablas globales](globaltables-bestpractices.md)

# Conceptos clave de tablas globales
<a name="globaltables-CoreConcepts"></a>

En las siguientes secciones, se describen los conceptos y los comportamientos de las tablas globales en Amazon DynamoDB

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

Las *tablas globales* son una característica de DynamoDB que replica los datos de las tablas en todas las regiones de AWS.

Una *tabla de réplica* (o réplica) es una tabla de DynamoDB que funciona como parte de una tabla global. Una tabla global consta de dos o más tablas de réplica en diferentes regiones de AWS. Cada tabla global solo puede tener una réplica por región de AWS. Todas las réplicas de una tabla global comparten el mismo nombre de tabla, esquema de clave principal y datos de elementos.

Cuando una aplicación escribe datos en una réplica en una región, DynamoDB replica automáticamente la escritura en el resto de las réplicas en la tabla global. Para obtener más información sobre cómo empezar a usar tablas globales, consulte [Tutoriales: creación de tablas globales](V2globaltables.tutorial.md) o [Tutoriales: Creación de tablas globales de varias cuentas](V2globaltables_MA.tutorial.md).

## Versiones
<a name="globaltables-CoreConcepts.Versions"></a>

Hay disponibles dos versiones de las tablas globales de DynamoDB: [versión 2019.11.21 (actual) de las tablas globales](GlobalTables.md) y [Versión 2017.11.29 (heredada) de las tablas globales](globaltables.V1.md). Debe utilizar la versión 2019.11.21 (actual) de tablas globales siempre que sea posible. La información de esta sección de la documentación corresponde a la versión 2019.11.21 (actual). Para obtener más información, consulte Determinación de la versión de una tabla global [Determinación de la versión de una tabla global](V2globaltables_versions.md#globaltables.DetermineVersion).

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

Las tablas globales ayudan a mejorar la continuidad empresarial al facilitar la implementación de una arquitectura de alta disponibilidad de varias regiones. Si una carga de trabajo en una única región de AWS se ve afectada, puede cambiar el tráfico de la aplicación a otra región y realizar las operaciones de lectura y escritura en una tabla de réplica diferente en la misma tabla global.

Cada tabla réplica en una tabla global proporciona la misma durabilidad y disponibilidad que una tabla de DynamoDB de una sola región. Las tablas globales ofrecen un [Acuerdo de nivel de servicio (SLA)](https://aws.amazon.com//dynamodb/sla/) con una disponibilidad del 99,999 %, en comparación con el 99,99 % de las tablas de una sola región.

## Pruebas de inyección de errores
<a name="fault-injection-testing"></a>

Las tablas globales de MREC y MRSC se integran con el [Servicio de inyección de errores de AWS](https://docs.aws.amazon.com/resilience-hub/latest/userguide/testing.html) (AWS FIS), un servicio totalmente gestionado para ejecutar experimentos controlados de inyección de errores con el fin de mejorar la resiliencia de una aplicación. Con el AWS FIS, puede hacer lo siguiente:
+ Crear plantillas de experimentos que definen escenarios de error específicos.
+ Inyectar errores para validar la resiliencia de la aplicación simulando el aislamiento de una región (es decir, deteniendo la replicación hacia y desde una réplica seleccionada) para probar la gestión de errores, los mecanismos de recuperación y el comportamiento del cambio de tráfico entre regiones cuando una región de AWS sufre una interrupción.

Por ejemplo, en una tabla global con réplicas en el Este de EE. UU. (Norte de Virginia), el Este de EE. UU. (Ohio) y el Oeste de EE. UU. (Oregón), puede realizar un experimento en el Este de EE. UU. (Ohio) para probar el aislamiento de la región allí, mientras que el Este de EE. UU. (Norte de Virginia) y el Oeste de EE. UU. (Oregón) continúan con sus operaciones normales. Estas pruebas controladas le ayudan a identificar y resolver posibles problemas antes de que afecten a las cargas de trabajo de producción. 

Consulte los [objetivos de acción](https://docs.aws.amazon.com/fis/latest/userguide/action-sequence.html#action-targets) en la *Guía del usuario de AWS FIS* para obtener una lista completa de las acciones respaldadas por AWS FIS y [Conectividad entre regiones](https://docs.aws.amazon.com/fis/latest/userguide/cross-region-scenario.html) para detener la replicación de DynamoDB entre regiones.

Para obtener información sobre las acciones de las tablas globales de Amazon DynamoDB disponibles en AWS FIS, consulte [Referencia de acciones de tablas globales de DynamoDB](https://docs.aws.amazon.com/fis/latest/userguide/fis-actions-reference.html#dynamodb-actions-reference) en la *Guía del usuario de AWS FIS*.

Para empezar a realizar experimentos de inyección de errores, consulte [Planificación de los experimentos de AWS FIS](https://docs.aws.amazon.com/fis/latest/userguide/getting-started-planning.html) en la Guía del usuario de AWS FIS.

**nota**  
Durante los experimentos de AWS FIS en la MRSC, se permiten lecturas coherentes posteriores, pero no se permiten actualizaciones de configuración de las tablas, como cambiar el modo de facturación o configurar el rendimiento de las tablas, de forma similar a lo que ocurre con la MREC. Consulte la métrica de CloudWatch [`FaultInjectionServiceInducedErrors`](metrics-dimensions.md#FaultInjectionServiceInducedErrors) para obtener información adicional sobre el código de errores.

## Tiempo de vida (TTL)
<a name="global-tables-ttl"></a>

Las tablas globales configuradas para MREC admiten la configuración de la eliminación de [Tiempo de vida](TTL.md) (TTL). La configuración de TTL se sincroniza automáticamente para todas las réplicas en una tabla global. Cuando TTL elimina un elemento de una réplica en una región, la eliminación se replica en todas las demás réplicas de la tabla global. El TTL no consume capacidad de escritura, por lo que no se le cobrará por la eliminación de TTL en la región donde se realizó la eliminación. Sin embargo, se le cobrará por la eliminación replicada en cada una de las demás regiones con una réplica en la tabla global.

La replicación de eliminación de TTL consume la capacidad de escritura de las réplicas en las que se está replicando la eliminación. Las réplicas configuradas para la capacidad aprovisionada pueden limitar las solicitudes si la combinación del rendimiento de escritura y el rendimiento de eliminación de TTL es superior a la capacidad de escritura aprovisionada.

Las tablas globales configuradas para la coherencia alta de varias regiones (MRSC) no admiten la configuración de la eliminación de Tiempo de vida (TTL).

## Transmisión
<a name="global-tables-streams"></a>

Las tablas globales configuradas para una coherencia final de varias regiones (MREC) replican los cambios leyendo esos cambios desde un [Flujo de DynamoDB](Streams.md) en una tabla de réplica y aplicándolos a todas las demás tablas de réplica. Por lo tanto, los flujos están habilitados de forma predeterminada en todas las réplicas de una tabla global de MREC y no se pueden desactivar en esas réplicas. El proceso de replicación de MREC puede combinar varios cambios en un corto periodo de tiempo en una sola escritura replicada, lo que hace que el flujo de cada réplica contenga registros ligeramente diferentes. Los registros de Streams en las réplicas de MREC mantienen el orden de todos los cambios realizados en el mismo elemento, pero el orden relativo de los cambios en los distintos elementos puede variar de una réplica a otra.

Si desea escribir una aplicación que procese los registros de flujos para cambios que se produjeron en una región específica pero no en otras regiones de una tabla global, puede agregar un atributo a cada elemento que defina en qué región se produjo el cambio para ese elemento. Puede usar este atributo para filtrar los registros de flujos en busca de cambios que se hayan producido en otras regiones, incluido el uso de filtros de eventos de Lambda para invocar solo las funciones de Lambda para los cambios en una región específica.

Las tablas globales configuradas para una coherencia sólida de varias regiones (MRSC) no utilizan los flujos de DynamoDB para la replicación, por lo que los flujos no están habilitados de forma predeterminada en las réplicas de MRSC. Puede habilitar flujos en una réplica de MRSC. Los registros de flujos en las réplicas de MRSC son idénticos para todas las réplicas, incluido el orden de los registros de flujos.

## Transacciones
<a name="global-tables-transactions"></a>

En una tabla global configurada para MREC, las operaciones de transacción de DynamoDB ([https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_TransactWriteItems.html](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_TransactWriteItems.html) y [https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_TransactGetItems.html](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_TransactGetItems.html)) son solo atómicas dentro de la región donde se invocó la operación. Las escrituras transaccionales no se replican como una unidad en todas las regiones, lo que significa que solo algunas de las escrituras de una transacción pueden devolverse mediante operaciones de lectura en otras réplicas en un momento dado.

Por ejemplo, si tiene una tabla global con réplicas en las regiones Este de EE. UU. (Ohio) y Oeste de EE. UU. (Oregón) y realiza una operación `TransactWriteItems` en la región Este de EE. UU. (Ohio), puede observar transacciones completadas parcialmente en la región Oeste de EE. UU. (Oregón) a medida que los cambios se replican. Solo se replicarán los cambios en otras regiones cuando se hayan confirmado en la región de origen.

Las tablas globales configuradas para lograr una coherencia alta de varias regiones (MRSC) no admiten operaciones de transacción y devolverán un error si esas operaciones se invocan en una réplica de MRSC.

## Rendimiento de lectura y escritura
<a name="globaltables-CoreConcepts.Throughput"></a>

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

La replicación consume capacidad de escritura. Las réplicas configuradas para la capacidad aprovisionada pueden limitar las solicitudes si la combinación del rendimiento de escritura de la aplicación y el rendimiento de escritura de la replicación supera la capacidad de escritura aprovisionada. En el caso de las tablas globales que utilizan el modo aprovisionado, la configuración de escalado automático para las capacidades de lectura y escritura se sincroniza entre las réplicas.

Puede configurar de forma independiente los ajustes de capacidad de lectura para cada réplica en una tabla global usando el parámetro [https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_ProvisionedThroughputOverride.html](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_ProvisionedThroughputOverride.html) a nivel de réplica. De forma predeterminada, los cambios en la capacidad de lectura aprovisionada se aplican a todas las réplicas de la tabla global. Al agregar una nueva réplica a una tabla global, se utiliza la capacidad de lectura de la tabla de origen o de la réplica como valor inicial, a menos que se especifique explícitamente una sustitución a nivel de réplica.

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

En las tablas globales configuradas para el modo bajo demanda, la capacidad de escritura se sincroniza automáticamente en todas las réplicas. DynamoDB ajusta automáticamente la capacidad en función del tráfico y no hay que gestionar ninguna configuración de capacidad de lectura o escritura específica para las réplicas.

## Monitoreo de tablas globales
<a name="monitoring-global-tables"></a>

Las tablas globales configuradas para una coherencia final de varias regiones (MREC) publican la métrica [`ReplicationLatency`](metrics-dimensions.md#ReplicationLatency) en CloudWatch. Esta métrica realiza un seguimiento del tiempo transcurrido entre el momento en que un elemento se escribe en una tabla de réplica y el momento en que dicho elemento aparece en otra réplica de la tabla global. `ReplicationLatency` se expresa en milisegundos y se emite para cada par de región de origen y destino en una tabla global. 

Los valores típicos de `ReplicationLatency` dependen de la distancia entre las regiones de AWS elegidas, así como de otras variables, como el tipo de carga de trabajo y el rendimiento. Por ejemplo, una réplica de origen en la región Oeste de EE. UU. (Norte de California) (us-west-1) tiene un nivel más bajo de `ReplicationLatency` hacia la región Oeste de EE. UU. (Oregón) (us-west-2) en comparación con la región África (Ciudad del Cabo) (af-south-1).

Un valor en aumento de `ReplicationLatency` podría indicar que las actualizaciones de una réplica no se están propagando hacia otras tablas de réplica de manera puntual. En este caso, puede redirigir temporalmente la actividad de lectura y escritura de la aplicación a otra región de AWS.

Las tablas globales configuradas para coherencia alta de varias regiones (MRSC) no publican una métrica de `ReplicationLatency`.

## Consideraciones para la administración de tablas globales
<a name="management-considerations"></a>

No puede eliminar una tabla utilizada para agregar una nueva réplica de tabla global hasta que hayan transcurrido 24 horas desde que se creó la nueva réplica.

Si desactiva una región de AWS que contiene réplicas de tablas globales, esas réplicas se convierten permanentemente en tablas de una sola región 20 horas después de desactivar la región.

# Tabla global de la misma cuenta de DynamoDB
<a name="globaltables-SameAccount"></a>

Las tablas globales de la misma cuenta replican automáticamente los datos de las tablas de DynamoDB en todas las regiones de AWS dentro de una sola cuenta de AWS. Las tablas globales de la misma cuenta proporcionan el modelo más sencillo para ejecutar aplicaciones de varias regiones, ya que todas las réplicas comparten el mismo modelo de límites de cuentas, propiedad y permisos. Cuando elige las regiones de AWS para las tablas de réplicas, las tablas globales gestionan toda la replicación automáticamente. Las tablas globales están disponibles en todas las regiones donde DynamoDB está disponible.

Las tablas globales de la misma cuenta proporcionan los siguientes beneficios:
+ Replicación de forma automática de los datos de las tablas de DynamoDB en las regiones de AWS que elija para ubicar los datos más cerca de los usuarios
+ Habilitación de una mayor disponibilidad de las aplicaciones durante el aislamiento o la degradación regional
+ Use la resolución de conflictos integrada para centrarse en la lógica empresarial de la aplicación.
+ Al crear una tabla global de la misma cuenta, puede elegir entre [Consistencia posterior de varias regiones (MREC)](V2globaltables_HowItWorks.md#V2globaltables_HowItWorks.consistency-modes.mrec) o [Coherencia alta de varias regiones (MRSC)](V2globaltables_HowItWorks.md#V2globaltables_HowItWorks.consistency-modes.mrsc).

**Topics**
+ [Funcionamiento de las tablas globales de DynamoDB](V2globaltables_HowItWorks.md)
+ [Tutoriales: creación de tablas globales](V2globaltables.tutorial.md)
+ [Seguridad de las tablas globales de DynamoDB](globaltables-security.md)

# Funcionamiento de las tablas globales de DynamoDB
<a name="V2globaltables_HowItWorks"></a>

En las siguientes secciones, se describen los conceptos y los comportamientos de las tablas globales en Amazon DynamoDB.

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

Las *tablas globales* son una característica de DynamoDB que replica los datos de las tablas en todas las regiones de AWS. 

Una *tabla de réplica* (o réplica) es una tabla de DynamoDB que funciona como parte de una tabla global. Una tabla global consta de dos o más tablas de réplica en diferentes regiones de AWS. Cada tabla global solo puede tener una réplica por región de AWS. Todas las réplicas de una tabla global comparten el mismo nombre de tabla, esquema de clave principal y datos de elementos.

Cuando una aplicación escribe datos en una réplica en una región, DynamoDB replica automáticamente la escritura en el resto de las réplicas en la tabla global. Para obtener más información sobre cómo empezar a usar tablas globales, consulte [Tutoriales: creación de tablas globales](V2globaltables.tutorial.md).

## Versiones
<a name="V2globaltables_HowItWorks.versions"></a>

Hay disponibles dos versiones de las tablas globales de DynamoDB: versión 2019.11.21 (actual) y [versión 2017.11.29 (antigua)](globaltables.V1.md). Debe utilizar la versión 2019.11.21 (actual) siempre que sea posible. La información de esta sección de la documentación corresponde a la versión 2019.11.21 (actual). Para obtener más información, consulte [Determinación de la versión de una tabla global](V2globaltables_versions.md#globaltables.DetermineVersion).

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

Las tablas globales ayudan a mejorar la continuidad empresarial al facilitar la implementación de una arquitectura de alta disponibilidad de varias regiones. Si una carga de trabajo en una única región de AWS se ve afectada, puede cambiar el tráfico de la aplicación a otra región y realizar las operaciones de lectura y escritura en una tabla de réplica diferente en la misma tabla global.

Cada tabla réplica en una tabla global proporciona la misma durabilidad y disponibilidad que una tabla de DynamoDB de una sola región. Las tablas globales ofrecen un [Acuerdo de nivel de servicio (SLA)](https://aws.amazon.com//dynamodb/sla/) con una disponibilidad del 99,999 %, en comparación con el 99,99 % de las tablas de una sola región.

## Modos de coherencia
<a name="V2globaltables_HowItWorks.consistency-modes"></a>

Al crear una tabla global, puede configurar el modo de consistencia. Las tablas globales admiten dos modos de coherencia: coherencia final de varias regiones (MREC) y coherencia alta de varias regiones (MRSC).

Si no especifica un modo de coherencia al crear una tabla global, esta adoptará de forma predeterminada la coherencia final de varias regiones (MREC). Una tabla global no puede contener réplicas configuradas con diferentes modos de coherencia. No puede cambiar el modo de coherencia de una tabla global después de la creación.

### Consistencia posterior de varias regiones (MREC)
<a name="V2globaltables_HowItWorks.consistency-modes.mrec"></a>

La coherencia final de varias regiones (MREC) es el modo de coherencia predeterminado para las tablas globales. Los cambios de elementos en una réplica de tabla global de MREC se replican de forma asíncrona en todas las demás réplicas, normalmente en un segundo o menos. En el improbable caso de que una réplica de una tabla global de MREC quede aislada o se vea afectada, cualquier dato que aún no se haya replicado en otras regiones se replicará cuando la réplica recupere el estado correcto.

Si el mismo elemento se modifica simultáneamente en varias regiones, DynamoDB resolverá el conflicto mediante la modificación con la última marca temporal interna por elemento, lo que se denomina método de resolución de conflictos “el último escritor gana”. Al final, un elemento convergerá en todas las réplicas a la versión creada por la última escritura.

Las [operaciones de lectura altamente coherente](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_GetItem.html#DDB-GetItem-request-ConsistentRead) devuelven la versión más reciente de un elemento si este se ha actualizado por última vez en la región en la que se ha producido la lectura, pero podrían devolver datos obsoletos si el elemento se ha actualizado por última vez en una región diferente. Las escrituras condicionales evalúan la expresión de la condición comparándola con la versión del elemento en la región.

Para crear una tabla global de MREC, se agrega una réplica a una tabla de DynamoDB existente. La agregación de una réplica no tiene impacto en el rendimiento de las tablas de DynamoDB de una sola región ni de las réplicas de tablas globales existentes. Puede agregar réplicas a una tabla global de MREC para ampliar el número de regiones en las que se replican los datos o eliminar réplicas de una tabla global de MREC si ya no son necesarias. Una tabla global de MREC puede tener una réplica en cualquier región en la que DynamoDB esté disponible y puede tener tantas réplicas como regiones haya en la [partición de AWS.](https://docs.aws.amazon.com/whitepapers/latest/aws-fault-isolation-boundaries/partitions.html)

### Coherencia alta de varias regiones (MRSC)
<a name="V2globaltables_HowItWorks.consistency-modes.mrsc"></a>

Puede configurar el modo de coherencia alta de varias regiones (MRSC) al crear una tabla global. Los cambios de elementos en la réplica de una tabla global de MRSC se replican de forma sincrónica en al menos otra región antes de que la operación de escritura devuelva una respuesta correcta. Las operaciones de lectura altamente coherente en cualquier réplica de MRSC siempre devuelven la versión más reciente de un elemento. Las escrituras condicionales siempre evalúan la expresión de la condición comparándola con la versión más reciente de un elemento.

Una tabla global de MRSC se debe implementar exactamente en tres regiones. Puede configurar una tabla global de MRSC con tres réplicas o con dos réplicas y un testigo. Un testigo es un componente de una tabla global de MRSC que contiene datos escritos en réplicas de tablas globales y proporciona una alternativa opcional a una réplica completa, al tiempo que admite la arquitectura de disponibilidad de MRSC. No puede realizar operaciones de lectura o escritura en un testigo. Un testigo se encuentra en una región diferente a las dos réplicas. Al crear una tabla global de MRSC, debe elegir las regiones para las réplicas y para la implementación de testigos en el momento de crear la tabla de MRSC. Puede determinar si una tabla global de MRSC tiene un testigo configurado y en qué región, a partir de la salida de la API de [https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeTable.html](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeTable.html). El testigo es propiedad y lo administra DynamoDB, y no aparecerá en la cuenta de AWS en la región en la que esté configurado.

Las tablas globales del MRSC están disponibles en los siguientes conjuntos de regiones: conjunto de regiones de EE. UU. (Este de EE. UU. (Norte de Virginia, Este de EE. UU. (Ohio), Oeste de EE. UU. (Oregón)), conjunto de regiones de la UE (Europa Irlanda, Europa Londres, Europa París, Europa Fráncfort) y conjunto de regiones de Asia-Pacífico (Asia Pacífico Tokio, Asia Pacífico Seúl y Asia Pacífico Osaka). Las tablas globales de MRSC no pueden abarcar conjuntos de regiones (por ejemplo, una tabla global de MRSC no puede contener réplicas de conjuntos de regiones de EE. UU. y de la UE).

Se crea una tabla global de MRSC mediante la agregación de una réplica y un testigo o dos réplicas a una tabla de DynamoDB existente que no contenga datos. Al convertir una tabla de una sola región existente en una tabla global de MRSC, debe asegurarse de que la tabla esté vacía. No se admite la conversión de una tabla de una sola región en una tabla global de MRSC con los elementos existentes. Asegúrese de que no se escriba ningún dato en la tabla durante el proceso de conversión. No puede agregar réplicas adicionales a una tabla global de MRSC existente. No puede eliminar una réplica única o un testigo de una tabla global de MRSC. Puede eliminar dos réplicas o eliminar una réplica y un testigo de una tabla global de MRSC, convirtiendo la réplica restante en una tabla de DynamoDB de una sola región.

Una operación de escritura produce un error con una `ReplicatedWriteConflictException` cuando intenta modificar un elemento que ya se está modificando en otra región. Las escrituras que tengan un error con la `ReplicatedWriteConflictException` se pueden reintentar y se realizarán correctamente si el elemento ya no se está modificando en otra región.

Las siguientes consideraciones se aplican a las tablas globales de MRSC:
+ El Tiempo de vida (TTL) no se admite para las tablas globales de MRSC.
+ Los índices secundarios locales (LSI) no se admiten para las tablas globales de MRSC.
+ La información de CloudWatch Contributor Insights solo se comunica para la región en la que se ha producido una operación.

## Elección de un modo de coherencia
<a name="V2globaltables_HowItWorks.choosing-consistency-mode"></a>

El criterio clave para elegir un modo de coherencia de varias regiones es si la aplicación prioriza las escrituras de menor latencia y las lecturas altamente coherentes, o si prioriza la coherencia alta global.

Las tablas globales de MREC tendrán latencias de escritura y lectura altamente coherente inferiores en comparación con las tablas globales de MRSC. Las tablas globales de MREC tienen un objetivo de punto de recuperación (RPO) igual al retraso de replicación entre réplicas, normalmente unos segundos, en función de las regiones de las réplicas.

Debe utilizar el modo MREC cuando:
+ La aplicación puede tolerar que se devuelvan datos obsoletos de operaciones de lectura altamente coherentes si esos datos se han actualizado en otra región.
+ Prioriza las latencias de escritura y de lectura altamente coherente más bajas sobre la consistencia de lectura de varias regiones.
+ La estrategia de alta disponibilidad de varias regiones puede tolerar un RPO superior a cero.

Las tablas globales de MRSC tendrán latencias de escritura y de lectura altamente coherente más elevadas que las tablas globales de MREC. Las tablas globales de MRSC admiten un objetivo de punto de recuperación (RPO) de cero.

Debe utilizar el modo MRSC cuando:
+ Necesita lecturas altamente coherentes en varias regiones.
+ Dé prioridad a la consistencia de lectura global sobre una latencia de escritura menor.
+ La estrategia de alta disponibilidad de varias regiones requiera un RPO de cero.

## Monitoreo de tablas globales
<a name="monitoring-global-tables"></a>

Las tablas globales configuradas para una coherencia final de varias regiones (MREC) publican la métrica [`ReplicationLatency`](metrics-dimensions.md#ReplicationLatency) en CloudWatch. Esta métrica realiza un seguimiento del tiempo transcurrido entre el momento en que un elemento se escribe en una tabla de réplica y el momento en que dicho elemento aparece en otra réplica de la tabla global. `ReplicationLatency` se expresa en milisegundos y se emite para cada par de región de origen y destino en una tabla global. 

Los valores típicos de `ReplicationLatency` dependen de la distancia entre las regiones de AWS elegidas, así como de otras variables, como el tipo de carga de trabajo y el rendimiento. Por ejemplo, una réplica de origen en la región Oeste de EE. UU. (Norte de California) (us-west-1) tiene un nivel más bajo de `ReplicationLatency` hacia la región Oeste de EE. UU. (Oregón) (us-west-2) en comparación con la región África (Ciudad del Cabo) (af-south-1).

Un valor en aumento de `ReplicationLatency` podría indicar que las actualizaciones de una réplica no se están propagando hacia otras tablas de réplica de manera puntual. En este caso, puede redirigir temporalmente la actividad de lectura y escritura de la aplicación a otra región de AWS.

Las tablas globales configuradas para coherencia alta de varias regiones (MRSC) no publican una métrica de `ReplicationLatency`.

## Pruebas de inyección de errores
<a name="fault-injection-testing"></a>

Las tablas globales de MREC y MRSC se integran con el [Servicio de inyección de errores de AWS](https://docs.aws.amazon.com/resilience-hub/latest/userguide/testing.html) (AWS FIS), un servicio totalmente gestionado para ejecutar experimentos controlados de inyección de errores con el fin de mejorar la resiliencia de una aplicación. Con el AWS FIS, puede hacer lo siguiente:
+ Crear plantillas de experimentos que definen escenarios de error específicos.
+ Inyectar errores para validar la resiliencia de la aplicación simulando el aislamiento de una región (es decir, deteniendo la replicación hacia y desde una réplica seleccionada) para probar la gestión de errores, los mecanismos de recuperación y el comportamiento del cambio de tráfico entre regiones cuando una región de AWS sufre una interrupción.

Por ejemplo, en una tabla global con réplicas en el Este de EE. UU. (Norte de Virginia), el Este de EE. UU. (Ohio) y el Oeste de EE. UU. (Oregón), puede realizar un experimento en el Este de EE. UU. (Ohio) para probar el aislamiento de la región allí, mientras que el Este de EE. UU. (Norte de Virginia) y el Oeste de EE. UU. (Oregón) continúan con sus operaciones normales. Estas pruebas controladas le ayudan a identificar y resolver posibles problemas antes de que afecten a las cargas de trabajo de producción. 

Consulte los [objetivos de acción](https://docs.aws.amazon.com/fis/latest/userguide/action-sequence.html#action-targets) en la *Guía del usuario de AWS FIS* para obtener una lista completa de las acciones respaldadas por AWS FIS y [Conectividad entre regiones](https://docs.aws.amazon.com/fis/latest/userguide/cross-region-scenario.html) para detener la replicación de DynamoDB entre regiones.

Para obtener información sobre las acciones de las tablas globales de Amazon DynamoDB disponibles en AWS FIS, consulte [Referencia de acciones de tablas globales de DynamoDB](https://docs.aws.amazon.com/fis/latest/userguide/fis-actions-reference.html#dynamodb-actions-reference) en la *Guía del usuario de AWS FIS*.

Para empezar a realizar experimentos de inyección de errores, consulte [Planificación de los experimentos de AWS FIS](https://docs.aws.amazon.com/fis/latest/userguide/getting-started-planning.html) en la Guía del usuario de AWS FIS.

**nota**  
Durante los experimentos de AWS FIS en la MRSC, se permiten lecturas coherentes posteriores, pero no se permiten actualizaciones de configuración de las tablas, como cambiar el modo de facturación o configurar el rendimiento de las tablas, de forma similar a lo que ocurre con la MREC. Consulte la métrica de CloudWatch [`FaultInjectionServiceInducedErrors`](metrics-dimensions.md#FaultInjectionServiceInducedErrors) para obtener información adicional sobre el código de errores.

## Tiempo de vida (TTL)
<a name="global-tables-ttl"></a>

Las tablas globales configuradas para MREC admiten la configuración de la eliminación de [Tiempo de vida](TTL.md) (TTL). La configuración de TTL se sincroniza automáticamente para todas las réplicas en una tabla global. Cuando TTL elimina un elemento de una réplica en una región, la eliminación se replica en todas las demás réplicas de la tabla global. El TTL no consume capacidad de escritura, por lo que no se le cobrará por la eliminación de TTL en la región donde se realizó la eliminación. Sin embargo, se le cobrará por la eliminación replicada en cada una de las demás regiones con una réplica en la tabla global.

La replicación de eliminación de TTL consume la capacidad de escritura de las réplicas en las que se está replicando la eliminación. Las réplicas configuradas para la capacidad aprovisionada pueden limitar las solicitudes si la combinación del rendimiento de escritura y el rendimiento de eliminación de TTL es superior a la capacidad de escritura aprovisionada.

Las tablas globales configuradas para la coherencia alta de varias regiones (MRSC) no admiten la configuración de la eliminación de Tiempo de vida (TTL).

## Transmisión
<a name="global-tables-streams"></a>

Las tablas globales configuradas para una coherencia final de varias regiones (MREC) replican los cambios leyendo esos cambios desde un [Flujo de DynamoDB](Streams.md) en una tabla de réplica y aplicándolos a todas las demás tablas de réplica. Por lo tanto, los flujos están habilitados de forma predeterminada en todas las réplicas de una tabla global de MREC y no se pueden desactivar en esas réplicas. El proceso de replicación de MREC puede combinar varios cambios en un corto periodo de tiempo en una sola escritura replicada, lo que hace que el flujo de cada réplica contenga registros ligeramente diferentes. Los registros de flujos en las réplicas de MREC siempre se ordenan por elemento, pero el orden entre los elementos puede variar entre las réplicas.

Las tablas globales configuradas para una coherencia sólida de varias regiones (MRSC) no utilizan los flujos de DynamoDB para la replicación, por lo que los flujos no están habilitados de forma predeterminada en las réplicas de MRSC. Puede habilitar flujos en una réplica de MRSC. Los registros de flujos en las réplicas de MRSC son idénticos para todas las réplicas, incluido el orden de los registros de flujos.

Si desea escribir una aplicación que procese los registros de flujos para cambios que se produjeron en una región específica pero no en otras regiones de una tabla global, puede agregar un atributo a cada elemento que defina en qué región se produjo el cambio para ese elemento. Puede usar este atributo para filtrar los registros de flujos en busca de cambios que se hayan producido en otras regiones, incluido el uso de filtros de eventos de Lambda para invocar solo las funciones de Lambda para los cambios en una región específica.

## Transacciones
<a name="global-tables-transactions"></a>

En una tabla global configurada para MREC, las operaciones de transacción de DynamoDB ([https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_TransactWriteItems.html](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_TransactWriteItems.html) y [https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_TransactGetItems.html](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_TransactGetItems.html)) son solo atómicas dentro de la región donde se invocó la operación. Las escrituras transaccionales no se replican como una unidad en todas las regiones, lo que significa que solo algunas de las escrituras de una transacción pueden devolverse mediante operaciones de lectura en otras réplicas en un momento dado.

Por ejemplo, si tiene una tabla global con réplicas en las regiones Este de EE. UU. (Ohio) y Oeste de EE. UU. (Oregón) y realiza una operación `TransactWriteItems` en la región Este de EE. UU. (Ohio), puede observar transacciones completadas parcialmente en la región Oeste de EE. UU. (Oregón) a medida que los cambios se replican. Solo se replicarán los cambios en otras regiones cuando se hayan confirmado en la región de origen.

Las tablas globales configuradas para lograr una coherencia alta de varias regiones (MRSC) no admiten operaciones de transacción y devolverán un error si esas operaciones se invocan en una réplica de MRSC.

## Rendimiento de lectura y escritura
<a name="V2globaltables_HowItWorks.Throughput"></a>

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

La replicación consume capacidad de escritura. Las réplicas configuradas para la capacidad aprovisionada pueden limitar las solicitudes si la combinación del rendimiento de escritura de la aplicación y el rendimiento de escritura de la replicación supera la capacidad de escritura aprovisionada. En el caso de las tablas globales que utilizan el modo aprovisionado, la configuración de escalado automático para las capacidades de lectura y escritura se sincroniza entre las réplicas.

Puede configurar de forma independiente los ajustes de capacidad de lectura para cada réplica en una tabla global usando el parámetro [https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_ProvisionedThroughputOverride.html](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_ProvisionedThroughputOverride.html) a nivel de réplica. De forma predeterminada, los cambios en la capacidad de lectura aprovisionada se aplican a todas las réplicas de la tabla global. Al agregar una nueva réplica a una tabla global, se utiliza la capacidad de lectura de la tabla de origen o de la réplica como valor inicial, a menos que se especifique explícitamente una sustitución a nivel de réplica.

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

En las tablas globales configuradas para el modo bajo demanda, la capacidad de escritura se sincroniza automáticamente en todas las réplicas. DynamoDB ajusta automáticamente la capacidad en función del tráfico y no hay que gestionar ninguna configuración de capacidad de lectura o escritura específica para las réplicas.

## Sincronización de ajustes
<a name="V2globaltables_HowItWorks.setting-synchronization"></a>

Los ajustes de las tablas globales de DynamoDB son parámetros de configuración que controlan varios aspectos del comportamiento y la replicación de las tablas. Estos ajustes se administran mediante las API del plano de control de DynamoDB y se pueden configurar al crear o modificar tablas globales. Las tablas globales sincronizan automáticamente determinados ajustes en todas las réplicas para mantener la coherencia, al tiempo que permiten flexibilidad para optimizaciones específicas de cada región. Entender qué ajustes se sincronizan y cómo se comportan le ayuda a configurar la tabla global de manera efectiva. Los ajustes se dividen en tres categorías principales en función de cómo se sincronizan entre las réplicas.

Los siguientes ajustes siempre se sincronizan entre las réplicas de una tabla global:
+ Modo de capacidad (capacidad aprovisionada o bajo demanda)
+ Capacidad de escritura aprovisionada de tabla
+ Escalado automático de la escritura de tablas
+ Definición de atributos del esquema de claves
+ Definición del índice secundario global (GSI)
+ Capacidad de escritura aprovisionada por GSI
+ Escalado automático de escritura de GSI
+ Tipo de cifrado del servidor (SSE)
+ Definición de flujos en modo de MREC
+ Tiempo de vida (TTL)
+ Rendimiento en caliente
+ Rendimiento de escritura máximo bajo demanda

Los siguientes ajustes se sincronizan entre las réplicas, pero se pueden invalidar por réplica:
+ La capacidad de lectura aprovisionada de la tabla
+ Escalado automático de lectura de tablas
+ Capacidad de lectura aprovisionada de GSI
+ Escalado automático de lectura de GSI
+ Clase de tabla
+ Rendimiento de lectura máximo bajo demanda

**nota**  
Los valores de configuración anulables se modifican si la configuración se cambia en cualquier otra réplica. Como ejemplo, tiene una tabla global de MREC con réplicas en Este de EE. UU. (Norte de Virginia) y Oeste de EE. UU. (Oregón). La réplica de Este de EE. UU. (Norte de Virginia) tiene un rendimiento de lectura aprovisionado establecido en 200 RCU. La réplica en Oeste de EE. UU. (Oregón) tiene una invalidación del rendimiento de lectura aprovisionada establecida en 100 RCU. Si actualiza la configuración de rendimiento de lectura aprovisionada en la réplica de Este de EE. UU. (Norte de Virginia) de 200 a 300 RCU, el nuevo valor de rendimiento de lectura aprovisionado también se aplicará a la réplica en Oeste de EE. UU. (Oregón). Esto cambia la configuración de rendimiento de lectura aprovisionada para la réplica de Oeste de EE. UU. (Oregón) del valor invalidado de 100 RCU al nuevo valor de 300 RCU.

Los siguientes ajustes nunca se sincronizan entre réplicas:
+ Protección contra eliminación
+ Recuperación en un momento dado
+ Etiquetas
+ Habilitación de CloudWatch Contributor Insights para tablas
+ Habilitación de CloudWatch Contributor Insights para GSI
+ Definición de Kinesis Data Streams
+ Políticas de recursos
+ Definición de flujos en modo de MRSC

Todos los demás ajustes no están sincronizados entre réplicas.

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

Las réplicas de escrituras en tablas globales omiten DynamoDB Accelerator (DAX) y actualizan DynamoDB directamente. Como resultado, las cachés de DAX pueden quedar obsoletas, ya que las escrituras no actualizan la caché de DAX. Las cachés de DAX configuradas para réplicas de tablas globales solo se actualizarán cuando caduque el TTL de la caché.

## Consideraciones para la administración de tablas globales
<a name="management-considerations"></a>

No puede eliminar una tabla utilizada para agregar una nueva réplica de tabla global hasta que hayan transcurrido 24 horas desde que se creó la nueva réplica.

Si desactiva una región de AWS que contiene réplicas de tablas globales, esas réplicas se convierten permanentemente en tablas de una sola región 20 horas después de desactivar la región.

# Tutoriales: creación de tablas globales
<a name="V2globaltables.tutorial"></a>

Esta sección proporciona instrucciones paso a paso para crear tablas globales de DynamoDB configuradas para su modo de coherencia preferido. Elija los modos de coherencia final de varias regiones (MREC) o coherencia alta de varias regiones (MRSC) según los requisitos de la aplicación.

Las tablas globales de MREC proporcionan una latencia de escritura más baja con coherencia final en todas las Regiones de AWS. Las tablas globales de MRSC proporcionan lecturas altamente coherentes en todas las regiones, con latencias de escritura ligeramente superiores a las de MREC. Elija el modo de coherencia que mejor se adapte a las necesidades de la aplicación en cuanto a coherencia de datos, latencia y disponibilidad.

**Topics**
+ [Creación de una tabla global configurada para MREC](#V2creategt_mrec)
+ [Creación de una tabla global configurada para MRSC](#create-gt-mrsc)

## Creación de una tabla global configurada para MREC
<a name="V2creategt_mrec"></a>

En esta sección se muestra cómo crear una tabla global con el modo de coherencia final de varias regiones (MREC). MREC es el modo de coherencia predeterminado para tablas globales y proporciona escrituras de baja latencia con replicación asincrónica en todas las Regiones de AWS. Los cambios realizados en un elemento de una región suelen replicarse en todas las demás regiones en un segundo. Esto hace que MREC sea ideal para aplicaciones que priorizan una baja latencia de escritura y pueden tolerar breves periodos en los que diferentes regiones pueden devolver versiones de datos ligeramente diferentes.

Puede crear tablas globales de MREC con réplicas en cualquier región de AWS donde DynamoDB esté disponible y agregar o eliminar réplicas en cualquier momento. Los ejemplos siguientes muestran cómo crear una tabla global de MREC con réplicas en varias regiones.

### Creación de una tabla global de MREC mediante la consola de DynamoDB
<a name="mrec-console"></a>

Siga estos pasos para crear una tabla global mediante la Consola de administración de AWS. En el ejemplo siguiente, se crea una tabla global con tablas de réplica en Estados Unidos y Europa.

1. Inicie sesión en la Consola de administración de AWS y abra la consola de DynamoDB en [https://console.aws.amazon.com/dynamodb/](https://console.aws.amazon.com/dynamodb/).

1. Para este ejemplo, elija **Este de EE. UU. (Ohio)** en el selector de regiones en la barra de navegación.

1. En el panel de navegación del lado izquierdo de la consola, elija **Tablas**.

1. Seleccione **Create Table (Crear tabla)**.

1. En la página **Crear tabla**:

   1. En **Nombre de la tabla**, introduzca **Music**.

   1. En **Partition key** (Clave de partición), ingrese **Artist**.

   1. Para **Clave de clasificación**, ingrese **SongTitle**.

   1. Deje los demás valores predeterminados y elija **Crear tabla**.

      Esta nueva tabla le servirá de primera tabla de réplica en una nueva tabla global. Será el prototipo para crear otras tablas de réplica que quiera añadir más tarde.

1. Cuando la tabla se active:

   1. Elija la tabla **Música** en la lista de tablas.

   1. Elija la pestaña **Tablas globales**.

   1. Elija **Create replica (Crear réplica)**.

1. En el menú desplegable **Regiones de replicación disponibles**, elija **Oeste de EE. UU. (Oregón) us-west-2**.

   La consola asegura que no haya ninguna tabla con el mismo nombre en la región seleccionada. Si ya existe una tabla con el mismo nombre, debe eliminar la tabla existente antes de crear una nueva tabla de réplica en esa región.

1. Elija **Create replica (Crear réplica)**. Esto comienza el proceso de creación de la tabla en la región Oeste de EE. UU (Oregón) us-west-2.

   La pestaña **Tablas globales** de la tabla **Música** (y de cualquier otra tabla de réplica) indica que la tabla se ha replicado en varias regiones.

1. Agregue otra región repitiendo los pasos anteriores, pero elija **Europa (Fráncfort) eu-central-1** como región.

1. Para probar la replicación:

   1. Asegúrese de que utiliza la Consola de administración de AWS en la región Este de EE. UU. (Ohio).

   1. Elija **Explorar elementos de la tabla**.

   1. Seleccione **Crear elemento**.

   1. Ingrese **item\$11** para **Artista** y **Song Value 1** para **Título de la canción**.

   1. Seleccione **Crear elemento**.

1. Compruebe la replicación cambiando a las otras regiones:

   1. En el selector de regiones en la esquina superior derecha, elija **Europa (Fráncfort)**.

   1. Compruebe que la tabla **Música** contiene el elemento que ha creado.

   1. Repita la verificación para **Oeste de EE. UU. (Oregón)**.

### Creación de una tabla global de MREC mediante AWS CLI o Java
<a name="mrec-cli-java"></a>

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

En el siguiente ejemplo de código, se muestra cómo administrar las tablas globales de DynamoDB con replicación de varias regiones con coherencia final (MREC).
+ Cree una tabla con replicación de varias regiones (MREC).
+ Coloque y obtenga elementos de las tablas de réplica.
+ Elimine réplicas una por una.
+ Efectúe una limpieza eliminando la tabla.

**AWS CLI con Bash script**  
Cree una tabla con replicación de varias regiones.  

```
# 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
```
Describa la tabla de varias regiones.  

```
# 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}}'
```
Coloque elementos en una tabla de 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
```
Obtenga elementos de las tablas de 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
```
Elimine 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
```
Efectúe una limpieza eliminando la tabla.  

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

echo "Global table demonstration complete."
```
+ Para obtener información sobre la API, consulte los siguientes temas en la *Referencia de comandos de 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 ]

En el ejemplo de código siguiente, se muestra cómo crear y administrar las tablas globales de DynamoDB con réplicas en varias regiones.
+ Cree una tabla con un índice secundario global y flujos de DynamoDB.
+ Agregue réplicas en diferentes regiones para crear una tabla global.
+ Elimine réplicas de una tabla global.
+ Agregue elementos de prueba para verificar la replicación en todas las regiones.
+ Describa la configuración de la tabla global y el estado de las réplicas.

**SDK para Java 2.x**  
Cree una tabla con un índice secundario global y flujos de DynamoDB mediante 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;
        }
    }
```
Espere a que una tabla se active mediante 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;
        }
    }
```
Agregue una réplica para crear o ampliar una tabla global mediante 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;
        }
    }
```
Elimine una réplica de una tabla global mediante 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;
        }
    }
```
Agregue elementos de prueba para verificar la replicación mediante 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;
        }
    }
```
Describa la configuración de la tabla global y las réplicas mediante 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;
        }
    }
```
Ejemplo completo de operaciones de tablas globales mediante 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 obtener detalles sobre la API, consulte los siguientes temas en la *Referencia de la API de 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)

------

## Creación de una tabla global configurada para MRSC
<a name="create-gt-mrsc"></a>

En esta sección se muestra cómo crear una tabla global de coherencia alta de varias regiones (MRSC). Las tablas globales de MRSC replican de forma sincrónica los cambios de los elementos en todas las regiones, lo que garantiza que las operaciones de lectura altamente coherente en cualquier réplica siempre devuelvan la versión más reciente de un elemento. Al convertir una tabla de una sola región en una tabla global de MRSC, debe asegurarse de que la tabla esté vacía. No se admite la conversión de una tabla de una sola región en una tabla global de MRSC con los elementos existentes. Asegúrese de que no se escriba ningún dato en la tabla durante el proceso de conversión.

Puede configurar una tabla global de MRSC con tres réplicas o dos réplicas y un testigo. Al crear una tabla global de MRSC, debe elegir las regiones en las que se despliegan las réplicas y un testigo opcional. En el siguiente ejemplo, se crea una tabla global de MRSC con réplicas en las regiones Este de EE. UU. (Norte de Virginia) y Este de EE. UU. (Ohio), con un testigo en la región Oeste de EE. UU. (Oregón).

**nota**  
Antes de crear una tabla global, compruebe que los límites de rendimiento de la cuota de servicio sean coherentes en todas las regiones de destino, ya que es necesario para crear una tabla global. Para obtener más información sobre los límites de rendimiento de las tablas globales, consulte [Cuotas de tablas globales](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ServiceQuotas.html#gt-limits-throughput).

### Creación de una tabla global de MRSC mediante la consola de DynamoDB
<a name="mrsc_console"></a>

Siga estos pasos para crear una tabla global de MRSC mediante la Consola de administración de AWS.

1. Inicie sesión en la Consola de administración de AWS y abra la consola de DynamoDB en [https://console.aws.amazon.com/dynamodb/](https://console.aws.amazon.com/dynamodb/).

1. En el selector de regiones de la barra de navegación, elija una región en la que [se admiten](V2globaltables_HowItWorks.md#V2globaltables_HowItWorks.consistency-modes) tablas globales con MRSC, como **us-east-2**.

1. En el panel de navegación, elija **Tablas**.

1. Seleccione **Create table (Creación de tabla)**.

1. En la página **Crear tabla**:

   1. En **Nombre de la tabla**, introduzca **Music**.

   1. En **Clave de partición**, ingrese **Artist** y mantenga la **Cadena** predeterminada.

   1. En **Clave de clasificación**, ingrese **SongTitle** y mantenga el tipo de **Cadena** predeterminada.

   1. Deje los demás valores predeterminados y elija **Crear tabla**

      Esta nueva tabla le servirá de primera tabla de réplica en una nueva tabla global. Será el prototipo para crear otras tablas de réplica que quiera añadir más tarde.

1. Espere a que la tabla se active y luego selecciónela en la lista de tablas.

1. Elija la pestaña **Tablas globales** y, a continuación, seleccione **Crear réplica**.

1. En la página **Crear réplica**:

   1. En **Consistencia de varias regiones**, elija **Consistencia alta**.

   1. Para **Región de replicación 1**, elija **US East (N. Virginia) us-east-1**.

   1. Para **Región de replicación 2**, elija **US West (Oregon) us-west-2**.

   1. Compruebe **Configurar como testigo** para la región Oeste de EE. UU. (Oregón).

   1. Elija **Crear réplicas**.

1. Espere a que se complete el proceso de creación de la réplica y el testigo. El estado de la réplica se mostrará como **Activo** cuando la tabla esté lista para usarse.

### Creación de una tabla global de MRSC mediante la AWS CLI o Java
<a name="mrsc-cli-java"></a>

Antes de empezar, asegúrese de que la entidad principal de IAM tenga los permisos necesarios para crear una tabla global de MRSC con una región testigo.

La política de IAM de ejemplo siguiente le permite crear una tabla de DynamoDB (`MusicTable`) en Este de EE. UU. (Ohio) con una réplica en Este de EE. UU. (Norte de Virginia) y una región testigo en Oeste de EE. UU. (Oregón):

------
#### [ 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"
                }
            }
        }
    ]
}
```

------

Los ejemplos de código siguientes, muestran cómo crear y administrar las tablas globales de DynamoDB con coherencia alta de varias regiones (MRSC).
+ Cree una tabla con coherencia alta de varias regiones.
+ Verifique la configuración de MRSC y el estado de la réplica.
+ Pruebe la coherencia alta entre regiones con lecturas inmediatas.
+ Realice escrituras condicionales con garantías de MRSC.
+ Limpie los recursos de la tabla global de MRSC.

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

**AWS CLI con Bash script**  
Cree una tabla con coherencia alta de varias regiones.  

```
# 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 la configuración de MRSC y el estado de la 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}}'
```
Pruebe la coherencia alta con lecturas inmediatas entre regiones.  

```
# 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
```
Realice escrituras condicionales con garantías 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
```
Limpie los recursos de la tabla global de 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
```
+ Para obtener información sobre la API, consulte los siguientes temas en la *Referencia de comandos de 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**  
Cree una tabla regional lista para la conversión de MRSC con 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();
        }
    }
```
Convierta una tabla regional en MRSC utilizando réplicas y testigos con 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();
        }
    }
```
Describa la configuración de una tabla global de MRSC con 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();
        }
    }
```
Agregue elementos de prueba para verificar la coherencia alta de MRSC con 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();
        }
    }
```
Lea los elementos con lecturas coherentes de las réplicas de MRSC con 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();
        }
    }
```
Realice actualizaciones condicionales con garantías de MRSC mediante 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();
        }
    }
```
Espere a que las réplicas de MRSC y los testigos se activen mediante 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;
        }
    }
```
Limpie las réplicas y los testigos de MRSC mediante 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();
        }
    }
```
Complete la demostración del flujo de trabajo de MRSC mediante 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 obtener detalles sobre la API, consulte los siguientes temas en la *Referencia de la API de 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)

------

# Seguridad de las tablas globales de DynamoDB
<a name="globaltables-security"></a>

Las réplicas de tablas globales son tablas de DynamoDB, por lo que se utilizan los mismos métodos para controlar el acceso a las réplicas que se utilizan para las tablas de una sola región, incluyendo las políticas de identidad y las políticas basadas en recursos de AWS Identity and Access Management (IAM).

En este tema, se describe cómo proteger las tablas globales de DynamoDB mediante permisos de IAM y cifrado de AWS Key Management Service (AWS KMS). Obtendrá información sobre los roles vinculados a servicios (SLR) que permiten la replicación y el escalado automático entre regiones, los permisos de IAM necesarios para crear, actualizar y eliminar tablas globales y las diferencias entre las tablas de coherencia final multirregional (MREC) y multirregional de coherencia sólida (MRSC). También obtendrá información sobre las claves de cifrado de AWS KMS para administrar de forma segura la replicación entre regiones.

## Roles vinculados a servicios para tablas globales
<a name="globaltables-slr"></a>

Las tablas globales de DynamoDB se basan en roles vinculados a servicios (SLR) para administrar la replicación entre regiones y las capacidades de escalado automático.

Solo tiene que configurar estos roles una vez por cuenta de AWS. Una vez creados, los mismos roles sirven en todas las tablas globales de la cuenta. Para obtener más información acerca de los roles vinculados a servicios, consulte [Uso de roles vinculados a servicios](https://docs.aws.amazon.com/IAM/latest/UserGuide/using-service-linked-roles.html) en la *Guía del usuario de IAM*.

### Rol vinculado a servicios de replicación
<a name="globaltables-replication-slr"></a>

Amazon DynamoDB crea automáticamente el rol vinculado al servicio (SLR) `AWSServiceRoleForDynamoDBReplication` cuando se crea la primera tabla global. Este rol administra la replicación entre regiones por usted.

Al aplicar políticas basadas en recursos a las réplicas, asegúrese de no denegar ninguno de los permisos definidos en `AWSServiceRoleForDynamoDBReplicationPolicy` a la entidad principal de SLR, ya que esto interrumpiría la replicación. Si deniega los permisos de SLR necesarios, la replicación hacia y desde las réplicas afectadas se detendrá y el estado de la tabla de réplicas cambiará a `REPLICATION_NOT_AUTHORIZED`.
+ Para tablas globales de coherencia final multirregional (MREC), si una réplica permanece en el estado `REPLICATION_NOT_AUTHORIZED` durante más de 20 horas, la réplica se convierte irreversiblemente en una tabla de DynamoDB de una sola región.
+ Para las tablas globales de coherencia alta multirregionales (MRSC), la denegación de los permisos necesarios se traduce en `AccessDeniedException` para operaciones de escritura y lectura altamente coherentes. Si una réplica permanece en el estado `REPLICATION_NOT_AUTHORIZED` durante más de siete días, la réplica se vuelve permanentemente inaccesible y las operaciones de escritura y de lectura altamente coherentes seguirán produciendo un error. Algunas operaciones de administración, como la eliminación de réplicas, se realizarán correctamente.

### Rol vinculado a un servicio de escalado automático
<a name="globaltables-autoscaling-slr"></a>

Al configurar una tabla global para el modo de capacidad aprovisionada, se debe configurar el escalado automático para la tabla global. El escalado automático de DynamoDB utiliza el servicio de escalado automático de aplicaciones de AWS para ajustar dinámicamente la capacidad de rendimiento aprovisionada en las réplicas de tabla global. El servicio de escalado automático de aplicaciones crea un rol vinculado a un servicio (SLR) denominado [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). Este rol vinculado al servicio se crea automáticamente en la cuenta de AWS al configurar el escalado automático para una tabla de DynamoDB. Permite al escalado automático de aplicaciones administrar la capacidad de la tabla aprovisionada y crear alarmas de CloudWatch. 

 Al aplicar políticas basadas en recursos a las réplicas, asegúrese de no denegar ninguno de los permisos definidos en la [https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSApplicationAutoscalingDynamoDBTablePolicy.html](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSApplicationAutoscalingDynamoDBTablePolicy.html) a la entidad principal de SLR de escalado automático de aplicaciones, ya que esto interrumpiría la funcionalidad de escalado automático.

### Políticas de IAM de ejemplo para roles vinculados a servicios
<a name="globaltables-example-slr"></a>

Una política de IAM con la siguiente condición no afecta a los permisos necesarios para la SLR de replicación de DynamoDB y SLR de escalado automático de AWS. Esta condición se puede agregar a políticas que, de otro modo, serían ampliamente restrictivas para evitar interrumpir involuntariamente la replicación o el escalado automático.

#### Exclusión de los permisos de SLR necesarios de las políticas de denegación
<a name="example-exclude-slr-policy"></a>

En el siguiente ejemplo, se muestra cómo excluir a las entidades principales de roles vinculados al servicio de las instrucciones de denegación:

```
"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"
        ]
    }
}
```

## Uso de las tablas globales de AWS IAM
<a name="globaltables-iam"></a>

En las siguientes secciones, se describen los permisos necesarios para las distintas operaciones de las tablas globales y se proporcionan ejemplos de políticas que le ayudarán a configurar el acceso adecuado para los usuarios y aplicaciones.

**nota**  
Todos los permisos descritos se deben aplicar al ARN del recurso de tabla específico en las regiones afectadas. El ARN del recurso de tabla sigue el formato `arn:aws:dynamodb:region:account-id:table/table-name`, en el que debe especificar los valores reales de la región, el ID de cuenta y el nombre de la tabla.

**Topics**
+ [Creación de tablas globales y agregación de réplicas](#globaltables-creation-iam)
+ [Actualización de tablas globales](#globaltables-update-iam)
+ [Eliminación de tablas globales y réplicas](#globaltables-delete-iam)

### Creación de tablas globales y agregación de réplicas
<a name="globaltables-creation-iam"></a>

Las tablas globales de DynamoDB admiten dos modos de coherencia: coherencia final multirregional (MREC) y coherencia alta multirregional (MRSC). Las tablas globales de MREC pueden tener varias réplicas en cualquier número de regiones y proporcionar coherencia final. Las tablas globales de MRSC requieren exactamente tres regiones (tres réplicas o dos réplicas y un testigo) y proporcionan una coherencia sólida con un objetivo de punto de recuperación (RPO).

Los permisos necesarios para crear tablas globales dependen de si se crea una tabla global con o sin un testigo.

#### Permisos para crear tablas globales
<a name="globaltables-creation-iam-all-types"></a>

Los siguientes permisos son necesarios para la creación inicial de la tabla global y para agregar réplicas posteriormente. Estos permisos se aplican a las tablas globales de coherencia final multirregional (MREC) y coherencia alta multirregional (MRSC).
+ Las tablas globales requieren la replicación entre regiones, que DynamoDB administra mediante el rol vinculado a servicios [`AWSServiceRoleForDynamoDBReplication`](#globaltables-replication-slr) (SLR). El siguiente permiso permite a DynamoDB crear este rol automáticamente al crear una tabla global por primera vez:
  + `iam:CreateServiceLinkedRole`
+ Para crear una tabla global o agregar una réplica mediante la API de [https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateTable.html](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateTable.html), debe tener el siguiente permiso en el recurso de la tabla de origen:
  + `dynamodb:UpdateTable`
+ Debe tener los siguientes permisos en el recurso de la tabla en las regiones para que se agreguen las réplicas:
  + `dynamodb:CreateTable`
  + `dynamodb:CreateTableReplica`
  + `dynamodb:Query`
  + `dynamodb:Scan`
  + `dynamodb:UpdateItem`
  + `dynamodb:PutItem`
  + `dynamodb:GetItem`
  + `dynamodb:DeleteItem`
  + `dynamodb:BatchWriteItem`

#### Permisos adicionales para las tablas globales de MRSC mediante un testigo
<a name="globaltables-creation-iam-witness"></a>

Al crear una tabla global de coherencia alta multirregional (MRSC) con una región testigo, debe tener el siguiente permiso en el recurso de tabla en todas las regiones participantes (incluidas las regiones réplica y la región testigo):
+ `dynamodb:CreateGlobalTableWitness`

#### Políticas de IAM de ejemplo para crear tablas globales
<a name="globaltables-creation-iam-example"></a>

##### Creación de una tabla global de MREC o MRSC en tres regiones
<a name="globaltables-creation-iam-example-three-regions"></a>

La siguiente política basada en la identidad le permite crear una tabla global de MREC o MRSC denominada “usuarios” en tres regiones, incluida la creación del rol vinculado al servicio de replicación de DynamoDB necesario.

------
#### [ 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"
      ]
    }
  ]
}
```

------

##### Restricción de la creación de tablas globales de MREC o MRSC a regiones específicas
<a name="globaltables-creation-iam-example-restrict-regions"></a>

La siguiente política basada en la identidad le permite crear réplicas de tablas globales de DynamoDB en regiones específicas mediante la clave de condición [aws:RequestedRegion](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-requestedregion), incluida la creación del rol vinculado al servicio de replicación de DynamoDB necesario.

------
#### [ 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"
      ]
    }
  ]
}
```

------

##### Creación de una tabla global de MRSC con un testigo
<a name="globaltables-creation-iam-example-witness"></a>

La siguiente política basada en la identidad le permite crear una tabla global de MRSC de DynamoDB denominada “usuarios” con réplicas en us-east-1 y us-east-2 y un testigo en us-west-2, incluida la creación del rol vinculado al servicio de replicación de DynamoDB necesario.

------
#### [ 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"
      ]
    }
  ]
}
```

------

##### Restricción de la creación de testigos de MRSC a regiones específicas
<a name="globaltables-creation-iam-example-restrict-witness-regions"></a>

Esta política basada en la identidad le permite crear una tabla global de MRSC con réplicas restringidas en regiones específicas mediante la clave de condición [aws:RequestedRegion](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-requestedregion) y la creación de testigos sin restricción en todas las regiones, incluida la creación del rol vinculado al servicio de replicación de DynamoDB necesario.

------
#### [ 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"
      ]
    }
  ]
}
```

------

### Actualización de tablas globales
<a name="globaltables-update-iam"></a>

Para modificar la configuración de réplica de una tabla global existente mediante la API de [https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateTable.html](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateTable.html), necesita el siguiente permiso en el recurso de tabla de la región en la que va a realizar la llamada a la API:
+ `dynamodb:UpdateTable`

Además, puede actualizar otras configuraciones de tablas globales, como las políticas de escalado automático y la configuración del tiempo de vida. Se requieren los siguientes permisos para estas operaciones de actualización adicionales:
+ Para actualizar una política de escalado automático de réplicas con la API de [https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateTableReplicaAutoScaling.html](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateTableReplicaAutoScaling.html), debe tener los siguientes permisos en el recurso de la tabla en todas las regiones que contengan 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 actualizar la configuración de Tiempo de vida con la API de [https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateTimeToLive.html](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateTimeToLive.html), debe tener el siguiente permiso en el recurso de la tabla en todas las regiones que contienen réplicas:
  + `dynamodb:UpdateTimeToLive`

  Tenga en cuenta que el Tiempo de vida (TTL) solo se admite para tablas globales configuradas con coherencia final multirregional (MREC). Para obtener más información sobre cómo funcionan las tablas globales con TTL, consulte [Cómo funcionan las tablas globales de DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/V2globaltables_HowItWorks.html).

### Eliminación de tablas globales y réplicas
<a name="globaltables-delete-iam"></a>

Para eliminar una tabla global, debe eliminar todas las réplicas. Los permisos necesarios para esta operación varían en función de si se elimina una tabla global con o sin una región testigo.

#### Permisos para eliminar tablas globales y réplicas
<a name="globaltables-delete-iam-all-types"></a>

Los siguientes permisos son necesarios para eliminar réplicas individuales y para eliminar por completo tablas globales. Al eliminar una configuración de tabla global, solo se elimina la relación de replicación entre tablas de distintas regiones. No se eliminará la tabla de DynamoDB de la última región restante. La tabla de la última región sigue existiendo como tabla estándar de DynamoDB con los mismos datos y configuraciones. Estos permisos se aplican a las tablas globales de coherencia final multirregional (MREC) y coherencia alta multirregional (MRSC). 
+ Para eliminar réplicas de una tabla global mediante la API de [https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateTable.html](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateTable.html), necesita el siguiente permiso en el recurso de tabla de la región desde la que va a realizar la llamada a la API:
  + `dynamodb:UpdateTable`
+ Necesita los siguientes permisos en el recurso de tabla en cada región en la que vaya a eliminar una réplica:
  + `dynamodb:DeleteTable`
  + `dynamodb:DeleteTableReplica`

#### Permisos adicionales para las tablas globales de MRSC mediante un testigo
<a name="globaltables-delete-iam-witness"></a>

Para eliminar una tabla global de coherencia alta multirregional (MRSC) con una región testigo, debe tener el siguiente permiso en el recurso de tabla en todas las regiones participantes (incluidas las regiones réplica y la región testigo):
+ `dynamodb:DeleteGlobalTableWitness`

#### Políticas de IAM de ejemplo para eliminar las réplicas de una tabla global
<a name="globaltables-delete-iam-example"></a>

##### Eliminación de réplicas de tablas globales
<a name="globaltables-delete-replicas-iam-example"></a>

Esta política basada en la identidad le permite eliminar una tabla global de DynamoDB denominada “usuarios” y sus réplicas en tres regiones:

------
#### [ 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"
      ]
    }
  ]
}
```

------

##### Eliminación de una tabla global de MRSC con un testigo
<a name="globaltables-delete-witness-iam-example"></a>

Esta política basada en la identidad le permite eliminar la réplica y el testigo de una tabla global de MRSC denominada “usuarios”:

------
#### [ 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"
      ]
    }
  ]
}
```

------

## Uso de las tablas globales de AWS KMS
<a name="globaltables-kms"></a>

Como todas las tablas de DynamoDB, las réplicas de tablas globales siempre cifran los datos en reposo mediante claves de cifrado almacenadas en AWS Key Management Service (AWS KMS).

Todas las réplicas de una tabla global se deben configurar con el mismo tipo de clave de KMS (clave propia de AWS, clave administrada de AWS o clave administrada por el cliente).

**importante**  
DynamoDB requiere acceso a la clave de cifrado de la réplica para eliminarla. Si desea desactivar o eliminar una clave administrada por el cliente que se utiliza para cifrar una réplica porque va a eliminar la réplica, primero debe eliminar la réplica, esperar a que el estado de la tabla en una de las réplicas restantes cambie a `ACTIVE` y luego desactivar o eliminar la clave.

Para una tabla global configurada para una coherencia final de varias regiones (MREC), si desactiva o revoca el acceso de DynamoDB a una clave administrada por el cliente que se utiliza para cifrar una réplica, la replicación hacia y desde la réplica se detendrá y el estado de la réplica cambiará a `INACCESSIBLE_ENCRYPTION_CREDENTIALS`. Si una réplica de una tabla global de MREC permanece en el estado `INACCESSIBLE_ENCRYPTION_CREDENTIALS` durante más de 20 horas, la réplica se convierte irreversiblemente en una tabla de DynamoDB de una sola región.

Para una tabla global configurada para una coherencia alta de varias regiones (MRSC), si desactiva o revoca el acceso de DynamoDB a una clave administrada por el cliente que se utiliza para cifrar una réplica, la replicación hacia y desde la réplica se detendrá, los intentos para realizar escrituras o lecturas altamente coherentes en la réplica devolverán un error y el estado de la réplica cambiará a `INACCESSIBLE_ENCRYPTION_CREDENTIALS`. Si una réplica de una tabla global de MRSC permanece en el estado `INACCESSIBLE_ENCRYPTION_CREDENTIALS` durante más de siete días, dependiendo de los permisos específicos revocados, la réplica se archivará o quedará inaccesible permanentemente.

# Tablas globales de varias cuentas de DynamoDB
<a name="globaltables-MultiAccount"></a>

Las tablas globales de varias cuentas replican automáticamente los datos de las tablas de DynamoDB en varias regiones de AWS y cuentas de AWS para mejorar la resiliencia, aislar las cargas de trabajo por cuenta y aplicar distintos controles de seguridad y gobernanza. Cada tabla de réplica reside en una cuenta de AWS distinta, lo que permite el aislamiento de errores por región y cuenta. También puede alinear las réplicas con la estructura organizativa de AWS. Las tablas globales de varias cuentas ofrecen beneficios adicionales de aislamiento, gobernanza y seguridad en comparación con las tablas globales de una misma cuenta.

Las tablas globales de varias cuentas proporcionan los siguientes beneficios:
+ Replique datos de tablas de DynamoDB automáticamente en las cuentas y regiones de AWS que elija.
+ Mejore la seguridad y la gobernanza replicando los datos en todas las cuentas con políticas, barreras de protección y límites de cumplimiento distintos.
+ Mejore la resiliencia operativa y el aislamiento de errores por cuenta al colocar las réplicas en cuentas de AWS independientes.
+ Alinee las cargas de trabajo por unidad de negocio o propiedad al utilizar una estrategia de varias cuentas.
+ Simplifique la atribución de costos facturando cada réplica a su cuenta de AWS correspondiente.

Para obtener más información, consulte [Beneficios de usar varias cuentas de AWS](https://docs.aws.amazon.com/whitepapers/latest/organizing-your-aws-environment/benefits-of-using-multiple-aws-accounts.html). Si las cargas de trabajo no requieren la replicación de varias cuentas o si desea una administración de réplicas más sencilla con invalidaciones locales, puede seguir utilizando tablas globales de la misma cuenta.

Puede configurar tablas globales de varias cuentas con [Consistencia posterior de varias regiones (MREC)](V2globaltables_HowItWorks.md#V2globaltables_HowItWorks.consistency-modes.mrec). Las tablas globales configuradas para [Coherencia alta de varias regiones (MRSC)](V2globaltables_HowItWorks.md#V2globaltables_HowItWorks.consistency-modes.mrsc) no admiten el modelo de varias cuentas.

**Topics**
+ [Funcionamiento de las tablas globales de DynamoDB](V2globaltables_MA_HowItWorks.md)
+ [Tutoriales: Creación de tablas globales de varias cuentas](V2globaltables_MA.tutorial.md)
+ [Seguridad de las tablas globales de DynamoDB](globaltables_MA_security.md)

# Funcionamiento de las tablas globales de DynamoDB
<a name="V2globaltables_MA_HowItWorks"></a>

Las tablas globales de varias cuentas amplían las capacidades totalmente administradas, sin servidor, de varias regiones y multiactivas de tablas globales de DynamoDB para abarcar varias cuentas de AWS. Las tablas globales de varias cuentas replican los datos de todas las regiones y cuentas de AWS, lo que proporciona la misma funcionalidad activo-activa que las tablas globales de la misma cuenta. Al escribir en cualquier réplica, DynamoDB replica los datos en todas las demás réplicas.

Entre las principales diferencias con respecto a las tablas globales de la misma cuenta se incluyen las siguientes:
+ La replicación de varias cuentas es compatible con las tablas globales de coherencia final de varias regiones (MREC).
+ Solo puede agregar réplicas comenzando con una tabla de una sola región. No se admite la conversión de una tabla global existente de la misma cuenta en una configuración de varias cuentas. Para migrar, debe eliminar las réplicas existentes para volver a una tabla de una sola región antes de crear una nueva tabla global de varias cuentas.
+ Cada réplica debe residir en una cuenta de AWS independiente. Para una tabla global de varias cuentas con *N* réplicas, debe tener *N* cuentas.
+ Las tablas globales de varias cuentas utilizan una configuración de tabla unificada en todas las réplicas de forma predeterminada. Todas las réplicas comparten automáticamente la misma configuración (como el modo de rendimiento y TTL) y, a diferencia de las tablas globales de la misma cuenta, estas configuraciones no se pueden invalidar por réplica.
+ Los clientes deben proporcionar permisos de replicación a la entidad principal del servicio de tablas globales de DynamoDB en sus políticas de recursos.

Las tablas globales de varias cuentas utilizan la misma tecnología de replicación subyacente que las tablas globales de la misma cuenta. La configuración de las tablas se replica automáticamente en todas las réplicas regionales y los clientes no pueden invalidar ni personalizar la configuración por réplica. Esto garantiza una configuración uniforme y un comportamiento predecible en varias cuentas de AWS que participan en la misma tabla global.

La configuración de las tablas globales de DynamoDB define cómo se comporta una tabla y cómo se replican los datos en todas las regiones. Estos ajustes se configuran mediante las API del plano de control de DynamoDB durante la creación de la tabla o al agregar una nueva réplica regional.

Al crear una tabla global de varias cuentas, los clientes deben configurar `GlobalTableSettingsReplicationMode = ENABLED` para cada réplica regional. Esto garantiza que los cambios de configuración realizados en una región se propaguen automáticamente a todas las demás regiones que participan en la tabla global.

Puede habilitar la replicación de la configuración después de crear la tabla. Esto es compatible con el escenario en el que una tabla se crea originalmente como una tabla regional y, posteriormente, se actualiza a una tabla global de varias cuentas.

**Configuración sincronizada**

Los ajustes de tabla siguientes siempre se sincronizan entre todas las réplicas de una tabla global de varias cuentas:

**nota**  
a diferencia de las tablas globales de la misma cuenta, las tablas globales de varias cuentas no permiten anular esta configuración por región. La única excepción es que se permiten las invalidaciones de las políticas de escalado automático de lectura (tablas y GSI), ya que son recursos externos independientes.
+ Modo de capacidad (capacidad aprovisionada o bajo demanda)
+ Capacidad de lectura y escritura aprovisionada de tablas
+ Escalado automático de lectura y escritura de tablas
+ Definición del índice secundario local (LSI)
+ Definición del índice secundario global (GSI)
+ Capacidad de lectura y escritura aprovisionada de GSI
+ Escalado automático de lectura y escritura de GSI
+ Definición de flujos en modo de MREC
+ Tiempo de vida (TTL)
+ Rendimiento en caliente
+ Rendimiento máximo de lectura y escritura bajo demanda

**Configuración no sincronizada**

Los ajustes siguientes no se sincronizan entre las réplicas y se deben configurar de forma independiente para cada tabla de réplicas de cada región.
+ Clase de tabla
+ Tipo de cifrado del servidor (SSE)
+ Recuperación en un momento dado
+ ID de clave de KMS de cifrado del servidor (SSE)
+ Protección contra eliminación
+ Kinesis Data Streams (KDSD)
+ Etiquetas
+ Política de recursos
+ Información de colaboradores de Cloudwatch (CCI) de tablas
+ Información de colaboradores de Cloudwatch (CCI) de GSI

## Supervisión
<a name="V2globaltables_MA_HowItWorks.monitoring"></a>

Las tablas globales configuradas para una coherencia final de varias regiones (MREC) publican la métrica [`ReplicationLatency`](metrics-dimensions.md#ReplicationLatency) en CloudWatch. Esta métrica realiza un seguimiento del tiempo transcurrido entre el momento en que un elemento se escribe en una tabla de réplica y el momento en que dicho elemento aparece en otra réplica de la tabla global. `ReplicationLatency` se expresa en milisegundos y se emite para cada par de región de origen y destino en una tabla global.

Los valores típicos de `ReplicationLatency` dependen de la distancia entre las regiones de AWS elegidas, así como de otras variables, como el tipo de carga de trabajo y el rendimiento. Por ejemplo, una réplica de origen en la región Oeste de EE. UU. (Norte de California) (us-west-1) tiene un nivel más bajo de `ReplicationLatency` hacia la región Oeste de EE. UU. (Oregón) (us-west-2) en comparación con la región África (Ciudad del Cabo) (af-south-1).

Un valor en aumento de `ReplicationLatency` podría indicar que las actualizaciones de una réplica no se están propagando hacia otras tablas de réplica de manera puntual. En este caso, puede redirigir temporalmente la actividad de lectura y escritura de la aplicación a otra región de AWS.

**Gestión de los problemas de latencia de replicación en tablas globales de varias cuentas**

Si `ReplicationLatency` sobrepasa las 3 horas debido a problemas provocados por el cliente en una tabla de réplicas, DynamoDB envía una notificación solicitando al cliente que aborde el problema subyacente. Los problemas más comunes inducidos por el cliente que pueden impedir la replicación son:
+ Eliminar los permisos necesarios de la política de recursos de la tabla de réplicas.
+ Excluirse de una región de AWS que aloja una réplica de la tabla global de varias cuentas.
+ Denegar los permisos de clave de KMS de AWS de la tabla necesarios para descifrar los datos.

DynamoDB envía una notificación inicial en un plazo de 3 horas si la latencia de replicación es elevada, seguida de una segunda notificación tras 20 horas si el problema sigue sin resolverse. Si el problema no se corrige dentro del intervalo de tiempo requerido, DynamoDB desasociará automáticamente la réplica de la tabla global. A continuación, la réplica afectada se convertirá en una tabla regional.

# Tutoriales: Creación de tablas globales de varias cuentas
<a name="V2globaltables_MA.tutorial"></a>

En esta sección, se proporcionan instrucciones paso a paso para crear tablas globales de DynamoDB que abarquen varias cuentas de AWS.

## Creación de una tabla global de varias cuentas mediante la consola de DynamoDB
<a name="create-ma-gt-console"></a>

Siga estos pasos para crear una tabla global de varias cuentas mediante la Consola de administración de AWS. En el ejemplo siguiente, se crea una tabla global con tablas de réplica en Estados Unidos.

1. Inicie sesión en la Consola de administración de AWS y abra la consola de DynamoDB en [https://console.aws.amazon.com/dynamodb/](https://console.aws.amazon.com/dynamodb/) para la primera cuenta (diga *111122223333*).

1. Para este ejemplo, elija **Este de EE. UU. (Ohio)** en el selector de regiones en la barra de navegación.

1. En el panel de navegación del lado izquierdo de la consola, elija **Tablas**.

1. Seleccione **Create Table (Crear tabla)**.

1. En la página **Crear tabla**:

   1. En **Nombre de la tabla**, introduzca **MusicTable**.

   1. En **Partition key** (Clave de partición), ingrese **Artist**.

   1. Para **Clave de clasificación**, ingrese **SongTitle**.

   1. Deje los demás valores predeterminados y elija **Crear tabla**.

1. Adición de la siguiente política de recursos a la tabla

------
#### [ 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. Esta nueva tabla le servirá de primera tabla de réplica en una nueva tabla global. Será el prototipo para crear otras tablas de réplica que quiera añadir más tarde.

1. Espere que la tabla pase a **Activa**. Para la tabla recién creada, en la pestaña **Tablas globales**, vaya a **Configuración y replicación** y haga clic en **Habilitar**.

1. Cierre sesión en esta cuenta (*111122223333* aquí).

1. Inicie sesión en la Consola de administración de AWS y abra la consola de DynamoDB en [https://console.aws.amazon.com/dynamodb/](https://console.aws.amazon.com/dynamodb/) para la segunda cuenta (diga *444455556666*).

1. Para este ejemplo, elija **Este de EE. UU. (Norte de Virginia)** en el selector de regiones en la barra de navegación.

1. La consola asegura que no haya ninguna tabla con el mismo nombre en la región seleccionada. Si ya existe una tabla con el mismo nombre, debe eliminar la tabla existente antes de crear una nueva tabla de réplica en esa región.

1. En el menú desplegable situado junto a **Crear tabla**, elija **Crear desde otra cuenta**

1. En la página **Crear una tabla desde otra cuenta**:

   1. Agregue **arn:aws:dynamodb:us-east-2:*111122223333*:table/MusicTable** como arn de tabla para la tabla de origen.

   1. En los **ARN de la tabla de réplica**, vuelva a agregar el ARN de la tabla de origen **arn:aws:dynamodb:us-east-2:*111122223333*:table/MusicTable**. Si ya existen varias réplicas como parte de una tabla global de varias cuentas, debe agregar todas las réplicas existentes a ReplicaTableARN.

   1. Deje los demás valores predeterminados y elija **Enviar**.

1. La pestaña **Tablas globales** de la tabla Música (y de cualquier otra tabla de réplica) indica que la tabla se ha replicado en varias regiones.

1. Para probar la replicación:

   1. Puede usar cualquiera de las regiones en las que existe una réplica para esta tabla

   1. Elija **Explorar elementos de la tabla**.

   1. Seleccione **Crear elemento**.

   1. Ingrese **item\$11** para **Artista** y **Song Value 1** para **Título de la canción**.

   1. Seleccione **Crear elemento**.

   1. Compruebe la replicación cambiando a las otras regiones:

   1. Compruebe que la tabla Música contiene el elemento que ha creado.

## Creación de una tabla global de varias cuentas mediante la AWS CLI
<a name="ma-gt-cli"></a>

En los siguientes ejemplos, se muestra cómo crear una tabla global de varias cuentas mediante la AWS CLI. Estos ejemplos muestran el flujo de trabajo completo para configurar la replicación entre cuentas.

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

Use los comandos de la AWS CLI siguientes para crear una tabla global de varias cuentas con replicación entre cuentas.

```
# 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
```

------

# Seguridad de las tablas globales de DynamoDB
<a name="globaltables_MA_security"></a>

Las réplicas de tablas globales son tablas de DynamoDB, por lo que se utilizan los mismos métodos para controlar el acceso a las réplicas que se utilizan para las tablas de una sola región, incluyendo las políticas de identidad y las políticas basadas en recursos de AWS Identity and Access Management (IAM). En este tema, se describe cómo proteger las tablas globales de varias cuentas de DynamoDB mediante permisos de IAM y cifrado de AWS Key Management Service (AWS KMS). Obtendrá información sobre las políticas basadas en recursos y los roles vinculados a servicios (SLR) que permiten la replicación y el escalado automático entre regiones y entre cuentas, los permisos de IAM necesarios para crear, actualizar y eliminar tablas globales, para tablas de coherencia final de varias regiones (MREC). También obtendrá información sobre las claves de cifrado de AWS KMS para administrar de forma segura la replicación entre regiones.

Proporciona información detallada sobre las políticas basadas en recursos y los permisos necesarios para establecer la replicación de tablas entre cuentas y regiones. Comprender este modelo de seguridad es fundamental para los clientes que necesitan implementar soluciones de replicación de datos seguras y entre cuentas.

## Autorización de la entidad principal del servicio para la replicación
<a name="globaltables_MA_service_principal"></a>

Las tablas globales de varias cuentas de DynamoDB utilizan un enfoque de autorización distinto, ya que la replicación se realiza más allá de los límites de las cuentas. Esto se consigue mediante la entidad principal del servicio de replicación de DynamoDB: `replication.dynamodb.amazonaws.com`. Cada cuenta participante debe incluir explícitamente esa entidad principal en la política de recursos de la tabla de réplicas, lo que concede permisos que puedan restringirse a réplicas específicas en función de las condiciones del contexto de origen de las claves como `aws:SourceAccount`, `aws:SourceArn`, etc. (consulte las [claves de condición globales de AWS](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html) para obtener más información). Los permisos son bidireccionales, lo que significa que todas las réplicas deben concederse permisos de forma explícita entre sí antes de poder establecer la replicación en un par de réplicas concreto.

Los permisos de las entidades principales de servicio siguientes son esenciales para la replicación entre cuentas:
+ `dynamodb:ReadDataForReplication` otorga la capacidad de leer datos con fines de replicación. Este permiso permite leer los cambios de una réplica y propagarlos a otras réplicas.
+ `dynamodb:WriteDataForReplication` permite escribir los datos replicados en las tablas de destino. Este permiso permite sincronizar los cambios en todas las réplicas de la tabla global.
+ `dynamodb:ReplicateSettings` permite la sincronización de la configuración de la tabla entre las réplicas, lo que proporciona una configuración coherente en todas las tablas participantes.

Cada réplica debe conceder los permisos anteriores a todas las demás réplicas y a sí misma, es decir, las condiciones del contexto de origen deben incluir el conjunto completo de réplicas que componen la tabla global. Estos permisos se verifican para cada nueva réplica cuando se agrega a una tabla global de varias cuentas. Esto verifica que las operaciones de replicación las realice solo el servicio DynamoDB autorizado y solo entre las tablas previstas.

## Roles vinculados a servicios para tablas globales de varias cuentas
<a name="globaltables_MA_service_linked_roles"></a>

Las tablas globales de varias cuentas de DynamoDB replican la configuración en todas las réplicas, de modo que cada réplica se configura de forma idéntica con un rendimiento coherente y proporciona una experiencia de conmutación por error perfecta. La replicación de la configuración se controla mediante el permiso `ReplicateSettings` de la entidad principal de servicio, pero también confiamos en roles vinculados a servicios (SLR) para gestionar determinadas capacidades de replicación y escalado automático entre cuentas y entre regiones. Estos roles se configuran solo una vez por cuenta de AWS. Una vez creados, los mismos roles sirven en todas las tablas globales de la cuenta. Para obtener más información acerca de los roles vinculados a servicios, consulte [Uso de roles vinculados a servicios](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create-service-linked-role.html) en la Guía del usuario de IAM.

### Rol vinculado al servicio de administración de configuración
<a name="globaltables_MA_settings_management_slr"></a>

Amazon DynamoDB crea automáticamente el rol vinculado al servicio (SLR) AWSServiceRoleForDynamoDBGlobalTableSettingsManagement cuando se crea la primera réplica de una tabla global de varias cuentas en la cuenta. Este rol administra la replicación de la configuración entre regiones y cuentas por usted.

Al aplicar políticas basadas en recursos a las réplicas, confirme que no deniega ninguno de los permisos definidos en `AWSServiceRoleForDynamoDBGlobalTableSettingsManagement` a la entidad principal de SLR, ya que esto podría interferir con la administración de la configuración y podría afectar la replicación si el rendimiento no coincide en todas las réplicas o GSI. Si deniega los permisos de SLR necesarios, la replicación hacia y desde las réplicas afectadas podría detenerse y el estado de la tabla de réplicas cambiará a `REPLICATION_NOT_AUTHORIZED`. Para tablas globales de varias cuentas, si una réplica permanece en el estado `REPLICATION_NOT_AUTHORIZED` durante más de 20 horas, la réplica se convierte irreversiblemente en una tabla de DynamoDB de una sola región. SLR tiene los siguientes permisos:
+ `application-autoscaling:DeleteScalingPolicy`
+ `application-autoscaling:DescribeScalableTargets`
+ `application-autoscaling:DescribeScalingPolicies`
+ `application-autoscaling:DeregisterScalableTarget`
+ `application-autoscaling:PutScalingPolicy`
+ `application-autoscaling:RegisterScalableTarget`

### Rol vinculado a un servicio de escalado automático
<a name="globaltables_MA_autoscaling_slr"></a>

Al configurar una tabla global para el modo de capacidad aprovisionada, se debe configurar el escalado automático para la tabla global. El escalado automático de DynamoDB utiliza el servicio de escalado automático de aplicaciones de AWS para ajustar dinámicamente la capacidad de rendimiento aprovisionada en las réplicas de tabla global. El servicio de escalado automático de aplicaciones crea un rol vinculado a un servicio (SLR) denominado [AWSServiceRoleForApplicationAutoScaling\$1DynamoDBTable](https://docs.aws.amazon.com/autoscaling/application/userguide/application-auto-scaling-service-linked-roles.html). Este rol vinculado al servicio se crea automáticamente en la cuenta de AWS al configurar el escalado automático para una tabla de DynamoDB. Permite el escalado automático de aplicaciones para administrar la capacidad de la tabla aprovisionada y crear alarmas de CloudWatch.

Al aplicar políticas basadas en recursos a las réplicas, asegúrese de no denegar ninguno de los permisos definidos en la [AWSApplicationAutoscalingDynamoDBTablePolicy](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSApplicationAutoscalingDynamoDBTablePolicy.html) a la entidad principal de SLR de escalado automático de aplicaciones, ya que esto interrumpiría la funcionalidad de escalado automático.

## Uso de las tablas globales de AWS IAM
<a name="globaltables_MA_iam"></a>

En las siguientes secciones, se describen los permisos necesarios para las distintas operaciones de las tablas globales y se proporcionan ejemplos de políticas que le ayudarán a configurar el acceso adecuado para los usuarios y aplicaciones.

**nota**  
Todos los permisos descritos se deben aplicar al ARN del recurso de tabla específico en las regiones afectadas. El ARN del recurso de tabla sigue el formato `arn:aws:dynamodb:region:account-id:table/table-name`, en el que debe especificar los valores reales de la región, el ID de cuenta y el nombre de la tabla.

A continuación, se muestran los temas paso a paso que cubrimos en las secciones siguientes:
+ Creación de tablas globales de varias cuentas y agregación de réplicas
+ Actualización de una tabla global de varias cuentas
+ Eliminación de tablas globales y réplicas

### Creación de tablas globales y agregación de réplicas
<a name="globaltables_MA_creating"></a>

#### Permisos para crear tablas globales
<a name="globaltables_MA_creating_permissions"></a>

Cuando se agrega una nueva réplica a una tabla regional para formar una tabla global de varias cuentas o a una tabla global de varias cuentas existente, la entidad principal de IAM que realice la acción debe contar con la autorización de todos los miembros existentes. Todos los miembros existentes deben incluir el siguiente permiso en su política de tablas para que la adición de réplicas se realice correctamente:
+ `dynamodb:AssociateTableReplica`: este permiso permite unir las tablas en una configuración de tabla global. Este es el permiso fundamental que permite el establecimiento inicial de la relación de replicación.

Este control preciso permite que solo las cuentas autorizadas participen en la configuración de la tabla global.

#### Políticas de IAM de ejemplo para crear tablas globales
<a name="globaltables_MA_creating_examples"></a>

##### Ejemplo de políticas de IAM para una configuración de 2 réplicas
<a name="globaltables_MA_2replica_example"></a>

La configuración de las tablas globales de varias cuentas sigue un flujo de autorización específico que proporciona una replicación segura. Examinemos cómo funciona esto en la práctica analizando un escenario práctico en el que un cliente desea establecer una tabla global con dos réplicas. La primera réplica (réplica A) reside en la cuenta A de la región ap-east-1, mientras que la segunda réplica (réplica B) se encuentra en la cuenta B de la región eu-south-1.
+ En la cuenta de origen (cuenta A), el proceso comienza con la creación de la tabla de réplicas principal. El administrador de la cuenta debe adjuntar a esta tabla una política basada en recursos que conceda de forma explícita los permisos necesarios a la cuenta de destino (cuenta B) para realizar la asociación. Esta política también autoriza al servicio de replicación de DynamoDB a realizar las acciones de replicación esenciales.
+ La cuenta de destino (cuenta B) sigue un proceso similar al adjuntar la política basada en recursos correspondiente al crear la réplica y hacer referencia al ARN de la tabla de origen que se utilizará para crear la réplica. Esta política refleja los permisos otorgados por la cuenta A, lo que crea una relación bidireccional de confianza. Antes de establecer la replicación, DynamoDB valida estos permisos entre cuentas para comprobar que existe la autorización adecuada.

Para establecer esta configuración:
+ El administrador de la cuenta A debe adjuntar primero la política basada en recursos a réplica A. Esta política concede de forma explícita los permisos necesarios a la cuenta B y al servicio de replicación de DynamoDB.
+ Del mismo modo, el administrador de la cuenta B debe adjuntar una política de coincidencia a la réplica B, con las referencias de cuenta invertidas para conceder los permisos correspondientes a la cuenta A; en la llamada de creación de la tabla para crear la réplica B, se hace referencia a la réplica A como tabla de origen.

------
#### [ 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"
                    ]
                }
            }
        }
    ]
}
```

------

##### Ejemplo de políticas de IAM para una configuración de 3 réplicas
<a name="globaltables_MA_3replica_example"></a>

En esta configuración, tenemos 3 réplicas: la réplica A, la réplica B y la réplica C en la cuenta A, la cuenta B y la cuenta C, respectivamente. La réplica A es la primera réplica, que comienza como una tabla regional y a la que, a continuación, se agregan la réplica B y la réplica C.
+ El administrador de la cuenta A primero debe adjuntar la política basada en recursos a la réplica A, lo que permitirá la replicación con todos los miembros y permitirá a las entidades principales de IAM de las cuentas B y C agregar 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" ] }
        }
    ]
}
```

------
+ El administrador de la cuenta B debe agregar una réplica (réplica B) que apunte a la réplica A como origen. La réplica B tiene la siguiente política que permite la replicación entre todos los miembros y permite a la cuenta C agregar una 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 último, el administrador de la cuenta C crea una réplica con la siguiente política que permite los permisos de replicación entre todos los miembros. La política no permite agregar más réplicas.

------
#### [ 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"
                    ]
                }
            }
        }
    ]
}
```

------

### Actualización de una tabla global de varias cuentas
<a name="globaltables_MA_updating"></a>

Para modificar la configuración de réplica de una tabla global existente mediante la API de UpdateTable, necesita el siguiente permiso en el recurso de tabla de la región en la que va a realizar la llamada a la API: `dynamodb:UpdateTable`

Además, puede actualizar otras configuraciones de tablas globales, como las políticas de escalado automático y la configuración del tiempo de vida. Se requieren los siguientes permisos para estas operaciones de actualización adicionales:

Para actualizar la configuración de Periodo de vida con la API de `UpdateTimeToLive`, debe tener el siguiente permiso en el recurso de la tabla en todas las regiones que contienen réplicas: `dynamodb:UpdateTimeToLive`

Para actualizar una política de escalado automático de réplicas con la API de `UpdateTableReplicaAutoScaling`, debe tener los siguientes permisos en el recurso de la tabla en todas las regiones que contengan 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**  
Debe proporcionar permisos de `dynamodb:ReplicateSettings` en todas las regiones y cuentas de réplica para que la tabla de actualización se realice correctamente. Si alguna réplica no proporciona permisos para replicar la configuración en ninguna réplica de la tabla global de varias cuentas, todas las operaciones de actualización de todas las réplicas producirán un error con `AccessDeniedException` hasta que se fijen los permisos.

### Eliminación de tablas globales y réplicas
<a name="globaltables_MA_deleting"></a>

Para eliminar una tabla global, debe eliminar todas las réplicas. A diferencia de la tabla global con la misma cuenta, no puede utilizar `UpdateTable` para eliminar una tabla de réplica en una región remota y cada réplica se debe eliminar mediante la API `DeleteTable` de la cuenta que la controla.

#### Permisos para eliminar tablas globales y réplicas
<a name="globaltables_MA_deleting_permissions"></a>

Los siguientes permisos son necesarios para eliminar réplicas individuales y para eliminar por completo tablas globales. Al eliminar una configuración de tabla global, solo se elimina la relación de replicación entre tablas de distintas regiones. No se eliminará la tabla de DynamoDB de la última región restante. La tabla de la última región sigue existiendo como tabla estándar de DynamoDB con los mismos datos y configuraciones.

Necesita los siguientes permisos en el recurso de tabla en cada región en la que vaya a eliminar una réplica:
+ `dynamodb:DeleteTable`
+ `dynamodb:DeleteTableReplica`

## Uso de las tablas globales de AWS KMS
<a name="globaltables_MA_kms"></a>

Como todas las tablas de DynamoDB, las réplicas de tablas globales siempre cifran los datos en reposo mediante claves de cifrado almacenadas en AWS Key Management Service (AWS KMS).

**nota**  
A diferencia de la tabla global de la misma cuenta, se pueden configurar diferentes réplicas en una tabla global de varias cuentas con un tipo de clave de AWS KMS diferente (clave propia de AWS o clave administrada por el cliente). Las tablas globales de varias cuentas no admiten claves administradas por AWS.

Las tablas globales de varias cuentas que utilizan CMK requieren que la política de claves de cada réplica otorgue permisos a la entidad principal del servicio de replicación de DynamoDB (`replication.dynamodb.amazonaws.com`) para acceder a la clave para la administración de la replicación y la configuración. Los siguientes permisos son necesarios:
+ `kms:Decrypt`
+ `kms:ReEncrypt*`
+ `kms:GenerateDataKey*`
+ `kms:DescribeKey`

**Importante**

DynamoDB requiere acceso a la clave de cifrado de la réplica para eliminarla. Si desea desactivar o eliminar una clave administrada por el cliente que se utiliza para cifrar una réplica porque va a eliminar la réplica, primero debe eliminar la réplica, esperar a que la tabla se elimine del grupo de replicación llamando a describir en una de las demás réplicas y luego desactivar o eliminar la clave.

Si desactiva o revoca el acceso de DynamoDB a una clave administrada por el cliente que se utiliza para cifrar una réplica, la replicación hacia y desde la réplica se detendrá y el estado de la réplica cambiará a `INACCESSIBLE_ENCRYPTION_CREDENTIALS`. Si una réplica permanece en el estado `INACCESSIBLE_ENCRYPTION_CREDENTIALS` durante más de 20 horas, la réplica se convierte irreversiblemente en una tabla de DynamoDB de una sola región.

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

La política de AWS KMS permite a DynamoDB acceder a ambas claves de AWS KMS para la replicación entre las réplicas A y B. Las claves de AWS KMS adjuntas a la réplica de DynamoDB en cada cuenta deben actualizarse con la siguiente 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"
                ]
            }
        }
      }
   ]
 }
```

------

# Descripción de la facturación de tablas globales en Amazon DynamoDB
<a name="global-tables-billing"></a>

En esta guía se describe cómo funciona la facturación de DynamoDB para las tablas globales, se identifican los componentes que contribuyen al costo de las tablas globales y se incluye un ejemplo práctico. 

Las [tablas globales de Amazon DynamoDB](GlobalTables.md) son una base de datos totalmente administrada, sin servidor, multirregional y multiactiva. Las tablas globales están diseñadas para ofrecer una [disponibilidad del 99,999 %](https://aws.amazon.com/dynamodb/sla/), una mayor resiliencia de las aplicaciones y una mejor continuidad empresarial. Las tablas globales replican automáticamente las tablas de DynamoDB en las regiones de AWS que elija para que pueda lograr un rendimiento de lectura y escritura rápido a escala local. 

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

El modelo de facturación de las tablas globales difiere del de las tablas de DynamoDB de una sola región. Las operaciones de escritura de las tablas de DynamoDB de una sola región se facturan mediante las siguientes unidades:
+ Unidades de solicitud de escritura (WRU) para el modo de capacidad bajo demanda, en el que se cobra una WRU por cada escritura de hasta 1 KB
+ Unidades de capacidad de escritura (WCU) para el modo de capacidad aprovisionada, en el que una WCU proporciona una escritura por segundo de hasta 1 KB

Al crear una tabla global mediante la adición de una tabla de réplica a una tabla de una sola región existente, dicha tabla se convierte en una tabla de réplica, lo que significa que también cambian las unidades que se usan para facturar las escrituras en la tabla. Las operaciones de escritura en las tablas de réplica se facturan mediante las siguientes unidades: 
+ Unidades de solicitud de escritura replicada (rWRU) para el modo de capacidad bajo demanda, en el que se cobra una rWRU por tabla de réplica por cada escritura de hasta 1 KB
+ Unidades de capacidad de escritura replicada (rWCU) para el modo de capacidad aprovisionada, en el que una WCU por tabla de réplica proporciona una escritura por segundo de hasta 1 KB

Las actualizaciones de los índices secundarios globales (GSI) se facturan mediante las mismas unidades que las tablas de DynamoDB de una sola región, aunque la tabla base del GSI sea una tabla de réplica. Las operaciones de actualización de los GSI se facturan mediante las siguientes unidades:
+ Unidades de solicitud de escritura (WRU) para el modo de capacidad bajo demanda, en el que se cobra una WRU por cada escritura de hasta 1 KB
+ Unidades de capacidad de escritura (WCU) para el modo de capacidad aprovisionada, en el que una WCU proporciona una escritura por segundo de hasta 1 KB

Las unidades de escritura replicada (rWCU y rWRU) tienen el mismo precio que las unidades de escritura de una sola región (WCU y WRU). Se aplican tarifas de transferencia de datos entre regiones a las tablas globales, ya que los datos se replican entre regiones. Los cargos por escritura replicada (rWCU o rWRU) se producen en cada región que contenga una tabla de réplica para la tabla global.

Las operaciones de lectura de tablas de una sola región y de tablas de réplica utilizan las siguientes unidades:
+ Unidades de solicitud de lectura (RRU) para el modo de capacidad bajo demanda, en el que se cobra una RRU por cada lectura altamente coherente de hasta 4 KB
+ Unidades de capacidad de lectura (RCU) para tablas aprovisionadas, en las que una RCU proporciona una lectura altamente coherente por segundo de hasta 4 KB

## Modos de coherencia y facturación
<a name="global-tables-billing-consistency-modes"></a>

Las unidades de escritura replicadas (rWCU y rWRU) que se utilizan para facturar las operaciones de escritura son idénticas en los modos de coherencia sólida de varias regiones (MRSC) y de coherencia final de varias regiones (MREC). Las tablas globales que utilizan el modo de coherencia alta multirregional (MRSC) configurado con un testigo no incurren en costos de unidades de escritura replicadas (rWCU y rWRU), costos de almacenamiento o costos de transferencia de datos para la replicación al testigo.

## Ejemplo de facturación de tablas globales de DynamoDB
<a name="global-tables-billing-example"></a>

Veamos un ejemplo de varios días para comprobar cómo funciona en la práctica la facturación de las solicitudes de escritura de tablas globales (tenga en cuenta que en este ejemplo solo se consideran las solicitudes de escritura y no se incluyen los gastos de restauración de tablas ni de transferencia de datos entre regiones en los que se incurriría en el ejemplo):

**Día 1, tabla de una sola región: **tiene una tabla de DynamoDB bajo demanda de una sola región llamada Table\$1A en la región us-west-2. Escribe 100 elementos de 1 KB en Table\$1A. Para estas operaciones de escritura de una sola región, se le cobrará 1 unidad de solicitud de escritura (WRU) por cada 1 KB escrito. Los cargos del día 1 son los siguientes:
+ 100 WRU en la región us-west-2 por escrituras de una sola región

El total de unidades de solicitud cobradas el día 1 es de **100 WRU**.

**Día 2, creación de una tabla global: **para crear una tabla global, agrega una réplica de Table\$1A a la región us-east-2. Table\$1A es ahora una tabla global con dos tablas de réplica: una en la región us-west-2 y otra en la región us-east-2. Escribe 150 elementos de 1 KB en la tabla de réplica de la región us-west-2. Los cargos del día 2 son los siguientes:
+ 150 rWRU en la región us-west-2 para escrituras replicadas
+ 150 rWRU en la región us-east-2 para escrituras replicadas

El total de unidades de solicitud cobradas el día 2 es de **300 rWRU**.

**Día 3, adición de un índice secundario global: **agrega un índice secundario global (GSI) a la tabla de réplica de la región us-east-2 que proyecta todos los atributos de la tabla base (réplica). La tabla global crea automáticamente para usted el GSI en la tabla de réplica de la región us-west-2. Escribe 200 registros nuevos de 1 KB en la tabla de réplica de la región us-west-2. Los cargos del día 3 son los siguientes:
+ • 200 rWRU en la región us-west-2 para escrituras replicadas
+ • 200 WRU en la región us-west-2 para las actualizaciones de GSI
+ • 200 rWRU en la región us-east-2 para escrituras replicadas
+ • 200 WRU en la región us-east-2 para las actualizaciones de GSI

El total de unidades de solicitud de escritura cobradas el día 3 es **400 WRU y 400 rWRU**.

Los cargos totales por unidad de escritura durante los tres días son de 500 rWRU (100 rWRU el día 1 \$1 400 rWRU el día 3) y 700 rWRU (300 rWRU el día 2 \$1 400 rWRU el día 3).

En resumen, las operaciones de escritura de tabla de réplica se facturan en unidades de escritura replicada en todas las regiones que contienen una tabla de réplica. Si tiene índices secundarios globales, se le cobran unidades de escritura por las actualizaciones de los GSI en todas las regiones que contienen un GSI (que en una tabla global son todas las regiones que contienen una tabla de réplica). 

# Versiones de tablas globales de DynamoDB
<a name="V2globaltables_versions"></a>

Hay disponibles dos versiones de las tablas globales de DynamoDB: versión 2019.11.21 (actual) y versión 2017.11.29 (antigua). Recomendamos utilizar la versión 2019.11.21 (actual) de las tablas globales, ya que es más fácil de usar, se admite en más regiones y tiene un costo más bajo para la mayoría de las cargas de trabajo en comparación con la versión 2017.11.29 (antigua).

## Determinación de la versión de una tabla global
<a name="globaltables.DetermineVersion"></a>

### Determinar la versión mediante la AWS CLI
<a name="globaltables.CLI"></a>

#### Identificación de una réplica de tabla global de la versión 2019.11.21 (actual)
<a name="globaltables.CLI.current"></a>

Para determinar si una tabla es una réplica de tabla global de la versión 2019.11.21 (actual), invoque el comando `describe-table` para la tabla. Si el resultado contiene el atributo de `GlobalTableVersion` con un valor de “2019.11.21”, la tabla es una réplica de tabla global de la versión 2019.11.21 (actual).

Un ejemplo de comando de la CLI para `describe-table`:

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

El resultado (abreviado) contiene el atributo de `GlobalTableVersion` con un valor de “2019.11.21”, por lo que esta tabla es una réplica de la tabla global de la versión 2019.11.21 (actual).

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

#### Identificación de una réplica de tabla global de la versión 2017.11.29 (antigua)
<a name="globaltables.CLI.legacy"></a>

La versión 2017.11.29 (antigua) de tablas globales utiliza un conjunto dedicado de comandos para la administración de tablas globales. Para determinar si una tabla es una réplica de la versión 2017.11.29 de tablas globales (antigua), invoque el comando `describe-global-table` para la tabla. Si recibe una respuesta exitosa, la tabla es una réplica de tabla global de la versión 2017.11.29 (antigua). Si el comando `describe-global-table` devuelve un error `GlobalTableNotFoundException`, la tabla no es una réplica de la versión 2017.11.29 (antigua).

Un comando de la CLI de ejemplo para `describe-global-table`:

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

El comando devuelve una respuesta exitosa, por lo que esta tabla es una réplica de tabla global de la versión 2017.11.29 (antigua).

```
{
    "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"
    }
}
```

### Determinación de la versión mediante la consola de DynamoDB
<a name="globaltables.console"></a>

Para identificar la versión de una réplica de tabla global, realice lo siguiente:

1. Abra la consola de DynamoDB en [https://console.aws.amazon.com/dynamodb/home](https://console.aws.amazon.com/dynamodb/home).

1. En el panel de navegación del lado izquierdo de la consola, elija **Tablas**.

1. Elija la tabla de la que desea identificar la versión de las tablas globales.

1. Elija la pestaña **Global Tables (Tablas globales)**.

   La sección *Resumen* muestra la versión de las tablas globales en uso.

## Diferencias de comportamiento entre las versiones heredada y actual
<a name="DiffLegacyVsCurrent"></a>

En la siguiente lista se describen las diferencias de comportamiento entre las versiones heredada y actual de las tablas globales.
+ La versión 2019.11.21 (actual) consume menos capacidad de escritura para varias operaciones de DynamoDB en comparación con la 2017.11.29 (heredada) y, por lo tanto, es más rentable para la mayoría de los clientes. Las diferencias entre estas operaciones de DynamoDB son las siguientes:
  + La invocación de [PutItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutItem.html) para un elemento de 1 KB en una región y replicarlo en otras regiones requiere dos rWRU por región para la versión 2017.11.29 (heredada), pero solo un rWrU para la 2019.11.21 (actual).
  + La invocación de [UpdateItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateItem.html) para un elemento de 1 KB requiere dos rWRU en la región de origen y un rWrU por región de destino para la versión 2017.11.29 (heredada), pero solo un rWrU para las regiones de origen y destino para la 2019.11.21 (actual).
  + La invocación de [DeleteItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DeleteItem.html) para un elemento de 1 KB requiere un rWRU en la región de origen y dos rWrU por región de destino para la versión 2017.11.29 (heredada), pero solo un rWrU para las regiones de origen o destino para la 2019.11.21 (actual).

  La siguiente tabla muestra el consumo de rWRU de las tablas de la versión 2017.11.29 (heredada) y de la 2019.11.21 (actual) para un elemento de 1 KB en dos regiones.    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/amazondynamodb/latest/developerguide/V2globaltables_versions.html)
+ La versión 2017.11.29 (heredada) solo está disponible en 11 Regiones de AWS. Sin embargo, la versión 2019.11.21 (actual) está disponible en todas las Regiones de AWS.
+ Para crear tablas globales de la versión 2017.11.29 (heredada), primero debe crear un conjunto de tablas regionales vacías y, a continuación, invocar la API [CreateGlobalTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_CreateGlobalTable.html) para formar la tabla global. Para crear tablas globales de la versión 2019.11.21 (actual), invoque la API [UpdateTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateTable.html) para agregar una réplica a una tabla regional existente.
+ La versión 2017.11.29 (heredada) requiere que se vacíen todas las réplicas de la tabla antes de agregar una réplica en una nueva región (incluso durante la creación). La versión 2019.11.21 (actual) permite agregar y eliminar réplicas de regiones de una tabla que ya contenga datos.
+ La versión 2017.11.29 (heredada) utiliza el siguiente conjunto dedicado de API de plano de control para administrar las 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)

  La versión 2019.11.21 (actual) usa las API [DescribeTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeTable.html) y [UpdateTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateTable.html) para administrar las réplicas.
+ La versión 2017.11.29 (heredada) publica dos registros de DynamoDB Streams para cada escritura. La versión 2019.11.21 (actual) solo publica un registro de DynamoDB Streams para cada escritura.
+ La versión 2017.11.29 (heredada) rellena y actualiza los atributos `aws:rep:deleting`, `aws:rep:updateregion` y `aws:rep:updatetime`. La versión 2019.11.21 (actual) no rellena ni actualiza estos atributos.
+ La versión 2017.11.29 (heredada) no sincroniza la configuración [Uso del período de vida (TTL) en DynamoDB](TTL.md) entre las réplicas. La versión 2019.11.21 (actual) sincroniza la configuración de TTL entre las réplicas.
+ La versión 2017.11.29 (heredada) no replica las eliminaciones de TTL en otras réplicas. La versión 2019.11.21 (actual) replica las eliminaciones de TTL en todas las réplicas.
+ La versión 2017.11.29 (heredada) no sincroniza la configuración del [escalado automático](AutoScaling.md) entre las réplicas. La versión 2019.11.21 (actual) sincroniza la configuración del escalado automático entre las réplicas.
+ La versión 2017.11.29 (heredada) no sincroniza la configuración del [índice secundario global (GSI)](GSI.md) entre las réplicas. La versión 2019.11.21 (actual) sincroniza la configuración de GSI entre las réplicas.
+ La versión 2017.11.29 (heredada) no sincroniza la configuración del [cifrado en reposo](encryption.usagenotes.md) entre las réplicas. La versión 2019.11.21 (actual) sincroniza la configuración del cifrado en reposo entre las réplicas.
+ La versión 2017.11.29 (heredada) publica la métrica `PendingReplicationCount`. La versión 2019.11.21 (actual) no publica esta métrica.

## Actualización a la versión actual
<a name="upgrading-to-current-version"></a>

### Permisos necesarios para actualizar las tablas globales
<a name="V2globaltables_versions.Notes-permissions"></a>

Para actualizar a la versión 2019.11.21 (actual), debe tener permisos `dynamodb:UpdateGlobalTableversion` en todas las regiones que tengan réplicas. Estos permisos se suman a los permisos necesarios para acceder a la consola de DynamoDB y ver las tablas.

La siguiente política de IAM concede permisos para actualizar cualquier tabla global a la versión 2019.11.21 (actual).

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

La siguiente política de IAM concede permisos para actualizar solo la tabla global `Music`, con réplicas en dos regiones, a la versión 2019.11.21 (actual).

```
{
    "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"
            ]
        }
    ]
}
```

### Qué esperar durante la actualización
<a name="V2GlobalTablesUpgradeExpectations"></a>
+ Todas las réplicas de tablas globales seguirán procesando el tráfico de lectura y escritura durante la actualización.
+ El proceso de actualización tarda entre unos minutos a varias horas, según el tamaño de la tabla y la cantidad de réplicas.
+ Durante el proceso de actualización, el valor de [TableStatus](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_TableDescription.html#DDB-Type-TableDescription-TableStatus) cambiará de `ACTIVE` a `UPDATING`. Puede ver el estado de la tabla invocando la API [DescribeTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeTable.html) o con la vista **Tablas** de la consola de DynamoDB.
+ El escalado automático no ajustará la configuración de capacidad aprovisionada para una tabla global mientras se esté actualizando la tabla. Le recomendamos encarecidamente que configure la tabla en el modo de capacidad [bajo demanda](capacity-mode.md#capacity-mode-on-demand) durante la actualización.
+ Si decide utilizar capacidad [aprovisionada](provisioned-capacity-mode.md) con el escalado automático durante la actualización, debe aumentar el rendimiento mínimo de lectura y escritura en las políticas para contemplar el aumento esperado de tráfico y evitar cualquier limitación durante la actualización.
+ La métrica `ReplicationLatency` puede informar temporalmente de picos de latencia o dejar de informar de datos métricos durante el proceso de actualización. Para obtener más información, consulte [ReplicationLatency](metrics-dimensions.md#ReplicationLatency). 
+ Cuando finaliza el proceso de actualización, el estado de la tabla cambia a `ACTIVE`.

### Comportamiento de DynamoDB Streams antes, durante y después de la actualización
<a name="V2GlobalTablesUpgradeDDBStreamsBehavior"></a>

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

### Actualización a la versión 2019.11.21 (actual)
<a name="V2globaltables_versions.upgrade"></a>

Siga estos pasos para actualizar la versión de las tablas globales de DynamoDB mediante la Consola de administración de AWS.

**Actualización de las tablas globales a la versión 2019.11.21 (actual)**

1. Abra la consola de DynamoDB en [https://console.aws.amazon.com/dynamodb/home](https://console.aws.amazon.com/dynamodb/home). 

1. En el panel de navegación del lado izquierdo de la consola, elija **Tablas** y, a continuación, seleccione la tabla global que desea actualizar a la versión 2019.11.21 (actual). 

1. Elija la pestaña **Global Tables (Tablas globales)**.

1. Elija **Update version (Actualizar versión)**.  
![\[Captura de pantalla de la consola que muestra el botón Update (Actualizar).\]](http://docs.aws.amazon.com/es_es/amazondynamodb/latest/developerguide/images/GlobalTables-upgrade.png)

1. Lea y acepte los nuevos requisitos y, a continuación, elija **Update version** (Actualizar versión).

1. Una vez completado el proceso de actualización, la versión de las tablas globales que aparece en la consola cambia a **2019.11.21**.

# Prácticas recomendadas para tablas globales
<a name="globaltables-bestpractices"></a>

En las siguientes secciones, se describen las prácticas recomendadas para implementar y utilizar las tablas globales.

## Versión
<a name="globaltables-bestpractices-version"></a>

Hay disponibles dos versiones de las tablas globales de DynamoDB: versión 2019.11.21 (actual) y [versión 2017.11.29 (antigua)](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/globaltables.V1.html). Debe utilizar la versión 2019.11.21 (actual) siempre que sea posible. 

## Protección contra eliminación
<a name="globaltables-bestpractices-deletionprotection"></a>

Debe habilitar la protección contra eliminación en las réplicas de tablas globales que desee proteger contra la eliminación accidental. Debe habilitar la protección contra la eliminación en cada réplica.

## Uso de AWS CloudFormation
<a name="globaltables-bestpractices-cloudformation"></a>

CloudFormation actualmente no admite la coordinación de recursos de varias regiones, como tablas globales entre pilas. Si define cada réplica de una tabla global en una pila regional independiente, se producirán errores debido a la desviación detectada entre las pilas al realizar actualizaciones de réplicas. Para evitar este problema, debe elegir una región como región de referencia para implementar las tablas globales y definir todas las réplicas de la tabla global en la pila de esa región.

**importante**  
No puede convertir un recurso de tipo `AWS::DynamoDB::Table` en un recurso de tipo `AWS::DynamoDB::GlobalTable` cambiando su tipo en la plantilla. Intentar convertir una tabla de una sola región en una tabla global cambiando el tipo de recurso de CloudFormation puede resultar en la eliminación de la tabla de DynamoDB.

Puede utilizar el recurso de `AWS::DynamoDB::GlobalTable` para crear una tabla en una sola región. Esta tabla se implementará como cualquier otra tabla de una sola región. Si posteriormente actualiza la pila para agregar otras regiones a un recurso, las réplicas se agregarán a la tabla y esta se convertirá de forma segura en una tabla global.

Si tiene un recurso de `AWS::DynamoDB::Table` existente que desea convertir en un recurso de `AWS::DynamoDB::GlobalTable`, los pasos recomendados para convertir el tipo de recurso son los siguientes:

1. Establezca la política de eliminación de `AWS::DynamoDB::Table` para retenerla.

1. Elimine la tabla de la definición de la pila.

1. Agregue réplicas a la tabla de una sola región en la consola de AWS y conviértala en una tabla global.

1. Importe la nueva tabla global como un nuevo recurso de `AWS::DynamoDB::GlobalTable` a la pila.

## Copias de seguridad y recuperación en un momento dado
<a name="globaltables-bestpractices-backups"></a>

La habilitación de las copias de seguridad automatizadas y la recuperación en un momento dado (PITR) para una réplica en una tabla global puede ser suficiente para cumplir los objetivos de recuperación ante desastres. Las copias de seguridad de réplicas creadas con copia de seguridad de AWS se pueden replicar automáticamente en todas las regiones para una mayor resiliencia. Tenga en cuenta los objetivos del plan de recuperación ante desastres en el contexto de la alta disponibilidad en varias regiones al elegir su estrategia de copia de seguridad y habilitación de PITR.

## Diseño para alta disponibilidad de varias regiones
<a name="globaltables-bestpractices-multiregion"></a>

Para obtener instrucciones prescriptivas sobre la implementación de tablas globales, consulte [Prácticas recomendadas para el diseño de tablas globales de DynamoDB](bp-global-table-design.md).