Automatizar el despliegue de un stack de CloudFormation desde CodeCommit con CodePipeline
Actualización: AWS dejó de ofrecer CodeCommit a nuevos clientes en julio de 2024. Mantengo este post como registro histórico del pipeline que construí; si estás empezando un proyecto nuevo hoy, plantéate usar CodePipeline con GitHub como etapa de origen en su lugar.
Una vez que tengo definida mi infraestructura como código para desplegarla en mi cuenta de AWS con plantillas de CloudFormation, desplegarla manualmente cada vez que necesito hacer un cambio puede ser una tarea lenta y propensa a errores. Automatizar el despliegue de un stack de CloudFormation desde CodeCommit con CodePipeline puede ahorrarte tiempo y esfuerzo, sobre todo cuando trabajas con varios entornos y haces cambios con frecuencia. Por eso voy a contarte cómo he implementado la automatización para actualizar mis stacks.
Cómo usar AWS CodeCommit para almacenar plantillas de AWS CloudFormation
AWS CodeCommit es un servicio de control de versiones totalmente gestionado que facilita a las empresas alojar repositorios Git privados, seguros y muy escalables. CodeCommit elimina la necesidad de operar tu propio sistema de control de versiones, así como de preocuparte por escalar su infraestructura. Se puede usar para almacenar de forma segura desde código fuente hasta binarios, y funciona sin fricciones con las herramientas Git que ya uses.
Para usar CodeCommit primero hay que crear un repositorio y subirle el código. Esto se puede hacer con la AWS CLI, la consola de AWS CodeCommit o un cliente Git. En este post voy a usar la consola de AWS CodeCommit para crear el repositorio y subir el código.
Una vez creado el repositorio y subidos los ficheros YAML, el siguiente paso es clonar el repositorio en mi ordenador local. La rama «master» del repositorio se usa para mantener el código que está implementado en producción. Los cambios que hago durante las fases de desarrollo de la nueva infraestructura los implemento en una rama separada llamada «dev». Una vez completados todos los cambios en la rama «dev», la fusiono con «master» para desplegar el código en producción.
Para obtener las credenciales de usuario de mi repositorio, hace falta activarlas desde la consola de IAM. Para clonar el repositorio, copio la URL de clonado HTTPS desde la página de detalles del repositorio y uso el siguiente comando:
git clone https://git-codecommit.region.amazonaws.com/v1/repos/RepositoryName
Cómo usar AWS CodePipeline para automatizar despliegues
AWS CodePipeline es un servicio de entrega continua totalmente gestionado que ayuda a automatizar los pipelines de release para actualizar aplicaciones e infraestructura de forma rápida y fiable. CodePipeline automatiza las fases de build, test y deploy de tu proceso de release cada vez que hay un cambio de código, según el modelo de release definido. Se puede usar CodePipeline para entregar funcionalidades y actualizaciones de forma rápida y fiable, construyendo, probando y desplegando el código automáticamente cada vez que hay un cambio.
Para automatizar este despliegue he implementado dos pipelines distintos. El primero toma como origen la rama dev del repositorio, y cada vez que se hace un commit nuevo en esa rama, el pipeline ejecuta una etapa de despliegue con CloudFormation que genera un nuevo Change Set para el Stack. Un Change Set es un conjunto de cambios propuestos para un stack de AWS CloudFormation: permite previsualizar los cambios del stack antes de aplicarlos, y ofrece una forma de modificar los recursos del stack creándolos, actualizándolos o eliminándolos. El Change Set enumera todos los cambios que se van a aplicar y permite revisarlos antes de aplicarlos al stack.
El segundo pipeline toma como origen la rama master del repositorio, y cada vez que se hace un commit nuevo en esa rama, ejecuta una etapa de despliegue con CloudFormation que actualiza el Stack.
Para que estos pipelines funcionen hace falta crear dos roles de IAM. Durante el proceso de creación del pipeline, AWS puede crear un rol nuevo con permisos suficientes para actuar en tu nombre, que asume AWS CodePipeline. Para la etapa de despliegue, hace falta indicar el ARN de un rol que asuma el servicio de AWS CloudFormation. En mi caso, creé el rol con permisos de administrador para que pueda desplegar cualquier infraestructura como código.
Eliminar artefactos de S3 con reglas de ciclo de vida
Al crear un pipeline, AWS CodePipeline guarda los artefactos en un bucket S3. Estos artefactos son los ficheros que se generan durante la ejecución del pipeline. Por defecto, se guardan en el bucket S3 durante 90 días. Para evitar costes innecesarios, hace falta eliminar estos artefactos pasado un periodo de tiempo. Para ello uso las reglas de ciclo de vida de S3. La siguiente regla elimina todos los artefactos del bucket S3 al cabo de 1 día.
Reglas de notificación del pipeline
AWS Pipeline admite reglas de notificación para ayudarte a estar informado del estado de tus pipelines y tomar las acciones oportunas según ese estado. Las reglas de notificación se configuran con Amazon CloudWatch Events y se pueden usar para disparar notificaciones por SNS y Slack. En mi caso, quiero recibir una notificación cuando falle un Change Set o el despliegue de un Stack. Creo un topic de SNS nuevo para suscribir mi correo electrónico y establezco el ARN de ese topic como destino de la regla de notificación.
Conclusión
En el mundo acelerado de hoy, la velocidad y la agilidad son esenciales para no quedarse atrás en un panorama tecnológico en constante evolución. Automatizar el despliegue de un stack de CloudFormation desde CodeCommit con CodePipeline agiliza notablemente el proceso de despliegue de infraestructura como código. AWS ofrece herramientas útiles, como las reglas de ciclo de vida de Amazon S3 y las reglas de notificación del pipeline, para optimizar aún más ese proceso. No solo ahorro tiempo y esfuerzo, sino que también reduzco el riesgo de error humano, aumento la eficiencia y mejoro la calidad general de mi infraestructura. Con esta automatización puedo centrarme en desarrollar e innovar en vez de preocuparme por procesos de despliegue manuales.
¡Gracias por leer! Nos vemos en el próximo.