Blog de Amazon Web Services (AWS)

Despliegue de Moodle en alta disponibilidad en AWS

Por Alex Luna, SA, WWPS Mexico

 

Moodle es un sistema de Gestión del Aprendizaje (Learning Management System, LMS) de código abierto ampliamente adoptado y utilizado por un sinfín de instituciones educativas en todo el mundo, muchas de las cuales enfrentan retos de escalabilidad y desempeño debido al aumento en el número de usuarios, sobre todo en períodos de alta concurrencia y en picos de demanda como inscripciones o temporada de exámenes.

Este artículo muestra cómo desplegar una solución de Moodle en alta disponibilidad, tolerante a fallas y escalable de forma distribuida. Así mismo se emplea una plantilla de AWS CloudFormation que facilita el despliegue y configuración de los recursos necesarios para soportar la solución en cuestión.

Moodle es implementado, a menudo, bajo un modelo de arquitectura monolítica, es decir se instala tanto la base de datos como el servidor web y de aplicaciones en el mismo servidor o en el mejor de los casos la base de datos en una instancia y el servidor web en otra, lo que conlleva a retos de disponibilidad y escalabilidad.

Una forma de atacar estos problemas es el escalamiento vertical, es decir aumentar la capacidad de recursos (RAM, CPU y Almacenamiento) en la misma instancia. Lo que conlleva a ventanas de mantenimiento para el escalado o migración a un servidor con mayores recursos.

El enfoque anterior resulta complicado, lento y costoso; e implica una sobreestimación al intentar satisfacer concurrencia o subestimación al intentar ahorrar costos. Siendo una solución temporal para escalabilidad, quedando aún pendiente el tema de alta disponibilidad y tolerancia a fallos.

 

Vista rápida de la solución

A continuación, se presenta una solución para implementar una arquitectura distribuida, costo efectiva, auto escalable y tolerante a fallos para Moodle, con base en la arquitectura de referencia Hosting Moodle on AWS.

La solución consta de un conjunto de archivos YAML que despliegan recursos, a través de AWS CloudFormation, dentro de una cuenta de AWS, de forma automática, por lo que solo hay que proporcionar ciertos parámetros. Las plantillas individuales desplegarán Moodle utilizando servicios como:  Amazon Virtual Private Cloud (Amazon VPC)Amazon Elastic Compute Cloud (Amazon EC2)Auto ScalingElastic Load Balancing (Application Load Balancer)Amazon Relational Database Service (Amazon RDS)Amazon ElastiCacheAmazon Elastic File System (Amazon EFS)Amazon CloudFrontAmazon Route 53Amazon Certificate Manager (Amazon ACM). Puede que esta solución sea excesiva para ciertas implementaciones de Moodle dependiendo el caso de uso, por ello es que las plantillas se pueden ejecutar de forma individual de ser necesario.

 

 

Procedimiento

Desplegar plantilla de CloudFormation

La plantilla despliega el archivo 00-master.yaml, mismo que invoca otros archivos yaml individuales que contienen la configuración de los diferentes servicios involucrados en la solución.

Crear el stack

  1. Inicie sesión en la consola de AWS.
  2. Seleccionar la región donde se quiere desplegar la solución.
  3. Dar clic en el enlace “Ejecutar stack” de la tabla siguiente que corresponda a la región en cuestión.
Código de región de AWS Nombre Ejecutar
1 us-east-1 US East (N. Virginia) Ejecutar stack
2 us-east-2 US East (Ohio) Ejecutar stack
3 us-west-2 US West (Oregon) Ejecutar stack
4 eu-west-1 EU (Ireland) Ejecutar stack
5 eu-central-1 EU (Frankfurt) Ejecutar stack
6 ap-southeast-2 AP (Sydney) Ejecutar stack

 

  1. Dar Clic en “Next”, llevará a la siguiente página.

 

 

Especificar los detalles del stack

  1. Generales
    • Capturar un nombre para el stack.
    • Se debe indicar un Key Pair para acceder al Bastión y a las instancias web.
    • Si se cuenta con un dominio se debe indicar.
    • Si se usa Route 53 se debe indicar caso contrario seleccionar false
  2. Red
    • Indicar el número y seleccionar las zonas de disponibilidad donde se habrán de desplegar los recursos.
    • Por defecto se utilizará el segmento de red 10.0.0.0/16 para la creación de la VPC, tome en cuenta que no debe de  existir otra VPC con el mismo segmento de red o el stack fallará. En el caso que sea así, especifique otro segmento de red o seleccione otra región.
    • Se pueden configurar hasta 6 segmentos de red para cada subred, Pública, Web y de Datos, estos segmentos corresponden a las Zonas de Disponibilidad seleccionadas en el paso anterior.
  3. Capa de Sistema de Archivos
    • Seleccionar “generalPurpose” es suficiente.
    • Si se desea se puede utilizar cifrado, para este ejemplo no se usa.
    • El tamaño de instancia se puede ajustar de acuerdo a la necesidad particular.
  4. Capa de Base de datos
    • Ajustar el tipo de instancia adecuado.
    • Si se desea se puede utilizar cifrado, para este ejemplo no es necesario.
    • Capturar el usuario principal y el nombre de la base de datos de Moodle.
  5. Capa de caché
    • Se debe dejar en false el parámetro de cache de sesión durante la instalación inicial y configurar la cache de sesión después de completar la instalación. IMPORTANTE: Lo anterior debido a que la instalación de Moodle fallará si la caché de sesión de memcached se habilita durante la configuración inicial.
    • Seleccionar false en Caché de sesión.
    • Seleccionar true en Caché de aplicación.
    • Seleccionar el tamaño de instancia deseado para cada nodo de caché.
    • Especificar si se usará CloudFront. Esto depende de si se desea usar un CDN.
    • Capturar el ARN del certificado creado en los prerrequisitos.
  6. Capa de bastión
    • Especificar el tipo de instancia, se recomienda una instancia pequeña, por ejemplo t2.micro.
  7. Capa web
    • Capturar el ARN del certificado creado en los prerrequisitos
    • Indicar el tipo de instancia para los servidores web.
    • Dejar Min y Max en 1 debido a que el asistente de instalación de Moodle podría causar un pico que provoque el lanzamiento de instancias no necesarias en esta fase.
  8. Dar clic en Next.

Configuración de Moodle

Una vez creados los recursos de la plantilla de CloudFormation, se continua con la instalación de Moodle.

 

Instalación de Moodle

1. El resultado del stack es un DnsName en la pestaña

 

 

2. Hacer clic en la URL del Key DnsName para ir a la pantalla de Instalación, el DNS redireccionará al dominio indicado en los parâmetros del stack

 

 

3. Dar click en “Continue”.

4. Moodle mostrará todas las extensiones de php instaladas. Dar click en “Continue”.

5. A continuación Moodle se actualizará, al terminar mostrará el mensaje “Installation must be finished from the original IP address, sorry.”, el cual es un error documentado por Moodle cuando se despliega en clúster, para corregirlo ejecutar el paso 6, caso contrario saltar al paso 7.

6. Actualizar la IP en la Base de datos.

    • Establecer a 1 el valor de “Desired capacity” y “Minimum capacity” del Auto Scaling Group del Bastión host, para que se cree una instancia de bastión host y desde ahí poder actualizar la IP en la base de datos. La creación del bastión host iniciará automaticamente.

 

 

    • Acceda a consola de AWS Secrets Manager, en Secret Value clic en “Retrieve secret value” para obtener la contraseña de la base de datos, copiar el Secret Value del Secret Key

 

 

    • Obtener el endpoint de la base de datos desde la consola de RDS, seleccionar el nodo “Writer”.

 

    • Seleccionar la sección “Network Interfaces” de la consola EC2 y copiar la IP privada del Balanceador.
    • Conectarse al Bastión host usando el DNS público del mismo. Abrir una terminal SSH y escribir el siguiente comando.
$ ssh -i "<<mi_archivo.pem>>" ec2-user@<<ip pública bastión>>
    • Conectarse a una de las instancias web desde el bastión host, se recomienda utilizar un SSH Agent Forwarding.
    • Una vez dentro de la instancia de aplicación, abrir la conexión a la base de datos.
$ psql "dbname=moodle host=<<endpoint_nodo_writer_de_RDS_copiado_en_inciso_c>> user=moodle password=<<secret_value_de_inciso_b>> port=5432 sslmode=require"

 

  • Ejecutar el comando de actualización
UPDATE mdl_user set lastip='<<ip_privada_de_inciso_d.>>' where username='admin';
    • Dar click en botón “Continue”. La pantalla debe cambiar.
    • Capturar los datos necesarios (Usuario, Contraseña, Nombre y Apellido), clic en “Update profile”.
    • En este punto es probable que se muestre el error: “504 ERROR The request could not be satisfied.” o “504 Gateway Timeout”. Solo hay que refrescar la página.
    • Dar un nombre a la instalación, seleccionar zona horaria y dar click en “Save changes”.
    • La siguiente página es opcional para registrar la instalación.

 

Configuración de Caché

Hasta este punto Moodle ya está configurado pero el desempeño podría observarse lento.

Configurar caché de aplicación

1. Iniciar sesión en Moodle con el usuario y contraseña configurado previamente.

2. Acceder a la consola de ElastiCache, y dar clic en el clúster “moodleapplication”.

3. Copiar el “Configuration endpoint”.

 

 

4. Dar click en “Site Administration”.

5. Dar click en la pestaña “Plugins”, hacer buscar la sección “Caching” y dar click en “Configuration”.

6. En la sección “Cache Administration Installed cache stores” clic en “Add instance” del renglón Memcached.

 

 

7. Capturar un valor para “Store name” y pegar en el cuadro de texto de “Servers” el endpoint que se obtuvo de la consola de ElastiCache.

 

 

8. Dar clic en “Save changes”.

9. Navegar hasta el final de la página y dar clic en “Edit mappings”.

10. En la página “Cache administration” en el parámetro “Application” seleccionar el almacén de caché agregado en el paso anterior y dar clic en “Save changes”.

 

 

11. A partir de este momento la aplicación debe responder rápidamente.

12. Opcionalmente para la cache de sesión se puede configurar repitiendo los pasos de esta sección. Se recomienda crear un clúster específicamente para la caché de sesión.

 

 

Recursos desplegados y notas sobre instalación de Moodle

Application Load Balancer

Un Balanceador de Aplicaciones distribuye el tráfico de entrada a la aplicación a través de múltiples instancias EC2 a través de múltiples Zonas de Disponibilidad. La alta disponibilidad se alcanza al agrupar múltiples servidores de Moodle accedidos desde un balanceador de carga.

Amazon Autoscaling

Amazon EC2 Auto Scaling permite controlar el número de instancias EC2 que están activas en cada momento y a través de métricas definidas por el usuario puede aumentarlas o disminuirlas, adecuándose a la demanda. La plantilla define que, si el promedio de utilización de CPU excede el 75% por 3 minutos, se agregará una instancia y se eliminará si el promedio cae por debajo de 25% por 3 minutos.

Amazon Elastic File System (EFS)

Es un servicio de almacenamiento de archivos simple y escalable que puede ser montado en instancias EC2. Si bien la instalación de Moodle sobre EFS hace más fáciles las tareas de gestión como actualización, instalación de parches, Moodle no tiene un buen desempeño ejecutándose en almacenamiento compartido. Moodle recomienda que el folder dirroot se configure de forma local. Por lo tanto, la plantilla usa una combinación de EBS (Elastic Block Store) y EFS. Cada servidor web dentro del clúster de Moodle utiliza la siguiente estructura de directorios:

 

$CFG->dirroot = '/var/www/moodle/html'        #Stored on root EBS volume
$CFG->dataroot = '/var/www/moodle/data'       #Stored on shared EFS filesystem
$CFG->cachedir = '/var/www/moodle/cache'      #Stored on shared EFS filesystem
$CFG->tempdir = '/var/www/moodle/temp'        #Stored on shared EFS filesystem
$CFG->localcachedir = '/var/www/moodle/local' #Stored on root EBS volume

 

De acuerdo a la documentación de Moodle, cuando este se despliega como una solución en clúster, el directorio dirroot se debe mantener siempre en modo lectura para el proceso de Apache, de otra forma al instalar o desinstalar complementos o plugins, los nodos perderán sincronía. Lo que implica que no se pueden instalar plugins en un clúster de servidores desde la página el panel de administración. Moodle recomienda instalar manualmente los plugins en cada servidor durante ventanas de mantenimiento programadas. Una alternativa es, configurar la instalación de plugins como scripts la otra es instalar los plugins en una instancia, generar una AMI a partir de ella y actualizar el Launch configuration para que las siguientes instancias se generen a partir de ésta.

Caché

La caché o caching impacta significativamente el desempeño de Moodle. La plantilla configura varias formas de caching, incluyendo OPcache, CloudFront y ElastiCache

OPcache

Acelera la ejecución de PHP cacheando en memoria scripts pre compilados. Los beneficios de OPcache son mejora en desempeño y uso más bajo de memoria. La plantilla configura OPcache de esta forma.

Amazon ElastiCache

Amazon ElastiCache para Memcached es un servicio de almacenamiento en memoria tipo clave-valor compatible con Memcached que puede ser usado para hacer cacheo o para datos. Moodle recomienda no usar el mismo servidor de memcached para sesiones y para MUC. Por lo que, la plantilla configura 2 clúster de ElastiCache, uno para cache de sesión y otro para cache de aplicación.

Caché de sesión

La recomendación de Moodle es que se utilice un servidor de memcached compartido para almacenar las sesiones. Para mayor información consultar este enlace.

Caché de aplicación

La plantilla también despliega un clúster de ElastiCache para cache de aplicación, misma que debe ser configurada después de la instalación. Esta caché aumentará significativamente el desempeño de la solución.

Limpieza de recursos

Para eliminar los recursos (de ser necesario) creados en este ejercicio, se debe acceder a la consola de CloudFormation, seleccionar el stack empleado y dar clic en “Delete”.

 

Conclusión

Utilizar los servicios y mejores prácticas de AWS permiten implementar una arquitectura de solución para Moodle que ofrece alta disponibilidad, resiliencia y escalabilidad bajo demanda, en una forma costo-efectiva, optimizando recursos y costos.

 


Sobre el autor

Alex Luna es Arquitecto de Soluciones en AWS México.