Despliegue EC2/On-Premises de AWS CodeDeploy - Diseño de AppSpec y hooks de ciclo de vida

Defina declarativamente las rutas de destino de despliegue y los hooks de ciclo de vida con el archivo AppSpec. Presentamos la gestión de flotas con grupos de despliegue basados en etiquetas e integración con Auto Scaling.

Estructura del archivo AppSpec

El archivo AppSpec (appspec.yml) para despliegues EC2/On-Premises define las rutas de destino de los archivos fuente en la seccion files, configura el propietario y permisos de archivos en la seccion permissions, y especifica los scripts a ejecutar en cada etapa del ciclo de vida en la seccion hooks. En la seccion files, source (ruta dentro de la revision) y destination (ruta en la instancia) se emparejan para especificar donde se despliegan los archivos. La seccion permissions establece el propietario, grupo y modo de los archivos desplegados. El campo version es fijo en 0.0 y esta reservado por AWS para futuras extensiones. El archivo AppSpec debe colocarse en el directorio raiz de la revision; omitirlo es una causa frecuente de fallo de despliegue. Cuando se especifica un directorio como destination en la seccion files, la estructura del directorio fuente se replica tal cual. Para despliegues de un solo archivo, especificar el nombre del archivo tanto en source como en destination permite despliegues con renombramiento.

Uso de hooks de ciclo de vida

Los hooks de ciclo de vida son scripts que se ejecutan en cada etapa del despliegue. BeforeInstall se ejecuta antes del despliegue de archivos y se usa para limpiar versiones antiguas o instalar paquetes de dependencias. AfterInstall se ejecuta despues del despliegue de archivos y se usa para generar archivos de configuracion o ejecutar migraciones de base de datos. ApplicationStart ejecuta el script de inicio de la aplicacion. ValidateService ejecuta verificaciones de salud posteriores al despliegue para confirmar que la aplicacion funciona correctamente. Si ValidateService falla, el despliegue se registra como fallido y, si esta configurado el rollback automatico, se revierte a la version anterior. Cada hook tiene un timeout configurable (predeterminado 3600 segundos), y es comun extenderlo para procesos de migracion de larga duracion. ApplicationStop se usa para detener la version anterior, pero no se ejecuta durante el primer despliegue ya que no existe version previa. Las variables de entorno DEPLOYMENT_ID y DEPLOYMENT_GROUP_NAME estan disponibles dentro de los hooks, permitiendo comportamiento condicional por despliegue.

Grupos de despliegue y gestion de flotas

Los grupos de despliegue son la unidad para agrupar las instancias objetivo del despliegue. Es posible la especificacion dinamica con filtros de etiquetas, como seleccionar instancias con Environment:Production y Role:WebServer. La integracion con grupos de Auto Scaling despliega automaticamente la ultima revision en instancias recien lanzadas durante el scale-out. La configuracion de despliegue especifica el numero minimo de hosts saludables, asegurando que un cierto numero de instancias permanezcan en servicio durante el despliegue. OneAtATime actualiza una instancia a la vez, HalfAtATime actualiza la mitad simultaneamente. Para una comprension mas profunda de las practicas de despliegue en EC2, consulte libros en Amazon.

Mejores practicas de diseno y trampas comunes

Los scripts de hooks en AppSpec deben disenarse para ser idempotentes. Dado que el mismo script puede ejecutarse multiples veces tras un reintento o rollback de despliegue fallido, los scripts no deben fallar al detener un servicio ya detenido o al crear un directorio ya existente. En los hooks ValidateService, incorporar esperas de calentamiento o logica de reintento ademas de verificaciones HTTP de salud previene fallos de despliegue causados por fallos transitorios durante el inicio. Con grupos de despliegue basados en etiquetas, la reasignacion accidental de etiquetas puede causar despliegues en instancias no deseadas. Se recomienda agregar un paso de aprobacion en CodePipeline para revisar la lista de instancias objetivo antes del despliegue. Al integrar con Auto Scaling, si el despliegue falla en una instancia recien lanzada, Auto Scaling puede marcarla como no saludable y terminarla, creando un bucle infinito. Para prevenirlo, configure hooks de ciclo de vida de EC2 Auto Scaling para esperar la finalizacion del despliegue antes de transicionar a InService.

Integracion con CodePipeline y estrategia de rollback

Combinar con CodePipeline automatiza el flujo de trabajo completo desde la deteccion de cambios en el codigo fuente hasta la construccion, pruebas y despliegue. Insertar acciones de aprobacion manual entre las etapas del pipeline proporciona una puerta de revision antes de los despliegues en produccion. La capacidad de rollback de CodeDeploy es un mecanismo critico para la seguridad del despliegue: cuando los hooks ValidateService o las verificaciones de salud fallan durante el despliegue, revierte automaticamente a la version anterior. La integracion con CloudWatch Alarms permite activar rollbacks cuando las tasas de error post-despliegue aumentan o la latencia crece. Con despliegues Blue/Green, configurar la retencion del entorno antiguo por un periodo determinado garantiza un rollback inmediato cuando se descubren problemas. Los logs de despliegue se envian automaticamente a CloudWatch Logs, sirviendo como datos para analisis de fallos y mejora del rendimiento.

Comparacion de CodeDeploy con otros metodos de despliegue

Las opciones de despliegue para EC2 incluyen CodeDeploy, Systems Manager Run Command, herramientas de gestion de configuracion (Ansible/Chef) y contenedorizacion (ECS/EKS). CodeDeploy utiliza despliegues pull basados en agente, eliminando la necesidad de acceso SSH o modificaciones de grupos de seguridad. Systems Manager Run Command es adecuado para ejecucion de comandos ad-hoc pero requiere implementacion personalizada para rollback y control por etapas. Ansible/Chef sobresalen en idempotencia de gestion de configuracion pero carecen de gestion de progreso de despliegue nativa de AWS (hosts minimos saludables, rollback automatico). La contenedorizacion es ideal para infraestructura inmutable pero tiene altos costos de migracion para aplicaciones legacy. Para cargas de trabajo existentes en EC2/on-premises, CodeDeploy ofrece la adopcion incremental de menor costo. La capacidad de incluir servidores on-premises como objetivos de despliegue es una fortaleza unica de CodeDeploy, siendo la unica opcion nativa de AWS para construir un pipeline de despliegue unificado en entornos hibridos.

Precios de CodeDeploy

Los despliegues EC2/On-Premises de CodeDeploy son gratuitos. No hay cargos adicionales por despliegues en instancias EC2. Los despliegues en servidores on-premises cuestan aproximadamente 0.02 USD por instancia por despliegue. Los despliegues en ECS y Lambda tambien son gratuitos. El costo de CodeDeploy en si es practicamente cero, lo que reduce la barrera de entrada para introducirlo como etapa de despliegue en un pipeline CI/CD. Sin embargo, el almacenamiento en S3 para revisiones, las tarifas de CodePipeline (aproximadamente 1 USD por pipeline al mes) para activadores de despliegue y las tarifas de SNS para notificaciones se facturan por separado. Para flotas grandes (cientos de instancias o mas), el cargo por despliegue para despliegues on-premises se vuelve significativo, por lo que debe estimar costos basandose en el producto del conteo mensual de despliegues y el numero de instancias.

Resumen

Los despliegues EC2/On-Premises de CodeDeploy definen declarativamente el proceso de despliegue con archivos AppSpec y hooks de ciclo de vida. Los grupos de despliegue basados en etiquetas se adaptan a flotas dinamicas, y el numero minimo de hosts saludables garantiza la disponibilidad durante el despliegue. Como los servidores on-premises tambien pueden incluirse como objetivo, es efectivo para la gestion unificada de despliegues en entornos hibridos. Al garantizar el diseno idempotente de scripts y la coordinacion adecuada con los hooks de ciclo de vida de Auto Scaling, se logran despliegues estables sin tiempo de inactividad.