Crear una canalización de CI/CD para validar las configuraciones de Terraform mediante AWS CodePipeline
Aromal Raj Jayarajan y Vijesh Vijayakumaran Nair, Amazon Web Services
Resumen
Aviso: AWS CodeCommit ya no está disponible para los nuevos clientes. Los clientes existentes de AWS CodeCommit pueden seguir utilizando el servicio con normalidad. Más información
Este patrón muestra cómo probar las configuraciones de HashiCorp Terraform mediante una canalización de integración y entrega continuas (CI/CD) implementada por AWS CodePipeline.
Terraform es una aplicación de interfaz de la línea de comandos que le ayuda a usar código para aprovisionar y administrar la infraestructura y los recursos de la nube. La solución proporcionada en este patrón crea una canalización de CI/CD que le ayuda a validar la integridad de sus configuraciones de Terraform mediante la ejecución de cinco etapas de CodePipeline:
"checkout"extrae la configuración de Terraform que está probando de un repositorio de AWS CodeCommit."validate"ejecuta herramientas de validación de infraestructura como código (IaC), como tfsec, TFLint y checkov . La etapa también ejecuta los siguientes comandos de validación de Terraform IaC: terraform validateyterraform fmt."plan"muestra qué cambios se aplicarán a la infraestructura si se aplica la configuración de Terraform."apply"utiliza el plan generado para aprovisionar la infraestructura requerida en un entorno de prueba."destroy"elimina la infraestructura de prueba que se creó durante la"apply"etapa.
Requisitos previos y limitaciones
Requisitos previos
Una cuenta de AWS activa
Interfaz de la línea de comandos de AWS (AWS CLI) instalada y configurada
Git
, instalado y configurado en su equipo local Terraform
, instalado y configurado en su equipo local
Limitaciones
El enfoque de este patrón implementa AWS CodePipeline en una sola cuenta de AWS y solo en una región de AWS. Se requieren cambios de configuración para las implementaciones de varias cuentas y regiones.
El rol de AWS Identity and Access Management (IAM) que proporciona este patrón (codepipeline_iam_role) sigue el principio de privilegio mínimo. Los permisos de este rol de IAM deben actualizarse en función de los recursos específicos que necesite crear su canalización.
Versiones de producto
Versión de AWS CLI 2.9.15 o posterior
Versión de Terraform 1.3.7 o posterior
Arquitectura
Pila de tecnología de destino
AWS CodePipeline
AWS CodeBuild
AWS CodeCommit
AWS IAM
Amazon Simple Storage Service (Amazon S3)
AWS Key Management Service ( AWS KMS)
Terraform
Arquitectura de destino
El siguiente diagrama muestra un ejemplo de flujo de trabajo de canalización de CI/CD para probar las configuraciones de Terraform en CodePipeline.

En el diagrama, se muestra el siguiente flujo de trabajo:
En CodePipeline, un usuario de AWS inicia las acciones propuestas en un plan de Terraform ejecutando el comando
terraform applyen la CLI de AWS.AWS CodePipeline asume una función de servicio de IAM que incluye las políticas necesarias para acceder a CodeCommit, CodeBuild, AWS KMS y Amazon S3.
CodePipeline ejecuta la etapa de canalización
"checkout"para extraer la configuración de Terraform de un repositorio de AWS CodeCommit para probarla.CodePipeline ejecuta el escenario
"validate"para probar la configuración de Terraform ejecutando las herramientas de validación de IaC y los comandos de validación de Terraform IaC en un proyecto de CodeBuild.CodePipeline ejecuta la etapa
"plan"para crear un plan en el proyecto CodeBuild basado en la configuración de Terraform. El usuario de AWS puede revisar este plan antes de aplicar los cambios al entorno de prueba.Code Pipeline ejecuta la etapa
"apply"de implementación del plan mediante el proyecto CodeBuild para aprovisionar la infraestructura requerida en el entorno de prueba.CodePipeline ejecuta la etapa
"destroy", que usa CodeBuild para eliminar la infraestructura de prueba que se creó durante la etapa."apply"Un bucket de Amazon S3 almacena los artefactos de la canalización, que se cifran y descifran mediante una clave administrada por el cliente de AWS KMS.
Herramientas
Herramientas
Servicios de AWS
AWS CodePipeline lo ayuda a diseñar y configurar rápidamente las diferentes etapas de un proceso de lanzamiento de software y automatiza los pasos necesarios para lanzar los cambios en el software de manera continua.
AWS CodeBuild es un servicio de compilación completamente administrado que le ayuda a compilar código fuente, ejecutar pruebas unitarias y producir artefactos listos para implementar.
AWS CodeCommit es un servicio de control de versiones que permite almacenar y administrar repositorios de Git de forma privada, sin necesidad de administrar su propio sistema de control de origen.
AWS Identity and Access Management (IAM) le permite administrar de forma segura el acceso a los recursos de AWS mediante el control de quién está autenticado y autorizado a utilizarlos.
AWS Key Management Service (AWS KMS) facilita poder crear y controlar claves criptográficas para proteger los datos.
Amazon Simple Storage Service (Amazon S3) es un servicio de almacenamiento de objetos basado en la nube que lo ayuda a almacenar, proteger y recuperar cualquier cantidad de datos.
Otros servicios
HashiCorp Terraform
es una aplicación de interfaz de la línea de comandos que le ayuda a usar código para aprovisionar y administrar la infraestructura y los recursos de la nube.
Código
El código de este patrón está disponible en el repositorio aws-codepipeline-terraform-cicdsamples
Epics
| Tarea | Descripción | Habilidades requeridas |
|---|---|---|
Clone el repositorio de GitHub. | Clone el repositorio de GitHub aws-codepipeline-terraform-cicdsamples
Para obtener más información, consulte Clonación de un repositorio | Ingeniero de DevOps |
Cree un archivo de definiciones de variables de Terraform. | Cree un archivo Para obtener más información, consulte Asignación de valores a las variables del módulo raíz notaEl archivo | Ingeniero de DevOps |
Configure AWS como proveedor de Terraform. |
Para obtener más información, consulte AWS provider | Ingeniero de DevOps |
Actualice la configuración del proveedor de Terraform para crear el bucket de replicación de Amazon S3. |
notaLa replicación activa la copia de objetos entre buckets de Amazon S3 de forma automática y asincrónica. | Ingeniero de DevOps |
Inicialice la configuración de Terraform. | Para inicializar el directorio de trabajo que contiene los archivos de configuración de Terraform, ejecute el siguiente comando en la carpeta raíz del repositorio clonado:
| Ingeniero de DevOps |
Crear el plan Terraform. | Para crear un plan de Terraform, ejecuta el siguiente comando en la carpeta raíz del repositorio clonado:
notaTerraform evalúa los archivos de configuración para determinar el estado objetivo de los recursos declarados. A continuación, compara el estado objetivo con el estado actual y crea un plan. | Ingeniero de DevOps |
Verifique el plan de Terraform. | Revise el plan Terraform y confirme que configura la arquitectura requerida en su cuenta de AWS de destino. | Ingeniero de DevOps |
Implemente la solución. |
notaTerraform crea, actualiza o destruye la infraestructura para alcanzar el estado objetivo declarado en los archivos de configuración. | Ingeniero de DevOps |
| Tarea | Descripción | Habilidades requeridas |
|---|---|---|
Configurar el repositorio de código fuente. |
| Ingeniero de DevOps |
Valide las etapas de la canalización. |
Para obtener más información, consulte Ver los detalles y el historial de la canalización (consola) en la Guía del usuario de AWS CodePipeline. importanteCuando se confirma un cambio en la ramificación principal del repositorio de origen, la canalización de pruebas se activa automáticamente. | Ingeniero de DevOps |
Verifique el resultado del informe. |
notaEl proyecto de CodeBuild | Ingeniero de DevOps |
| Tarea | Descripción | Habilidades requeridas |
|---|---|---|
Limpie la canalización y los recursos asociados. | Para eliminar los recursos de prueba de su cuenta de AWS, ejecute el siguiente comando en la carpeta raíz del repositorio clonado:
| Ingeniero de DevOps |
Solución de problemas
| Problema | Solución |
|---|---|
Recibe un mensaje de error AccessDenied durante la etapa |
|
Recursos relacionados
Bloques de módulos
(documentación de Terraform) Cómo usar la CI/CD para implementar y configurar los servicios de seguridad de AWS con Terraform
(entrada en el blog de AWS) Uso de roles vinculados a servicios (documentación de IAM)
create-pipeline
(documentación de AWS CLI) Configuración del cifrado del servidor para los artefactos almacenados en Amazon S3 para CodePipeline (documentación de AWS CodePipeline)
Cuotas de AWS CodeBuild (documentación de AWS CodeBuild)
Protección de datos en AWS CodePipeline (documentación de AWS CodePipeline)
Información adicional
Módulos Terraform personalizados
La siguiente es una lista de los módulos personalizados de Terraform que se utilizan en este patrón:
codebuild_terraformcrea los proyectos de CodeBuild que forman cada etapa de la canalización.codecommit_infrastructure_source_repocaptura y crea el repositorio CodeCommit de origen.codepipeline_iam_rolecrea las funciones de IAM necesarias para la canalización.codepipeline_kmscrea la clave de AWS KMS necesaria para el cifrado y descifrado de objetos de Amazon S3.codepipeline_terraformcrea la canalización de pruebas para el repositorio fuente de CodeCommit.s3_artifacts_bucketcrea un bucket de Amazon S3 para administrar los artefactos de canalización.
Cree archivos de especificaciones
La siguiente es una lista de los archivos de especificaciones de compilación (buildspec) que este patrón utiliza para ejecutar cada etapa de la canalización:
buildspec_validate.ymlejecuta la etapa"validate".buildspec_plan.ymlejecuta la etapa"plan".buildspec_apply.ymlejecuta la etapa"apply".buildspec_destroy.ymlejecuta la etapa"destroy".
Cree variables del archivo de especificaciones
Cada archivo de especificaciones de compilación utiliza las siguientes variables para activar diferentes ajustes específicos de la compilación:
Variable | Valor predeterminado | Descripción |
|---|---|---|
| "." | Define el directorio CodeCommit de origen |
| «1.3.7» | Define la versión de Terraform para el entorno de compilación |
El archivo buildspec_validate.ymltambién admite las siguientes variables para activar diferentes ajustes específicos de la compilación:
Variable | Valor predeterminado | Descripción |
|---|---|---|
| »./templates/scripts» | Define el directorio de scripts |
| «dev» | Define el nombre del entorno |
| «Y» | Omite la validación en caso de errores |
| «Y» | Activa la validación de Terraform |
| «Y» | Activa el formato Terraform |
| «Y» | Activa el análisis de checkov |
| «Y» | Activa el análisis de TFSec |
| «v1.28.1» | Define la versión tfsec |