CI/CD en AWS

CI/CD se basa en que los desarrolladores puedan integrar nuevos desarrollos de código en el producto final, y que se puedan realizar los despliegues tan a menudo como sea necesario, todo ello de forma automatizada y solo con intervención manual cuando realmente se quiera.

Estos son los elementos necesarios para utilizar Continuous Integration y Continuous Delivery sobre AWS:

CodeCommit

Es el sistema de control de versiones de AWS, alternativa a conocido GitHub, BitBucket,…

Algunas de sus características:

  • Repositorios privados de Git
  • No límite de tamaño de ficheros en repositorio
  • Totalmente gestionado, alta disponibilidad
  • Seguridad integrada con la cuenta AWS, además de cifrado, control de acceso, …
  • Se integra con Jenkins, CodeBuild u otras herramientas de CI

Seguridad

Autenticación en Git:

  • Claves SSH, de la manera habitual
  • HTTPS, a través de AWS CLI Authentication o credenciales HTTPS
  • MFA disponible

Autorización en Git:

  • A través de IAM Policies / Roles

Cifrado:

  • Los repositorios se cifran automáticamente usando KMS
  • Cifrado en tránsito (HTTPS o SSH)

Cross Account Access:

  • A través de Roles IAM y utilizando AWS STS (AssumeRole API)
  • Nunca se comparten claves SSH, ni credenciales AWS

Notificaciones

CodeCommit se integra con AWS SNS, AWS Lambda o eventos AWS CloudWatch.

Se pueden utilizar las notificaciones en SNS/Lambda en las siguientes situaciones:

  • Borrado de un branch
  • Push en la master branch
  • Notificar a un Build System externo
  • Ejecutar un análisis de código mediante Lambda

Los casos de uso de CloudWatch Event Rules son:

  • Evento para los pull request updates (created / updated / deleted / commented )
  • Eventos de comentarios en commits
  • Los eventos de CloudWatch van a un topic SNS

CodePipeline

Herramienta para Continuous Delivery, es un Workflow visual.

  • El origen puede ser GitHub, CodeCommit, S3
  • El Build sería CodeBuild, Jenkins, …
  • Las herramientas de Testing tendrían que ser de terceros
  • El Deploy sería con CodeDeploy, Beanstalk, CloudFormation, …

Se hace por etapas:

  • Cada etapa puede tener acciones secuencias y/o en paralelo
  • Se puede definir una aprobación manual en cualquier etapa
  • Cada etapa puede crear «artifacts», que son salida de una etapa y entrada de la siguiente

Los cambios de estado en CodePipeline generan eventos AWS CloudWatch, y éstos pueden generar notificaciones SNS (ej: cuando falla o se cancela un pipeline)

Si el Pipeline no puede realizar una acción, hay que revisar que el rol IAM tiene suficientes permisos.

CodeBuild

Se encarga de construir y testear el software, equivalente a Jenkins.

Es un servicio totalmente gestionado, y escala bajo demanda. Solo se paga el tiempo que tarda en completar el build, y se integra con Docker para ampliar algunas funciones.

Seguridad: se integra con KMS para cifrado de artefactos, con IAM para permisos, con VPC para la seguridad de la red, con CloudTrail para las llamadas a la API.

¿Cómo funciona?

  • Origen: el código fuente puede estar en GitHub, CodeCommit, CodePipeline, S3, …
  • Las instrucciones para el guild pueden estar definidas en código: buildspec.yml
  • Almacena logs en Amazon S3 y AWS CloudWatch Logs
  • Existen métricas para monitorizar las estadísticas de CodeBuild
  • Alarmas CloudWatch para detectar fallos y lanzar notificaciones
  • Notificaciones SNS, CloudWatch eventos o AWS Lambda
  • Se puede ejecutar CodeBuild en local para troubleshooting
  • Los build se pueden definir con CodePipeline o CodeBuild

CodeBuild BuildSpec

En el fichero buildspec.yml se define las instrucciones para el build, este fichero debe estar en el raíz del código fuente.

  • En el fichero se definen las variables de entorno
  • Las contraseñas se almacenan en SSM Parameter store

Las fases son:

  • Install: instala las dependencias
  • PreBuild
  • Build
  • PostBuild

Los artefactos generados se suben a S3, y los ficheros que se pueda necesitar reutilizar para futuros build, también se suben a S3.

Entornos soportados

  • Java
  • Ruby
  • Python
  • Go
  • Node.js
  • Android
  • .NET core
  • PHP
  • Docker

CodeDeploy

Se encarga de desplegar los artefactos generados en CodeBuild a la Infraestructura que corresponda (EC2, ECS, …)

Requisitos

  • Cada máquina EC2 debe tener en ejecución el agente de CodeDeploy
  • Este agente está continuamente consultando a CodeDeploy las acciones a realizar
  • CodeDeploy le envía el fichero appspec.yml
  • La aplicación se obtiene desde GitHub o S3
  • EC2 ejecuta las instrucciones del despliegue
  • El agente de CodeDeploy reporta Success/Failure del despliegue en esa instancia

Componentes

  • Aplicación: nombre único
  • Plataforma: EC2/On-Premise o Lambda
  • Configuración de desplegue: reglas para el despliegue
  • Deployment Group: grupos de instancias
  • Deployment Type: In-Place o Blue/green
  • IAM Instance Profile: EC2 debe tener permisos para obtener ficheros de S3 o GitHub
  • Revisión de aplicación: código de aplicación + fichero appspec.yml
  • ServiceRole: permisos necesarios de CodeDeploy
  • Target revision: desplegar la versión objetivo de la aplicación

CodeDeploy AppSpec

File Section: indica como copiar los ficheros de S3 o GitHub al filesystem

Hooks: conjunto de instrucciones para hacer el despliegue de la nueva versión, con el siguiente orden:

  • ApplicationStop
  • DownloadBundle
  • BeforeInstall
  • Install
  • AfterInstall
  • ApplicationStart
  • ValidateService

Configuración de despliegue

Modos de configuración de instancia:

  • One a time
  • Half at a time
  • All at once
  • Custom

Fallos de despliegue en instancia:

  • La instancia permanece en «failed state»
  • Los nuevos despliegues se realizan primero en instancias en «failed state»
  • Rollback: redeploy de la versión anterior

Target de los despliegues:

  • Conjunto de instancias EC2 con tags
  • Un ASG
  • Mezcla de ASG / Tags
  • Variable de entorno: DEPLOYMENT_GROUP_NAME

CodeStar

Es una solución integrada que agrupa: GitHub, CodeCommit, CodeBuild, CodeDeploy, CloudFormation, CodePipeline, CloudWatch.

  • Ayuda a crear de forma rápida proyectos CICD para EC2, Lambda y Beanstalk
  • Soporta: C#, Go, HTML 5, Java, Node.js, PHP, Python, Ruby
  • Integrado con gestión de issues con JIRA /GitHub
  • Se puede integrar con Cloud9 para un web IDE
  • Un dashboard unificado para todos los componentes
  • Servicio gratuito, solo se para por los otros servicios que integra
  • Personalización limitada

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.