Migrar gran cantidad de datos a la nube de AWS rápido y económico
Tags: awsdatasync, amazonfsx, cloudformation, amazoncloudwatch
Published: 2023-05-17 12:34:47

Cuando migramos aplicaciones hacia la nube, movemos software, infraestructura y datos para que las aplicaciones funcionen correctamente en su nuevo espacio. Todo el movimiento requiere servicios de transferencia potentes capaces de coordinar gran cantidad de datos.

Este es el caso de la migración de Terabytes (TB) de datos almacenados en un sistema de archivos compartido On-premise (centro de datos en tierra) hacia los servicios de almacenamiento de nube. Se trata de una transferencia de datos en línea, económica y rápida usando los servicios AWS.

## Los servicios


* **Amazon FSX for Windows File Server** es un servicio administrado de almacenamiento para sistemas de archivo compartidos Windows. Incluye soporte nativo para protocolos de red Windows, rendimiento y baja latencia. Elimina la tarea de configurar servidores de archivos y volúmenes de disco.

* **AWS DataSync** es un servicio que permite trasladar datos desde un origen (On-premises o nube), hacia un servicio de almacenamiento de AWS. Sirve como un puente para mover archivos de un lugar a otro de forma coordinada mediante tareas programadas y de implementación automatizada por medio de la infraestructura como código con AWS CloudFormation. A diferencia de otros servicios de transferencia datos, es de uso temporal durante la migración de datos.

* **AWS CloudFormation** permite aprovisionar recursos en AWS de forma rápida y consistente, mediante la infraestructura como código (IaC). Los recursos se definen en plantillas escritas en lenguaje YAML o JSON que son agrupadas en pilas (stacks) para una administración y despliegue automatizado.

* **Amazon CloudWatch** es un servicio de monitoreo que recopila y visualiza registros, métricas y datos de eventos de infraestructura implementada en AWS, mediante paneles o grupo de registros para supervisar el rendimiento de aplicaciones.

Estos servicios están sincronizados entre sí por medio de canales de comunicación segura, como muestra el siguiente diagrama de arquitectura:


![AWS DataSync architecture
](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/v4l5jybl4gpi2ahx85t4.png)

## Los agentes


Lo primero, se requiere configurar agentes AWS DataSync cerca al origen de los datos en el sistema de archivos compartido. Este puede ser una máquina virtual sobre VMware ESXi, Microsoft Hyper-V, Linux KVM o una instancia EC2 con imagen DataSync VM. Lo importante es cumplir con los requisitos de red y configuracion del agente AWS DataSync.

En el destino, en la cuenta AWS, configurar un punto de enlace (VPC endpoint) con interfaces de red (ENI) por zona de disponibilidad y el servicio AWS DataSync con la llave de activación (activation key) que se obtiene de los agentes AWS DataSync previamente configurados en el origen.

Esto nos permite visualizar desde la consola AWS qué origen y destino están sincronizados:


![AWS DataSync agent is online
](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1nmab6fuwqa05ra8nju7.png)

## La automatización

La implementación del servicio AWS DataSync, VPC Endpoints, ubicaciones y tareas de transferencia se realiza mediante infraestructura como código con AWS CloudFormation, donde se definen los parámetros necesarios en plantillas YAML ó JSON.

**VPC Endpoints y grupos de seguridad**


```
# Security Group para el VPC Endpoint
rDataSyncEndPointSG:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Permitir conexión VPC endpoint
      GroupName: Nombre para security group
      VpcId: Id de red privada virtual (VPC)
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: # numero de puerto
          ToPort: # numero de puerto
          CidrIp: # Direccion IP de agente AWS DataSync
          Description: Acceso desde el agente los agentes en tierra
  
# VPC Endpoint con ENI por cada subnet  
  rDataSyncVpcEndpoint:
    Type: AWS::EC2::VPCEndpoint
    Properties:
      SecurityGroupIds: # Id de security group
      ServiceName: !Sub com.amazonaws.${AWS::Region}.datasync
      SubnetIds: # Id de subredes de VPC
      VpcEndpointType: Interface
      VpcId: # Id de red privada virtual (VPC) 

# Registro de agentes en consola AWS DataSync
  rDataSyncAgent:
    Type: AWS::DataSync::Agent
    Properties: 
      ActivationKey: # Llave de activacion de agente AWSDatasync
      AgentName: # Nombre descriptivo
      SecurityGroupArns: # Amazon Resource Name(ARN) de security group
      SubnetArns: # Amazon Resource Name(ARN) de subred
# Grupo de log para registrar los eventos de la tarea de transferencia de archivos
  rLogGroups:
    Type: AWS::Logs::LogGroup
    Properties: 
      LogGroupName:  # Nombre descriptivo
      RetentionInDays: # Dias de retención de logs
```

**Ubicaciones y tareas de transferencia**

```
# Origen Transferencia de archivos SMB
  rDataSyncSource:
    Type: AWS::DataSync::LocationSMB
    Properties: 
      AgentArns: 
        - # Amazon Resource Name (ARN) del agente AWSDataSync
      Domain: # Nombre de domninio de directorio activo
      Password: # Credencial con acceso de lectura al origen
      User: # Credencial con acceso de lectura al origen
      ServerHostname: # Nombre o dirección IP del origen
      Subdirectory: # Carpeta compartida origen en formato /ruta/carpeta

# Detino Transferencia de Archivos FSX
  rDataSyncTarget:
    Type: AWS::DataSync::LocationFSxWindows
    Properties: 
      Domain: # Nombre de domninio de directorio activo
      FsxFilesystemArn: # Amazon Resource Name (ARN) del sistema Amazon FSX
      Password: # Credencial con acceso de escritura al destino
      User: # Credencial con acceso de lectura al destino
      SecurityGroupArns: # Amazon Resource Name (ARN) de security group
      Subdirectory: # Carpeta compartida destino en formato /ruta/carpeta
      
# Tarea de Transferencia de Archivos hacia FSX
  rDataSyncTaskFSX:
    Type: AWS::DataSync::Task
    Properties:
      Name: # Nombre descriptivo     
      SourceLocationArn: !Ref rDataSyncSource # Referencia a origen
      DestinationLocationArn: !Ref rDataSyncTarget # Referencia a destino
      Includes: # Filtros adicionales para destino
      Options: # Opciones de tarea
      Schedule: # Programacion de tarea
        ScheduleExpression: # Formaton CRON
      CloudWatchLogGroupArn: !Ref pLogGroupsArn # Referencia a grupo de logs
```

## La transferencia

Como se observa en el código, la transferencia es programada mediante tareas que son especificadas mediante el parámetro Schedule, escrito en formato de expresiones CRON, un periodo o una hora específica para iniciar la transferencia de datos. Algunos ejemplos de tareas programadas:

Para una tarea que ejecute el domingo a las 12:00PM, escribimos cron(0 12 ? * SUN *).
Para una tarea que ejecute cada hota, escribimos rate(1 hour).
En la consola AWS DataSync la tarea quedará programada de la siguiente manera:


![AWS DataSync task schedule](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/j5gtggzspaqkm4hy6qfq.png)

En la pestaña History, visualizamos el estado de la ejecución de la tarea y ver un registro más detallado acerca de los datos transferidos o fallidos en el servicio Amazon CloudWatch LogGroups.


![Amazon CloudWatch LogGroups](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/79t2e7h8hx6s7kxwboy5.png)


Usando los servicios adecuados combinados con la infraestructura como código, podemos dar solución a casos de migración y modernización de aplicaciones de forma económica y sin necesidad de arrendar equipos robustos para almacenamiento y transferencia de datos permitiendo agilidad en el movimiento hacia la nube.. No obstante, en algunos casos sí se requieren y AWS ofrece dichos equipos.

Publicación original en: [Bancolombia Tech](https://medium.com/bancolombia-tech/migrando-gran-cantidad-de-datos-a-la-nube-de-aws-r%C3%A1pido-y-econ%C3%B3mico-becaa108162)