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:

Contenido
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