Crear una canalización de CI/CD para validar las configuraciones de Terraform mediante AWS CodePipeline - Recomendaciones de AWS

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:

  1. "checkout" extrae la configuración de Terraform que está probando de un repositorio de AWS CodeCommit.

  2. "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 validate y terraform fmt.

  3. "plan" muestra qué cambios se aplicarán a la infraestructura si se aplica la configuración de Terraform.

  4. "apply" utiliza el plan generado para aprovisionar la infraestructura requerida en un entorno de prueba.

  5. "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.

Arquitectura para probar las configuraciones de Terraform mediante una canalización de CI/CD de AWS.

En el diagrama, se muestra el siguiente flujo de trabajo:

  1. En CodePipeline, un usuario de AWS inicia las acciones propuestas en un plan de Terraform ejecutando el comando terraform apply en la CLI de AWS.

  2. 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.

  3. CodePipeline ejecuta la etapa de canalización "checkout" para extraer la configuración de Terraform de un repositorio de AWS CodeCommit para probarla.

  4. 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.

  5. 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.

  6. 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.

  7. CodePipeline ejecuta la etapa "destroy", que usa CodeBuild para eliminar la infraestructura de prueba que se creó durante la etapa. "apply"

  8. 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 de GitHub. El repositorio contiene las configuraciones de Terraform necesarias para crear la arquitectura de destino descrita en este patrón.

Epics

TareaDescripciónHabilidades requeridas

Clone el repositorio de GitHub.

Clone el repositorio de GitHub aws-codepipeline-terraform-cicdsamples ejecutando el siguiente comando en una ventana del terminal:

git clone https://github.com/aws-samples/aws-codepipeline-terraform-cicd-samples.git

Para obtener más información, consulte Clonación de un repositorio en la documentación de GitHub.

Ingeniero de DevOps

Cree un archivo de definiciones de variables de Terraform.

Cree un archivo terraform.tfvars en función de los requisitos del caso de uso. Puede actualizar las variables del archivo examples/terraform.tfvars que se encuentra en el repositorio clonado.

Para obtener más información, consulte Asignación de valores a las variables del módulo raíz en la documentación de Terraform.

nota

El archivo Readme.md del repositorio incluye más información sobre las variables obligatorias.

Ingeniero de DevOps

Configure AWS como proveedor de Terraform.

  1. En un editor de código, abra el archivo main.tf del repositorio clonado.

  2. Añada las configuraciones necesarias para establecer la conectividad con la cuenta de AWS de destino.

Para obtener más información, consulte AWS provider en la documentación de Terraform.

Ingeniero de DevOps

Actualice la configuración del proveedor de Terraform para crear el bucket de replicación de Amazon S3.

  1. Ejecute el siguiente comando para abrir el directorio S3 del repositorio:

    cd ./modules/s3
  2. Actualice la configuración del proveedor de Terraform para crear el depósito de replicación de Amazon S3 actualizando el valor region en del archivo tf. Asegúrese de introducir la región en la que desea que Amazon S3 replique los objetos.

  3. (Opcional) De forma predeterminada, Terraform usa archivos estatales locales para la administración estatal. Si desea añadir Amazon S3 como backend remoto, debe actualizar la configuración de Terraform. Para obtener más información, consulte Configuración de backend en la documentación de Terraform.

nota

La 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:

terraform init
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:

terraform plan --var-file=terraform.tfvars -out=tfplan
nota

Terraform 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.

  1. Para aplicar el plan Terraform, ejecute el siguiente comando en la carpeta raíz del repositorio clonado:

    terraform apply "tfplan"
  2. Escriba para confirmar que desea implementar los recursos.

nota

Terraform crea, actualiza o destruye la infraestructura para alcanzar el estado objetivo declarado en los archivos de configuración.

Ingeniero de DevOps
TareaDescripciónHabilidades requeridas

Configurar el repositorio de código fuente.

  1. De la salida de Terraform, obtenga los detalles del repositorio de origen del repositorio que contiene las configuraciones de Terraform que desea validar.

  2. Inicie sesión en la Consola de administración de AWS. A continuación, abra la consola CodeCommit.

  3. Cree una nueva rama en el repositorio de origen denominado main. Para obtener instrucciones, consulte Crear una rama en AWS CodeCommit en la documentación de CodeCommit.

  4. Clone la rama main del repositorio de origen en su estación de trabajo local. Para obtener instrucciones, consulte los pasos de configuración de las conexiones HTTPS a los repositorios de AWS CodeCommit en Windows con el ayudante de credenciales de la CLI de AWS en la documentación de CodeCommit.

  5. Copie la carpeta templatesdel repositorio de GitHub aws-codepipeline-terraform-cicdsamples ejecutando el siguiente comando:

    cp -r templates $YOUR_CODECOMMIT_REPO_ROOT
    nota

    La carpeta templates contiene los archivos de especificaciones de compilación y el script de validación del directorio raíz del repositorio de origen.

  6. Añada las configuraciones de Terraform iAC necesarias a la carpeta raíz del repositorio de origen.

  7. Agñada los detalles del backend remoto en la configuración de Terraform de su proyecto. Para obtener más información, consulte S3 en la documentación de Terraform.

  8. (Opcional) Actualice las variables de la carpeta templates para activar o desactivar los escaneos preconfigurados, cambiar las versiones de las herramientas y especificar su directorio en archivos de script personalizados. Para obtener más información, consulte la sección Información adicional de este patrón.

  9. Envía los cambios a la rama main del repositorio de origen.

Ingeniero de DevOps

Valide las etapas de la canalización.

  1. Inicie sesión en la consola de administración de AWS y abra la Consola de CodePipeline.

  2. En el resultado generado por el comando terraform apply "tfplan" de la sección anterior de Epic, busque el nombre de la CodePipeline generado.

  3. Abre la canalización en la consola de CodePipeline y seleccione Liberar cambio.

  4. Revise cada etapa de la canalización y confirma que funciona según lo esperado.

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.

importante

Cuando 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.

  1. En la consola de CodePipeline, en el panel de navegación de la izquierda, seleccione Crear. A continuación, seleccione Historial de informes.

  2. Revise los informes de escaneo tfsec y checkov que genera la canalización. Estos informes pueden ayudarle a identificar problemas mediante visualizaciones y representaciones gráficas.

nota

El proyecto de CodeBuild <project_name>-validate genera informes de vulnerabilidad para su código durante la etapa "validate".

Ingeniero de DevOps
TareaDescripciónHabilidades 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:

terraform destroy --var-file=terraform.tfvars
Ingeniero de DevOps

Solución de problemas

ProblemaSolución

Recibe un mensaje de error AccessDenied durante la etapa "apply".

  1. Revise los registros de ejecución del proyecto CodeBuild asociado a la etapa "apply" para identificar los permisos de IAM que falten. Para obtener más información, consulte Ver detalles de compilación en AWS CodeBuild en la Guía del usuario de AWS CodeBuild.

  2. En un editor de código, abra la carpeta del repositorio clonado modules . A continuación, navegue hasta la carpeta iam-role y abra el archivo main.tf que se encuentra en esa carpeta.

  3. En la declaración codepipeline_policy, añada las políticas de IAM necesarias para aprovisionar recursos en su cuenta de AWS.

Recursos relacionados

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_terraform crea los proyectos de CodeBuild que forman cada etapa de la canalización.

  • codecommit_infrastructure_source_repo captura y crea el repositorio CodeCommit de origen.

  • codepipeline_iam_role crea las funciones de IAM necesarias para la canalización.

  • codepipeline_kms crea la clave de AWS KMS necesaria para el cifrado y descifrado de objetos de Amazon S3.

  • codepipeline_terraform crea la canalización de pruebas para el repositorio fuente de CodeCommit.

  • s3_artifacts_bucket crea 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.yml ejecuta la etapa "validate".

  • buildspec_plan.yml ejecuta la etapa "plan".

  • buildspec_apply.yml ejecuta la etapa "apply".

  • buildspec_destroy.yml ejecuta 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

CODE_SRC_DIR

"."

Define el directorio CodeCommit de origen

TF_VERSION

«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

SCRIPT_DIR

»./templates/scripts»

Define el directorio de scripts

ENVIRONMENT

«dev»

Define el nombre del entorno

SKIPVALIDATIONFAILURE

«Y»

Omite la validación en caso de errores

ENABLE_TFVALIDATE

«Y»

Activa la validación de Terraform 

ENABLE_TFFORMAT

«Y»

Activa el formato Terraform

ENABLE_TFCHECKOV

«Y»

Activa el análisis de checkov

ENABLE_TFSEC

«Y»

Activa el análisis de TFSec

TFSEC_VERSION

«v1.28.1»

Define la versión tfsec