Copiar tablas de Amazon DynamoDB entre cuentas mediante una implementación personalizada - Recomendaciones de AWS

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Copiar tablas de Amazon DynamoDB entre cuentas mediante una implementación personalizada

Creado por Ramkumar Ramanujam () AWS

Entorno: producción

Origen: Amazon DynamoDB

Destino: Amazon DynamoDB

Tipo R: N/D

Carga de trabajo: todas las demás cargas de trabajo

Tecnologías: bases de datos

AWSservicios: Amazon DynamoDB

Resumen

Cuando se trabaja con Amazon DynamoDB en Amazon Web Services AWS (), un caso de uso habitual es copiar o sincronizar tablas de DynamoDB en entornos de desarrollo, pruebas o ensayo con los datos de las tablas que se encuentran en el entorno de producción. Como práctica estándar, cada entorno utiliza una cuenta diferente. AWS

DynamoDB ahora admite la copia de seguridad entre cuentas mediante Backup. AWS Para obtener información sobre los costos de almacenamiento asociados al usar AWS Backup, consulte los precios AWS de Backup. Al utilizar AWS Backup para copiar entre cuentas, las cuentas de origen y destino deben formar parte de la organización de una AWS organización. Existen otras soluciones para la copia de seguridad y la restauración de varias cuentas mediante AWS servicios como AWS Glue. Sin embargo, el uso de esas soluciones aumenta el tamaño de las aplicaciones, ya que hay más AWS servicios que implementar y mantener. 

También puede utilizar Amazon DynamoDB Streams para capturar los cambios en la tabla de la cuenta de origen. A continuación, puede iniciar una función AWS Lambda y realizar los cambios correspondientes en la tabla de destino de la cuenta de destino. Sin embargo, esa solución se aplica a los casos de uso en los que las tablas de origen y de destino deben mantenerse siempre sincronizadas. Es posible que no se aplique a los entornos de desarrollo, pruebas y uso transitorio en los que los datos se actualizan con frecuencia.

Este patrón proporciona los pasos para implementar una solución personalizada para copiar una tabla de Amazon DynamoDB de una cuenta a otra. Este patrón se puede implementar mediante lenguajes de programación comunes, como C#, Java y Python. Recomendamos utilizar un idioma compatible con un AWSSDK.

Requisitos previos y limitaciones

Requisitos previos 

  • Dos AWS cuentas activas

  • Tablas de DynamoDB en ambas cuentas

  • Conocimiento de las funciones y políticas de AWS Identity and Access Management (IAM)

  • Conocimiento de cómo acceder a las tablas de Amazon DynamoDB mediante cualquier lenguaje de programación común, como C#, Java o Python

Limitaciones

Este patrón se aplica a las tablas de DynamoDB de alrededor de 2 GB o menos. Con una lógica adicional para gestionar las interrupciones de conexión o sesión, las limitaciones y los errores y reintentos, también se puede utilizar para tablas más grandes.

La operación de escaneo de DynamoDB, que lee los elementos de la tabla de origen, solo puede recuperar hasta 1 MB de datos en una sola llamada. En el caso de tablas más grandes, de más de 2 GB, esta limitación puede aumentar el tiempo total necesario para realizar una copia completa de la tabla.

Arquitectura

El siguiente diagrama muestra la implementación personalizada entre las AWS cuentas de origen y destino. IAMlas políticas y los tokens de seguridad se utilizan con la implementación personalizada. Los datos se leen desde Amazon DynamoDB en la cuenta de origen y se escriben en DynamoDB en la cuenta de destino.

Arquitectura de cuentas de origen y destino para copiar mediante la implementación personalizada.

Automatizar y escalar

Este patrón se aplica a las tablas de DynamoDB de tamaño más pequeño, de unos 2 GB. 

Para aplicar este patrón a tablas más grandes, aborde los problemas siguientes:

  • Durante la operación de copia de la tabla, se mantienen dos sesiones activas, utilizando diferentes tokens de seguridad. Si la operación de copia de la tabla tarda más que los tiempos de caducidad del token, debe implementar una lógica para actualizar los tokens de seguridad. 

  • Si no se aprovisionan suficientes unidades de capacidad de lectura (RCUs) y unidades de capacidad de escritura (WCUs), es posible que se reduzcan las lecturas o escrituras en la tabla de origen o destino. Asegúrese de atrapar y gestionar estas excepciones. 

  • Controle cualquier otro error o excepción y establezca un mecanismo de reintento para volver a intentarlo o continuar desde el punto en el que se produjo el error en la operación de copia.

Herramientas

Herramientas

  • Amazon DynamoDB: Amazon DynamoDB es un servicio SQL sin base de datos totalmente administrado que proporciona un rendimiento rápido y predecible con una escalabilidad perfecta. 

  • Las herramientas adicionales necesarias variarán según el lenguaje de programación que se elija para la implementación. Por ejemplo, si usa C#, necesitará Microsoft Visual Studio y los siguientes NuGet paquetes:

    • AWSSDK

    • AWSSDK.DynamoDBv2

Código

El siguiente fragmento de código de Python elimina y vuelve a crear una tabla de DynamoDB mediante la biblioteca Boto3.

No utilice el identificador AWS_ACCESS_KEY_ID y AWS_SECRET_ACCESS_KEY de un IAM usuario, ya que se trata de credenciales de larga duración, que deben evitarse para el acceso programático a los AWS servicios. Para obtener más información sobre cómo usar credenciales de seguridad temporales, consulte la sección Prácticas recomendables.

Las credenciales AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY, y las que TEMPORARY_SESSION_TOKEN se utilizan en el siguiente fragmento de código son credenciales temporales obtenidas del AWS Security Token Service (). AWS STS

import boto3 import sys import json #args = input-parameters = GLOBAL_SEC_INDEXES_JSON_COLLECTION, ATTRIBUTES_JSON_COLLECTION, TARGET_DYNAMODB_NAME, TARGET_REGION, ... #Input param: GLOBAL_SEC_INDEXES_JSON_COLLECTION #[{"IndexName":"Test-index","KeySchema":[{"AttributeName":"AppId","KeyType":"HASH"},{"AttributeName":"AppType","KeyType":"RANGE"}],"Projection":{"ProjectionType":"INCLUDE","NonKeyAttributes":["PK","SK","OwnerName","AppVersion"]}}] #Input param: ATTRIBUTES_JSON_COLLECTION #[{"AttributeName":"PK","AttributeType":"S"},{"AttributeName":"SK","AttributeType":"S"},{"AttributeName":"AppId","AttributeType":"S"},{"AttributeName":"AppType","AttributeType":"N"}] region = args['TARGET_REGION'] target_ddb_name = args['TARGET_DYNAMODB_NAME'] global_secondary_indexes = json.loads(args['GLOBAL_SEC_INDEXES_JSON_COLLECTION']) attribute_definitions = json.loads(args['ATTRIBUTES_JSON_COLLECTION']) # Drop and create target DynamoDB table dynamodb_client = boto3.Session( aws_access_key_id=args['AWS_ACCESS_KEY_ID'], aws_secret_access_key=args['AWS_SECRET_ACCESS_KEY'], aws_session_token=args['TEMPORARY_SESSION_TOKEN'], ).client('dynamodb') # Delete table print('Deleting table: ' + target_ddb_name + ' ...') try: dynamodb_client.delete_table(TableName=target_ddb_name) #Wait for table deletion to complete waiter = dynamodb_client.get_waiter('table_not_exists') waiter.wait(TableName=target_ddb_name) print('Table deleted.') except dynamodb_client.exceptions.ResourceNotFoundException: print('Table already deleted / does not exist.') pass print('Creating table: ' + target_ddb_name + ' ...') table = dynamodb_client.create_table( TableName=target_ddb_name, KeySchema=[ { 'AttributeName': 'PK', 'KeyType': 'HASH' # Partition key }, { 'AttributeName': 'SK', 'KeyType': 'RANGE' # Sort key } ], AttributeDefinitions=attribute_definitions, GlobalSecondaryIndexes=global_secondary_indexes, BillingMode='PAY_PER_REQUEST' ) waiter = dynamodb_client.get_waiter('table_exists') waiter.wait(TableName=target_ddb_name) print('Table created.')

Prácticas recomendadas

Credenciales temporales

Como práctica recomendada de seguridad, al acceder a AWS los servicios mediante programación, evite utilizar la AWS_ACCESS_KEY_ID y de un IAM usuario, ya que se trata AWS_SECRET_ACCESS_KEY de credenciales de larga duración. Intente utilizar siempre credenciales temporales para acceder a los AWS servicios mediante programación.

Por ejemplo, un desarrollador codifica de forma rígida la dirección AWS_ACCESS_KEY_ID y AWS_SECRET_ACCESS_KEY de un IAM usuario de la aplicación durante el desarrollo, pero no elimina los valores codificados antes de introducir los cambios en el repositorio de código. Estas credenciales expuestas pueden ser utilizadas por usuarios de forma involuntaria o malintencionada, lo que puede tener graves consecuencias (especialmente si las credenciales expuestas tienen privilegios de administrador). Estas credenciales expuestas deben desactivarse o eliminarse inmediatamente mediante la IAM consola o la interfaz de línea de AWS comandos (). AWS CLI

Para obtener credenciales temporales para el acceso programático a los AWS servicios, utilice. AWS STS Las credenciales temporales son válidas solo durante el tiempo especificado (de 15 minutos a 36 horas). La duración máxima permitida de las credenciales temporales varía en función de factores como la configuración de los roles y el encadenamiento de funciones. Para obtener más información al respecto AWSSTS, consulte la documentación.

Epics

TareaDescripciónHabilidades requeridas

Cree tablas de DynamoDB.

Cree tablas de DynamoDB, con índices, tanto en las cuentas de origen como en las de destino. AWS

Configure el aprovisionamiento de capacidad como modo bajo demanda, lo que permite a DynamoDB escalar las capacidades de lectura/escritura de forma dinámica en función de la carga de trabajo. 

Como alternativa, puede utilizar la capacidad aprovisionada con 4000 y 4000. RCUs WCUs

Desarrollador de aplicacionesDBA, ingeniero de migración

Rellene la tabla de origen.

Rellene la tabla de DynamoDB de la cuenta de origen con datos de prueba. Tener al menos 50 MB o más de datos de prueba le ayuda a ver el pico y el promedio RCUs consumidos durante la copia de la tabla. A continuación, puede cambiar el aprovisionamiento de capacidad según sea necesario.

Desarrollador de aplicacionesDBA, ingeniero de migración
TareaDescripciónHabilidades requeridas

Cree IAM roles para acceder a las tablas de DynamoDB de origen y destino.

Cree un IAM rol en la cuenta de origen con permisos para acceder (leer) la tabla de DynamoDB de la cuenta de origen.

Agregue la cuenta de origen como entidad de confianza para este rol.

Cree un IAM rol en la cuenta de destino con permisos para acceder (crear, leer, actualizar, eliminar) la tabla de DynamoDB de la cuenta de destino.  

Agregue la cuenta de destino como entidad de confianza para este rol.

Desarrollador de aplicaciones, AWS DevOps
TareaDescripciónHabilidades requeridas

Obtenga credenciales temporales para los IAM puestos.

Obtenga credenciales temporales para el IAM rol creado en la cuenta de origen.

Obtenga credenciales temporales para el IAM rol creado en la cuenta de destino.

Una forma de obtener las credenciales temporales para el IAM rol es utilizarlas AWS STS desde AWSCLI.

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

Utilice el AWS perfil adecuado (correspondiente a la cuenta de origen o de destino).

Para obtener más información sobre cómo obtener credenciales temporales consulte lo siguiente:

Desarrollador de aplicación, ingeniero de migraciones

Inicialice los clientes de DynamoDB para el acceso a DynamoDB de origen y destino.

Inicialice los clientes de DynamoDB, que proporciona, para las tablas de DynamoDB AWS SDK de origen y destino.

  • Para el cliente DynamoDB de origen, utilice las credenciales temporales obtenidas de la cuenta de origen.

  • Para el cliente DynamoDB de destino, utilice las credenciales temporales obtenidas de la cuenta de destino.

Para obtener más información sobre cómo realizar solicitudes mediante credenciales IAM temporales, consulte la documentación. AWS

Desarrollador de aplicaciones

Eliminar y recrear la tabla de destino.

Elimine y vuelva a crear la tabla de DynamoDB de destino (junto con los índices) en la cuenta de destino mediante el cliente DynamoDB de la cuenta de destino.

Eliminar todos los registros de una tabla de DynamoDB es una operación costosa porque consume aprovisionamiento. WCUs Al eliminar y volver a crear la tabla, se evitan esos costos adicionales.

Puede añadir índices a una tabla después de crearla, pero esto requiere de 2 a 5 minutos más. Resulta más eficiente crear índices durante la creación de la tabla, pasando la colección de índices a la llamada createTable.

Desarrollador de aplicaciones

Realice la copia de la tabla.

Repita los pasos siguientes hasta que se copien todos los datos:

  • Realice un análisis de la tabla de la cuenta de origen mediante el cliente DynamoDB de origen. Cada escaneo de DynamoDB recupera solo 1 MB de datos de la tabla, por lo que debe repetir esta operación hasta que se lean todos los elementos o registros.

  • Para cada conjunto de elementos escaneados, escriba los elementos en la tabla de la cuenta de destino, con el cliente DynamoDB de destino, mediante BatchWriteItem la llamada de DynamoDB. AWS SDK De este modo, se reduce el número de solicitudes PutItem que se envían a DynamoDB. 

  • BatchWriteItem tiene un límite de 25 operaciones de escritura o incorporación, es decir, de hasta 16 MB. Debe añadir una lógica para acumular hasta 25 objetos escaneados antes de llamar a BatchWriteItem. BatchWriteItem devuelve una lista de los elementos que no se han podido copiar correctamente. Con esta lista, agregue una lógica de reintento para realizar otra llamada de BatchWriteItem únicamente con los elementos que no se hayan realizado correctamente.

Para obtener más información, consulte la implementación de referencia en C# (para eliminar, crear y rellenar tablas) en la sección de adjuntos. También se adjunta un ejemplo de archivo de notación de JavaScript objetos (JSON) de configuración de tablas.

Desarrollador de aplicaciones

Recursos relacionados

Información adicional

Este patrón se implementó con C# para copiar una tabla de DynamoDB con 200 000 elementos (el tamaño medio de los elementos es de 5 KB y el tamaño de la tabla de 250 MB). La tabla de DynamoDB de destino se configuró con una capacidad aprovisionada de 4000 y 4000. RCUs WCUs

La operación completa de copia de la tabla (de la cuenta de origen a la cuenta de destino), incluida la eliminación y la recreación de la tabla, duró 5 minutos. Capacidad total de unidades consumidas: 30 000 RCUs y aproximadamente 400 000. WCUs

Para obtener más información sobre los modos de capacidad de DynamoDB, consulte el modo de capacidad de lectura/escritura en la documentación. AWS

Conexiones

Para acceder al contenido adicional asociado a este documento, descomprima el archivo: attachment.zip