Cómo evitar una caída por una actualización no planificada
Migrar los sistemas de tu negocio a la nube ofrece numerosos beneficios. Una ventaja clave de un servicio gestionado es que ya no tienes que mantener el servicio sobre infraestructura propia, con recursos técnicos y procesos operativos establecidos. A cambio de una cuota, te apoyas en el conocimiento y la experiencia colectiva del proveedor. Usar un servicio de gestión de bases de datos tiene muchas ventajas, entre ellas la seguridad, la asignación de recursos y la integración de funcionalidades.
En este artículo se analiza una funcionalidad disponible en varios servicios de proveedores de nube que, a primera vista, parece una victoria fácil para el mantenimiento rutinario. Sin embargo, tiene un costo que podría ser devastador para tu negocio: una caída crítica y un escenario de desastre para el que no estás preparado, en el que ya no cuentas con los recursos técnicos ni las habilidades de una implementación auto-hospedada anterior.
Esa funcionalidad son las actualizaciones automáticas de versión menor.
¿Por qué son importantes las actualizaciones de producto?
Cada organización tiene procesos y controles distintos, construidos sobre años de experiencia, productos y herramientas internas únicas a su operación. Pueden ser procesos muy robustos, adecuados o frágiles. Usar un servicio gestionado puede dar una sensación de estabilidad y mayor capacidad operativa; sin embargo, no elimina la necesidad de hacer pruebas. La nube, los servicios gestionados, la automatización, la IaC y los frameworks no eliminan la necesidad de una gestión de procesos adecuada.
La base de datos es un componente crítico en toda empresa. No es el único componente vital, pero en muchas organizaciones la ausencia de una base de datos en funcionamiento representa un riesgo con un impacto enorme en la capacidad operativa del negocio.
Con el tiempo, todos los productos incluyen deprecaciones de funciones y de sintaxis, notificaciones de fin de vida y parches de seguridad. Estos cambios exigen un mantenimiento continuo de la infraestructura que da soporte a tus aplicaciones. Las actualizaciones de producto llegan en forma de actualizaciones menores y actualizaciones mayores. Trata ambos tipos como equivalentes en cuanto al riesgo para el negocio.
Una actualización menor sin probar puede tirar abajo tu sistema en producción.
El método de actualización por defecto del servicio gestionado
Muchos servicios de distintos proveedores de nube ofrecen herramientas y automatización para gestionar tareas repetitivas y rutinarias, incluidas las actualizaciones de versión menor.
El siguiente es un ejemplo con AWS RDS. Cuando creas una nueva base de datos desde la AWS Console, se te presentan varias docenas de opciones de configuración, pero no todas. Selecciona Additional Configuration al final de la página para ver todas las opciones disponibles.

Tienes que desplazarte hasta el final de esta página adicional para encontrar la sección Maintenance, donde la opción "Enable auto minor version upgrade" viene activada por defecto.

Los problemas de este enfoque del servicio gestionado
Hay varios problemas fundamentales al usar esta configuración por defecto:
- Las actualizaciones menores se aplican durante la ventana de mantenimiento semanal a discreción de AWS. Puede que no ocurran automáticamente en la próxima ventana, y pueden pasar varias semanas antes de que sucedan.
- AWS no distingue entre un entorno de prueba y uno de producción. Si tienes varios entornos configurados para actualizarse de forma automática, podrían hacerlo todos esa semana, o solo algunos.
- AWS no respeta las versiones de soporte a largo plazo (LTS) frente a las actualizaciones de versión menor. La documentación de AWS RDS incluso indica: "Recomendamos no establecer el parámetro AutoMinorVersionUpgrade en true para versiones LTS. Hacerlo podría provocar que tu clúster de base de datos se actualice a una versión no LTS".
- Cuando se aplica una actualización menor, AWS RDS no crea un punto de recuperación que te permita revertir si surge algún problema posterior. Aunque puedes usar la capacidad de restaurar la base de datos a un punto en el tiempo, esto no revierte la versión actualizada que se está ejecutando a la versión previa al restaurarla.
- Las ventanas de mantenimiento suelen programarse en horarios de bajo uso para tu sistema y, por lo general, coinciden con la mínima disponibilidad de recursos técnicos. El tiempo de ejecución de una actualización no planificada dentro de la ventana de mantenimiento probablemente aumentará el tiempo total de inactividad.
Las versiones menores no se aplican automáticamente en la siguiente ventana de mantenimiento.
Una actualización de versión menor es tan importante como un nuevo lanzamiento de producto interno. Cuando la mayoría de tus recursos técnicos no están disponibles, ¿desplegarías de forma automática a producción un nuevo lanzamiento interno sin probar?
La mejor práctica para las actualizaciones de versión menor
Es muy simple: probar y verificar.
Si bien "Enable auto minor version upgrade" es una funcionalidad útil que reduce la dependencia del mantenimiento regular, fomenta el desconocimiento sobre el control de la ejecución y de las opciones de recuperación. La base de datos suele ser un componente crítico del stack tecnológico. Requiere monitoreo, gestión y mantenimiento constantes, igual que cualquier otro componente crítico del sistema.
El despliegue de una nueva versión menor en cualquier entorno debe seguir un proceso controlado y documentado. Esto implica avanzar progresivamente por los distintos entornos hacia producción, por ejemplo: dev, test, stage y prod. Una actualización debe ejecutarse con automatización y ser supervisada por una persona, incluso cuando hay cientos o miles de servidores de bases de datos. Las actualizaciones deben hacerse cuando los recursos estén disponibles en línea, incluidos los recursos de operaciones que gestionan la infraestructura y los Engineers que puedan reaccionar si una operación inesperada o no probada provoca un incidente.
Los pasos concretos del proceso de actualización son específicos de cada organización. Este proceso siempre debe incluir un snapshot "previo" a la actualización. Por lo general, los lanzamientos a las versiones de producción solo deben hacerse después de un tiempo prudencial, por ejemplo, una o varias semanas tras haberse lanzado y verificado en otros entornos.
Una base de datos en producción nunca debe tener una versión más reciente que cualquier base de datos utilizada en un ciclo de pruebas de release.
No es recomendable operar tu base de datos con la versión puntual más antigua. Eso convierte a una actualización de versión menor en un elemento de ruta crítica, y AWS no proporciona un calendario de deprecación y eliminación. Por lo general, tampoco operarías con la versión puntual más reciente: la comunidad puede no haber detectado todavía los problemas introducidos en el último lanzamiento, y los recursos en línea para ayudar con el diagnóstico pueden ser limitados.
Como mejor práctica, debes desplegar cada versión puntual en un momento apropiado para el negocio y no combinar varias versiones menores en una misma actualización. Puede que sea necesario actualizar a la versión más reciente debido a un bug conocido corregido en una nueva versión, en cuyo caso no tendrás más opción que probar, verificar y actualizar fuera de una política de negocio conocida y documentada.
En resumen, SIEMPRE debes ser proactivo.
Identificar las actualizaciones de versión menor
En los últimos meses, AWS ha introducido una nueva funcionalidad que expone sus recomendaciones a través del AWS CLI y la Console. Hasta ahora, determinar la disponibilidad de nuevas versiones requería un proceso más complicado: revisar los Release Notes, hacer seguimiento de las nuevas versiones disponibles o monitorear eventos de otros entornos que pudieran tener esta funcionalidad habilitada.
Ahora puedes obtener esta información con el comando describe-db-recommendations. NOTA: está disponible a partir de la versión 2.15.3 del CLI. Tienes que leer el changelog línea por línea para detectar esta actualización reciente. Si no actualizas tu CLI con frecuencia, necesitarás una versión más nueva para usar este comando.
Salida de describe-db-recommendations
$ aws rds describe-db-recommendations
{
"RecommendationId": "",
"TypeId": "config_recommendation::old_minor_version",
"Severity": "informational",
"ResourceArn": "arn:aws:rds:region:123456789:cluster:mydb",
"Status": "active",
"Detection": "**[resource-name]** is not running the latest minor DB engine version",
"Recommendation": "Upgrade to latest engine version",
"Description": "Your database resources aren't running the latest minor DB engine version. The latest minor version contains the latest security fixes and other improvements.",
"RecommendedActions": [\
{\
"ActionId": "",\
"Operation": "modifyDbCluster",\
"Parameters": [\
{\
"Key": "EngineVersion",\
"Value": "8.0.mysql_aurora.3.04.2"\
},\
{\
"Key": "DBClusterIdentifier",\
"Value": "mydb"\
}\
],\
"ApplyModes": [\
"immediately",\
"next-maintenance-window"\
],\
"Status": "ready",\
"ContextAttributes": [\
{\
"Key": "Recommended value",\
"Value": "8.0.mysql_aurora.3.04.2"\
},\
{\
"Key": "Current engine version",\
"Value": "8.0.mysql_aurora.3.04.1"\
}\
]\
}\
```\
### Salida de la AWS Console\
Desde la AWS Console, en el servicio RDS, verás Recommendations destacadas en el menú lateral izquierdo. Por ejemplo:\
\
### **Lista de recomendaciones de RDS**\
Desde la lista de recomendaciones, verás el listado de servidores con la recomendación "is not running the latest monitor DB engine version".\
\
### Más información sobre una recomendación específica\
También puedes obtener más detalles de la recomendación para examinar la configuración completa del recurso y sus referencias a la documentación aplicable.\
\
Comentarios finales\
Combinar este conocimiento con un trabajo programado regularmente para capturar y compartir estas notificaciones te permitirá prepararte para una actualización de versión menor recomendada. Sumar validaciones adicionales y pasos de recuperación preparados, ajustados a los requisitos y recursos de tu negocio, aumentará enormemente la confianza de que no habrá impacto en producción durante las actualizaciones de versión menor.\