Este repositorio contiene un template de pipeline para Azure DevOps diseñado para desplegar infraestructura en AWS utilizando Terraform. El pipeline implementa prácticas de CI/CD seguras y eficientes para la gestión de infraestructura como código.
Este diagrama muestra la arquitectura completa del flujo de despliegue de infraestructura como código (IaC). Ilustra cómo Azure DevOps orquesta el proceso de CI/CD, desde el repositorio de código hasta el despliegue en AWS. Se visualizan las diferentes etapas del pipeline (Prerequisites, Integration, Validation, Approval y Deploy), así como la interacción con los servicios de AWS como IAM para la gestión de roles, S3 para el almacenamiento del estado de Terraform y los recursos finales desplegados. También se muestra el flujo de aprobación y las notificaciones a los equipos involucrados.
Este diagrama detalla la integración técnica entre Azure DevOps y AWS. Muestra cómo el Service Connection de Azure DevOps se conecta con AWS, el proceso de asunción de roles (role assumption) para acceder a la cuenta de destino, y cómo Terraform utiliza estas credenciales para desplegar la infraestructura. Se visualiza el flujo de autenticación y autorización entre los diferentes componentes, incluyendo cómo el pipeline asume el rol de despliegue para crear y gestionar recursos en la cuenta AWS de destino. También ilustra la separación de responsabilidades y el principio de privilegio mínimo implementado en la arquitectura.
Este pipeline está diseñado para automatizar el despliegue de infraestructura en AWS siguiendo las mejores prácticas de DevOps e IaC. Proporciona un flujo de trabajo completo que incluye:
- Verificación de prerrequisitos
- Integración continua (CI)
- Validación de código
- Proceso de aprobación
- Despliegue continuo (CD)
El pipeline está estructurado en las siguientes etapas:
- Prerequisites: Verifica y configura los requisitos previos necesarios para el despliegue, como la creación del bucket S3 para el estado de Terraform.
- Integration (CI): Instala Terraform, configura el entorno y ejecuta análisis de seguridad con Checkov.
- Validation: Inicializa Terraform, valida la configuración y genera un plan de despliegue.
- Approval: Implementa un proceso de aprobación dual (CloudOps y Arquitectura) con notificaciones.
- Deploy (CD): Aplica los cambios de infraestructura utilizando Terraform.
Para utilizar este pipeline, necesitarás:
- Una cuenta de AWS con los permisos adecuados
- Un rol IAM en la cuenta de destino para el despliegue
- Una conexión de servicio de AWS configurada en Azure DevOps
- Variables de biblioteca configuradas en Azure DevOps
El pipeline utiliza las siguientes variables que deben configurarse en Azure DevOps:
| Variable | Descripción | Ejemplo |
|---|---|---|
| AWS_DEPLOY_ROLE | ARN del rol IAM para despliegue | arn:aws:iam::123456789012:role/TerraformDeployRole |
| AWS_REGION | Región AWS donde se desplegará la infraestructura | us-east-1 |
| AWS_SERVICE_CONNECTION | Nombre de la conexión de servicio de AWS en Azure DevOps | aws-service-connection |
| CLIENT | Identificador del cliente (máx. 5 caracteres) | pragma |
| ENVIRONMENT | Entorno de despliegue | dev, qa, prod |
| INFRASTRUCTURE | Identificador del componente de infraestructura | network, compute, storage |
| PROJECT | Identificador del proyecto | hefesto |
| TERRAFORM_VERSION | Versión de Terraform a utilizar | 1.5.7 |
| CODE_APP | Código de la aplicación (máx. 5 caracteres) | app01 |
| CLOUDOPSAPPROVERS | Correos electrónicos de los aprobadores de CloudOps | [email protected] |
| ARCHITECTUREAPPROVERS | Correos electrónicos de los aprobadores de Arquitectura | [email protected] |
.
├── terraform/
│ ├── iac-pipeline.yml # Pipeline principal
│ └── templates/
│ ├── prerequisites.yml # Etapa de prerrequisitos
│ ├── integration.yml # Etapa de integración
│ ├── validation.yml # Etapa de validación
│ ├── approval.yml # Etapa de aprobación
│ └── deploy.yml # Etapa de despliegue
├── environments/ # Configuraciones específicas por entorno
│ ├── dev/
│ │ ├── .env.yml # Variables de entorno para desarrollo
│ │ └── terraform.tfvars # Variables de Terraform para desarrollo
│ ├── qa/
│ │ ├── .env.yml # Variables de entorno para QA
│ │ └── terraform.tfvars # Variables de Terraform para QA
│ └── prod/
│ ├── .env.yml # Variables de entorno para producción
│ └── terraform.tfvars # Variables de Terraform para producción
├── azure-pipelines.yaml # Archivo de configuración del pipeline
├── main.tf # Configuración principal de Terraform
├── variables.tf # Definición de variables de Terraform
├── outputs.tf # Definición de salidas de Terraform
├── providers.tf # Configuración de proveedores de Terraform
└── README.md # Documentación del proyecto
Nota importante: La estructura de directorios
terraform/con el archivoiac-pipeline.ymly los templates puede estar en un repositorio separado y ser referenciada como un template en el archivoazure-pipelines.yamlde tu proyecto, como se muestra en el siguiente ejemplo:resources: repositories: - repository: templates type: git name: pragma-hefesto-template-idp/pragma-hefesto-template-iac-pipeline ref: refs/heads/main extends: template: terraform/iac-pipeline.yml@templates parameters: environmentName: $(ENVIRONMENT)Esta es la forma recomendada de utilizar este template, permitiendo la reutilización del pipeline en múltiples proyectos.
- Crea un nuevo repositorio en Azure DevOps
- Clona este template en tu repositorio
- Configura la estructura de directorios y archivos según tus necesidades
- Crea una biblioteca de variables en Azure DevOps para cada entorno (dev, qa, prod)
- Configura las variables requeridas en cada biblioteca
- Asegúrate de que las variables sensibles estén marcadas como secretas
- Crea un nuevo pipeline en Azure DevOps
- Configura el pipeline para usar el archivo
azure-pipelines.yamlde tu repositorio - Configura las conexiones de servicio necesarias
trigger:
branches:
include:
- main
- qa
- develop
paths:
exclude:
- README.md
- azure-pipelines.yaml
pool:
vmImage: 'ubuntu-latest'
variables:
- name: BRANCH_NAME
value: $[replace(variables['Build.SourceBranch'], 'refs/heads/', '')]
- ${{ if eq(variables['Build.SourceBranch'], 'refs/heads/main') }}:
- template: environments/prod/.env.yml
- ${{ elseif eq(variables['Build.SourceBranch'], 'refs/heads/qa') }}:
- template: environments/qa/.env.yml
- ${{ elseif eq(variables['Build.SourceBranch'], 'refs/heads/develop') }}:
- template: environments/dev/.env.yml
resources:
repositories:
- repository: templates
type: git
name: pragma-hefesto-template-idp/pragma-hefesto-template-iac-pipeline
ref: refs/heads/main
extends:
template: terraform/iac-pipeline.yml@templates
parameters:
environmentName: $(ENVIRONMENT)Esta etapa verifica y configura los requisitos previos necesarios para el despliegue:
- Instala AWS CLI
- Asume el rol de despliegue en la cuenta destino
- Verifica si existe el bucket S3 para el estado de Terraform
- Si no existe, crea el bucket con configuraciones de seguridad adecuadas
Esta etapa prepara el entorno y realiza análisis de seguridad:
- Instala Terraform en la versión especificada
- Configura las variables de entorno
- Instala y configura Checkov
- Ejecuta análisis de seguridad con Checkov
- Crea y publica artefactos para las siguientes etapas
Esta etapa valida la configuración de Terraform:
- Inicializa Terraform con la configuración de backend en S3
- Valida la sintaxis y estructura de los archivos de Terraform
- Genera un plan de despliegue
- Publica el plan como artefacto para revisión
Esta etapa implementa un proceso de aprobación dual:
- Envía notificaciones a Google Chat para solicitar aprobaciones
- Espera la aprobación del equipo de CloudOps
- Espera la aprobación del equipo de Arquitectura
- Continúa solo si ambas aprobaciones son concedidas
Esta etapa aplica los cambios de infraestructura:
- Inicializa Terraform con la configuración de backend en S3
- Aplica el plan de Terraform con auto-aprobación
- Separación de Entornos: Configuraciones específicas para cada entorno (dev, qa, prod)
- Gestión de Estado Remoto: Uso de S3 para almacenar el estado de Terraform
- Análisis de Seguridad: Integración con Checkov para detectar problemas de seguridad
- Proceso de Aprobación: Aprobación dual para cambios en infraestructura
- Asunción de Roles: Uso de roles IAM para el principio de privilegio mínimo
- Cifrado: Configuración automática de cifrado para el bucket S3
- Bloqueo de Acceso Público: Configuración automática de bloqueo de acceso público para el bucket S3
-
Error al asumir el rol:
- Verifica que el rol exista en la cuenta de destino
- Verifica que la conexión de servicio tenga permisos para asumir el rol
- Verifica la política de confianza del rol
-
Error al crear el bucket S3:
- Verifica que el nombre del bucket sea único globalmente
- Verifica que la región especificada sea válida
- Verifica que el rol tenga permisos para crear buckets S3
-
Error en la validación de Terraform:
- Verifica la sintaxis de los archivos de Terraform
- Verifica que las variables requeridas estén definidas
- Verifica que los proveedores estén configurados correctamente

