Configuración de DMS para DocumentDB: ¿dónde están mis índices?

Os traemos un capítulo más de nuestra serie "Píldoras técnicas sobre Platform Engineering: más allá de lo que encuentras en la documentación", donde el equipo de Platform Engineering de Codurance compartimos píldoras de conocimiento sobre cómo abordamos situaciones cotidianas. En el post anterior hablábamos de una migración de las AMI de Amazon Linux a Bottlerocket

En esta ocasión, nos llegó una nueva petición por parte de uno de nuestros equipos de desarrollo: necesitaban migrar parte de la aplicación a una nueva cuenta de AWS.

¿La solución? Amazon Data Migration Service. Siguiendo esta documentación oficial configuramos la instancia de DMS, los endpoints de origen (source) y destino (target) y finalmente creamos la Database Migration Task. Como nuestro objetivo era tener todo el contenido replicado en la nueva cuenta, seleccionamos la migración en vivo “Migrate existing data and replicate ongoing changes”.

Una vez la tarea se ejecutó, al conectarnos a la nueva DocumentDB y empezar a revisar vimos que aunque las bases de datos y las colecciones estaban replicadas… ¡faltaban los índices!

Comenzamos a investigar el motivo y AWS menciona:

“AWS DMS crea tablas, claves principales y, en algunos casos, índices únicos, pero no crea ningún otro objeto que no se necesite para migrar eficientemente los datos desde el origen. Por ejemplo, no crea índices secundarios, limitaciones de claves no primarias ni valores predeterminados de datos.

Para migrar objetos secundarios desde la base de datos, utilice las herramientas nativas de la base de datos si está migrando al mismo motor de base de datos que su base de datos de origen.” - Documentación oficial de resolución de problemas

En este caso, ¿cuál es el mejor enfoque? Afortunadamente AWS provee una herramienta para ello! Podemos hacer uso de Amazon DocumentDB Index Tool para:

  1. Exportar los índices del origen (source).
  2. Revisar la compatibilidad de dichos índices con la base de dato destino (target).
  3. Restaurar los índices a la DocumentDB de destino, preferiblemente antes de usar AWS DMS para cargar los datos.


Con el objetivo de conectar tanto a la base de datos de origen como a la de destino, desplegaremos una instancia de AWS Cloud9. Tomaremos ventaja que ya hemos configurado el VPC peering entre las VPC de las bases de datos, y saltaremos directamente a la instalación de mongo shell para probar dicha conexión:

## Install mongo shell

echo -e "[mongodb-org-4.0] \nname=MongoDB Repository\nbaseurl=https://repo.mongodb.org/yum/amazon/2013.03/mongodb-org/4.0/x86_64/\ngpgcheck=1 \nenabled=1 \ngpgkey=https://www.mongodb.org/static/pgp/server-4.0.asc" | sudo tee /etc/yum.repos.d/mongodb-org-4.0.repo

sudo yum install -y mongodb-org-shell

## Download CA

wget https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem

## Test connection to source database

mongo --ssl --host [SOURCE_HOST]:[SOURCE_PORT] --sslCAFile global-bundle.pem --username administrator --password '[SOURCE_PASSWORD]'

## Test connection to target database

mongo --ssl --host [TARGET_HOST]:[TARGET_PORT] --sslCAFile global-bundle.pem --username administrator --password '[TARGET_PASSWORD]'

Una vez hemos verificado que podemos conectar con ambas bases de datos, necesitaremos instalar la herramienta de migración de índice y ejecutar los pasos que hemos mencionado anteriormente:

## Clone and install index migration too

git clone https://github.com/awslabs/amazon-documentdb-tools.git

cd amazon-documentdb-tools/index-tool

python3 -m pip install -r requirements.txt

## Create index export folder

mkdir -p docdb_index_export

## Copy the previously downloaded CA

cp -rp /home/ec2-user/environment/global-bundle.pem .

## Dump the index info from source db

python3 migrationtools/documentdb_index_tool.py --dump-indexes --dir docdb_index_export --uri 'mongodb://administrator:[SOURCE_PASSWORD]@[SOURCE_HOST]:[SOURCE_PORT]/?tls=true&tlsCAFile=global-bundle.pem&replicaSet=rs0&retryWrites=false'

## Verify index compatibility with target db

python migrationtools/documentdb_index_tool.py --uri 'mongodb://administrator:[TARGET_PASSWORD]@[TARGET_HOST]:[TARGET_PORT]/?ssl=true&tlsCAFile=global-bundle.pem&replicaSet=rs0&readPreference=secondaryPreferred&retryWrites=false' --show-issues --dir docdb_index_export --support-2dsphere

## Restore index in target db

python migrationtools/documentdb_index_tool.py --uri 'mongodb://administrator:[TARGET_PASSWORD]@[TARGET_HOST]:[TARGET_PORT]/?ssl=true&tlsCAFile=global-bundle.pem&replicaSet=rs0&readPreference=secondaryPreferred&retryWrites=false' --restore-indexes --dir docdb_index_export --support-2dsphere

## If there are any special characters in the credentials, they will need to be % escaped

¡Todo listo! Ahora podemos conectarnos a la base de datos de destino y verificar que los índices se encuentran ya creados. Con esto, ¡nuestro nuevo DocumentDB se encuentra preparado para la migración!

¿Alguna vez os habéis encontrado una casuística similar? ¿Cómo la solucionasteis?

codurance_migracion_al_cloud