¿Cómo migrar tu base de datos on premise a la nube de AWS?
Published: 2022-08-11 19:18:53

En esta publicación voy a estar hablando sobre el servicio de AWS llamado **Database Migration Service (DMS)**.

<u>**Caracteristicas Principales**</u>

- AWS Database Migration Service (DMS) es un servicio de AWS que nos permite la migración de bases de datos a la nube.

- Permite realizar la migración de bases de datos On Premise (y cloud) hacia AWS.

- DMS es un servicio resiliente a potenciales fallos (highly resilient & self–healing)

- A lo largo de la migración de datos la base de datos de origen (Source) se mantiene activa sin interrupciones. 

- DMS Soporta migraciones de bases de datos de manera:
     **Homogéneas**: Ej. Caso de uso: PostgreSQL ⇒ PostgreSQL
     **Heterogéneas**: Ej. Caso de uso: MS Sql Server ⇒ Aurora (Debe utilizarse el SCT (Schema Conversion Tool))

- Los tipos de migraciones pueden ser:
     **Full/Snapshot**
     **Change Data Capture (CDC)**

- El Schema Conversion Tool (SCT) permite convertir el schema de una BDD de un motor a otro.

- Puede ser utilizado entre bases de datos OLTP / OLAP
     Ej. OLTP: Oracle ⇒ PostgreSQL
     Ej. OLAP: Teradata ⇒ Redshift

![DMS1](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3cb7i09yjmmguyjphksp.png)


<u>**Endpoints**</u>
Para utilizar DMS es necesario definir un Sourcer y Target Endpoint. A Continuación mostraré los actualmente disponibles:

![DMS2](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hv3sbjvvrowfvkegtp9g.png)
 

<u>**DEMO**</u>

<u>Descripción del escenario</u>: 

- La compañía “Sin Nombre SRL” está comenzando a dar sus primeros pasos en el mundo Cloud. 
- Luego de analizar las distintas soluciones y tecnologías disponibles en el mercado, optaron por migrar su infraestructura de Base de datos hacia AWS, utilizando el servicio RDS. 
- La actual base de datos es PostgreSQL y está sobre un servidor dedicado el cual requiere mantenimiento (patches/seguridad/OS/etc), el cual debe ser reducido. 
- Es necesario que el 100% de los datos actuales sean migrados a la nube, exceptuando algunas entidades de datos. 
- Debe replicarse diariamente los cambios ocurridos en el origen.

Arquitectura:
![DMS3](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/y2jwrar5alk8vpyquac0.png)

_NOTA: Debemos contar con una instancia de Clod9_
 
<u>Pasos a Realizar:</u>
1. Crear las 2 instancias (Source y Target) con un script de CloudFormation.
2. Crear una Inbound Rule en el security group de cada Base de datos para abrir el puerto de PostgreSQL.
3. Crear instancia de replicación en DMS.
4. Instalar Postgres Tools (psql)
5. Conectarse a Source DB
6. Ejecutar script de creación de tablas en Source DB
7. Crear en DMS el Source Endpoint y Target Endpoint.
8. Probar conexión a Target DB y validar que se encuentra sin datos
9. Crear tarea de replicación (FULL LOAD) y ejecutar. 
10. Validar que los datos hayan sido replicados en el target.
11. Crear tarea de replicación (CDC) y ejecutar. 
12. Insertar registros nuevos en la tabla de Source DB.
13. Validar que los datos hayan sido replicados en el target.
14. Eliminar Recursos.


_**Paso # 1: Crear las 2 instancias (Source y Target) con un script de CloudFormation.**_

- Ejecutar el siguiente comando para posicionarse en el directorio donde se encuentra el archivo bash para realizar el deployment.

cd /home/ec2-user/environment/Datapath/DMS

![DMS6](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/im64562xhagn9430ai0p.png)
 

- Ejecutar el archivo “deploy.sh” (Creación de Stack CloudFormation)

bash deploy.sh

![DMS7](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4ydyxaodkgqmv6c4cpre.png)
 

- Verificar que se esté ejecutando el stack en Cloudformation
![DSMS99](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/agfwifgk2fpsjx60vt4b.png)


_**Paso # 2: Crear una Inbound Rule en el security group de cada Base de datos para abrir el puerto de PostgreSQL.**_

- Ir al servicio de RDS y modificar los security groups para poder abrir los puertos 5432 (PostgreSQL)

![DMS024](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0j5j8522g1inj5ey3hcd.png)
 

- En la parte inferior derecha se puede visualizar el security group de nuestra instancia de BDD. Hacer Click en el link del security group para que nos direccione a las configuraciones

![DMS124](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ab29buhs1kf2r73m7g2u.png)
 

- Hacer Click en “**Edit inbound Rules**” y agregar la misma regla que está en las imágenes de a continuación para abrir el puerto de postgres.

![DMS1235](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0g1f2bk8kxflot68xd3l.png)

 
_**Paso # 3: Crear instancia de replicación en DMS.**_

- Ingresar al servicio **DMS** y crear una nueva Replication Instance haciendo click en el boton “**Create replicacion instance**” (boton naranja)

![DMS55](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zj2ecuyoyjlsg0h1zubo.png)
 

- Ingresar un nombre (no utilizar el de la imagen) que debe ser único. Se recomienda agregarle de sufijo el ID de cuenta de AWS

- Dejar los valores por default y establecer:
Allocated Storage: 5 Gb
<u>_VPC_</u>: Dejar la default
<u>_Type_</u>: Single AZ
<u>_Publicly Accessible_</u>: No seleccionado

![DMS268](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/k5q0jrgwwc7vg2apeprw.png)
 

_**Paso # 4: Instalar Postgres Tools (psql)**_

- Dentro de la instancia de Cloud9, ejecutar el siguiente comando:

`sudo yum install postgresql -y`

![DMS5477](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/at9v0owe2cczthddhmf2.png)
 

_**Paso #5: Conectarse a Source DB**_

- Dentro de la instancia de Cloud9, ejecutar el siguiente comando para conectarnos a la Source DB:


Asegurarse de reemplazar el valor en rojo por el endpoint de la base de datos source:

`psql    -h  [[++SOURCE_ENDPOINT++]] \
       -U postgres \
        -p 5432 \
        -d postgres`

_Password es: source_p4assw0rd_


![DMSSQL](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/k1uxwe5yfbcse70jnurh.png)
 

_**Paso #6: Ejecutar script de creación de tablas en Source DB**_

`create table if not exists personas
(
    id            bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    nombre        varchar(100),
    apellido      varchar(100),
    telefono      varchar(100)
);

insert into personas (nombre, apellido, telefono) values ('cristian','carballo','1234');
insert into personas (nombre, apellido, telefono) values ('Juan','Lopez','1234');
insert into personas (nombre, apellido, telefono) values ('Miguel','Garcia','1234');
insert into personas (nombre, apellido, telefono) values ('Roman','Riquelme','1234');
insert into personas (nombre, apellido, telefono) values ('Diego','Maradona','1234');


create table if not exists marcas
(
    id            bigint GENERATED ALWAYS AS IDENTITY,
    nombre        varchar(100),
    ubicacion     varchar(100)
);

insert into marcas (nombre, ubicacion) values ('Nike','USA');
insert into marcas (nombre, ubicacion) values ('Reebok','UK');
insert into marcas (nombre, ubicacion) values ('Adidas','Nigeria');
`

![DMS56278](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yqzi58uwj8bbypeasxv1.png)
 

_**Paso #7: Crear en DMS el Source Endpoint y Target Endpoint.**_

- Ingresar al servicio DMS y dentro de la opción de Endpoints, crear 2 endpoint:

**Source Endpoint ⇒ PostgreSQL Source 
Target Endpoint ⇒ PostgreSQL Target**

![SDM](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/v8blrwcib95r4exk8ao8.png)
 
![SOURCE](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2v7coby5lpwhej58dh6l.png)


![TARGET](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/s1mlgh2xpold6m5nqkm0.png)
 
_**Paso #8: Probar conexión a Target DB y validar que se encuentra sin datos
**_
 

- Dentro de la instancia de Cloud9, ejecutar el comando para conectarnos a la Target DB, de igual manera a lo realizado en paso # 5.

- Para validar que la Target BDD esté vacía, ejecutar el siguiente comando:

`SELECT *
FROM pg_catalog.pg_tables
WHERE   schemaname != 'pg_catalog' AND 
        schemaname != 'information_schema';`

![MM](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fru85e75mp9ystturxgg.png)
 

_**Paso #9: Crear tarea de replicación (FULL LOAD) y ejecutar.**_

- Dentro del servicio DMS crear una Migration Task con los siguientes parametros: 

![DEME](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/iz0qb3ii38upbd6of0dl.png)

 
_**Paso #10: Validar que los datos hayan sido replicados en el target.**_

- Ejecutar en el  Target BDD el siguiente comando y ver que se generó la tabla personas y luego accederla:

`SELECT *
FROM pg_catalog.pg_tables
WHERE   schemaname != 'pg_catalog' AND 
        schemaname != 'information_schema';`

![DMSK](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hi669eycam9xll0u1v7u.png)
 

_**Paso #11: Crear tarea de replicación (CDC) y ejecutar.**_

- Dentro del servicio DMS crear una Migration Task con los siguientes parametros:

![MKL](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xq6o8rqwsa4b7iaqt13n.png)
 
 
_**Paso # 12: Insertar registros nuevos en la tabla de Source DB.**_


- Para este ejemplo insertaremos 2 registros y actualizaremos uno ya existente 

![IUY](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n966ithd7mwmnt5y2dna.png)
 

_**Paso #13: Validar que los datos hayan sido replicados en el target.**_

- Como se puede ver en la imagen a continuación, los registros fueron migrados correctamente.

![KIU](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/drmwj5fqr830s2rh5b0g.png)
 

_**Paso #14: Eliminar Recursos**_

- Para eliminar los recursos realizarlos de la siguiente manera respetando el orden:

Detener la tarea de migración del CDC.

Esperar que detenga y eliminar tarea de migración de CDC y FULL.

Esperar a que terminen de eliminarse las 2 tareas de migración y luego eliminar la Replication Instance.

Eliminar los 2 endpoints (Source & Target) creados en DMS.	

Eliminar las 2 bases de datos en RDS de manera manual asegurándose de no realizar el backup.

En CloudFormation eliminar el stack de RDS (StackRDS).

En CloudFormation eliminar el stack generado por la creación de Cloud9 (aws-cloud9-datapath-xxxxx)