

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Cree una CI/CD canalización para validar las configuraciones de Terraform mediante AWS CodePipeline
<a name="create-a-ci-cd-pipeline-to-validate-terraform-configurations-by-using-aws-codepipeline"></a>

*Aromal Raj Jayarajan y Vijesh Vijayakumaran Nair, Amazon Web Services*

## Resumen
<a name="create-a-ci-cd-pipeline-to-validate-terraform-configurations-by-using-aws-codepipeline-summary"></a>

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 que se proporciona en este patrón crea una CI/CD canalización que le ayuda a validar la integridad de las configuraciones de Terraform mediante cinco etapas: CodePipeline ](https://docs.aws.amazon.com/codepipeline/latest/userguide/concepts.html#concepts-stages)

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

1. `"validate"`[ejecuta herramientas de validación de infraestructura como código (IaC), incluidas [tfsec](https://github.com/aquasecurity/tfsec) y checkov. [TFLint](https://github.com/terraform-linters/tflint)](https://www.checkov.io/) La etapa también ejecuta los siguientes comandos de validación de Terraform IaC: `terraform validate` y `terraform fmt`.

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

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

1. `"destroy"` elimina la infraestructura de prueba que se creó durante la `"apply"` etapa.

## Requisitos previos y limitaciones
<a name="create-a-ci-cd-pipeline-to-validate-terraform-configurations-by-using-aws-codepipeline-prereqs"></a>

**Requisitos previos **
+ Una cuenta de AWS activa
+ [Interfaz de la línea de comandos de AWS (AWS CLI)[instalada](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) y configurada](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html)
+ [Git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git), instalado y configurado en su equipo local
+ [Terraform](https://learn.hashicorp.com/collections/terraform/aws-get-started?utm_source=WEBSITE&utm_medium=WEB_IO&utm_offer=ARTICLE_PAGE&utm_content=DOCS), 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
<a name="create-a-ci-cd-pipeline-to-validate-terraform-configurations-by-using-aws-codepipeline-architecture"></a>

**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 en CI/CD canalización para probar las configuraciones de Terraform. CodePipeline

![Arquitectura para probar las configuraciones de Terraform mediante una CI/CD canalización de AWS.](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/images/pattern-img/4df7b1f8-8eef-4d85-a971-a7f158be9691/images/90b931c8-e745-4b52-92de-a367fb0f1f51.png)


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 `terraform apply` comando en la CLI de AWS.

1. AWS CodePipeline asume una función de servicio de IAM que incluye las políticas necesarias para acceder CodeCommit a AWS KMS y Amazon S3. CodeBuild

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

1. CodePipeline ejecuta la `"validate"` etapa 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. CodeBuild 

1. CodePipeline ejecuta la `"plan"` etapa para crear un plan en el CodeBuild proyecto basado en la configuración de Terraform. El usuario de AWS puede revisar este plan antes de aplicar los cambios al entorno de prueba.

1. Code Pipeline ejecuta la `"apply"` fase de implementación del plan utilizando el CodeBuild proyecto para aprovisionar la infraestructura requerida en el entorno de prueba.

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

1. Un bucket de Amazon S3 almacena los artefactos de la canalización, que se cifran y descifran mediante una [clave administrada por el cliente](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk) de AWS KMS.

## Tools (Herramientas)
<a name="create-a-ci-cd-pipeline-to-validate-terraform-configurations-by-using-aws-codepipeline-tools"></a>

**Herramientas**

*Servicios de AWS*
+ [AWS](https://docs.aws.amazon.com/codepipeline/latest/userguide/welcome.html) le CodePipeline ayuda a modelar y configurar rápidamente las diferentes etapas de una versión de software y a automatizar los pasos necesarios para publicar cambios de software de forma continua.
+ [AWS CodeBuild](https://docs.aws.amazon.com/codebuild/latest/userguide/welcome.html) es un servicio de compilación totalmente gestionado que le ayuda a compilar código fuente, ejecutar pruebas unitarias y producir artefactos listos para su implementación.
+ [AWS CodeCommit](https://docs.aws.amazon.com/codecommit/latest/userguide/welcome.html) es un servicio de control de versiones que le ayuda a almacenar y gestionar repositorios de Git de forma privada, sin necesidad de gestionar su propio sistema de control de código fuente.
+ [AWS Identity and Access Management (IAM)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html) 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)](https://docs.aws.amazon.com/kms/latest/developerguide/overview.html) facilita poder crear y controlar claves criptográficas para proteger los datos.
+ [Amazon Simple Storage Service (Amazon S3)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html) 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](https://www.terraform.io/docs) es una aplicación de interfaz de 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. GitHub [aws-codepipeline-terraform-cicdsamples](https://github.com/aws-samples/aws-codepipeline-terraform-cicd-samples) El repositorio contiene las configuraciones de Terraform necesarias para crear la arquitectura de destino descrita en este patrón.

## Epics
<a name="create-a-ci-cd-pipeline-to-validate-terraform-configurations-by-using-aws-codepipeline-epics"></a>

### Aprovisionar los componentes de la solución
<a name="provision-the-solution-components"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Clona el GitHub repositorio. | Clone el GitHub [aws-codepipeline-terraform-cicdsamples](https://github.com/aws-samples/aws-codepipeline-terraform-cicd-samples)repositorio ejecutando el siguiente comando en una ventana de terminal:<pre>git clone https://github.com/aws-samples/aws-codepipeline-terraform-cicd-samples.git</pre><br />Para obtener más información, consulte [Clonación de un repositorio](https://docs.github.com/en/repositories/creating-and-managing-repositories/cloning-a-repository) en la GitHub documentación. | DevOps ingeniero | 
| 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.<br />Para obtener más información, consulte [Asignación de valores a las variables del módulo raíz](https://developer.hashicorp.com/terraform/language/values/variables#assigning-values-to-root-module-variables) en la documentación de Terraform.El archivo `Readme.md` del repositorio incluye más información sobre las variables obligatorias. | DevOps ingeniero | 
| Configure AWS como proveedor de Terraform. | [See the AWS documentation website for more details](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/create-a-ci-cd-pipeline-to-validate-terraform-configurations-by-using-aws-codepipeline.html)Para obtener más información, consulte [AWS provider](https://registry.terraform.io/providers/hashicorp/aws/latest/docs) en la documentación de Terraform. | DevOps ingeniero | 
| Actualice la configuración del proveedor de Terraform para crear el bucket de replicación de Amazon S3. | [See the AWS documentation website for more details](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/create-a-ci-cd-pipeline-to-validate-terraform-configurations-by-using-aws-codepipeline.html)La replicación activa la copia de objetos entre buckets de Amazon S3 de forma automática y asincrónica. | DevOps ingeniero | 
| 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:<pre>terraform init</pre> | DevOps ingeniero | 
| Crear el plan Terraform. | Para crear un plan de Terraform, ejecuta el siguiente comando en la carpeta raíz del repositorio clonado:<pre>terraform plan --var-file=terraform.tfvars -out=tfplan</pre>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. | DevOps ingeniero | 
| Verifique el plan de Terraform. | Revise el plan Terraform y confirme que configura la arquitectura requerida en su cuenta de AWS de destino. | DevOps ingeniero | 
| Implemente la solución. | [See the AWS documentation website for more details](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/create-a-ci-cd-pipeline-to-validate-terraform-configurations-by-using-aws-codepipeline.html)Terraform crea, actualiza o destruye la infraestructura para alcanzar el estado objetivo declarado en los archivos de configuración. | DevOps ingeniero | 

### Validar las configuraciones de Terraform ejecutando la canalización
<a name="validate-terraform-configurations-by-running-the-pipeline"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Configurar el repositorio de código fuente. | [See the AWS documentation website for more details](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/create-a-ci-cd-pipeline-to-validate-terraform-configurations-by-using-aws-codepipeline.html) | DevOps ingeniero | 
| Valide las etapas de la canalización. | [See the AWS documentation website for more details](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/create-a-ci-cd-pipeline-to-validate-terraform-configurations-by-using-aws-codepipeline.html)Para obtener más información, consulte [Ver los detalles y el historial de la canalización (consola)](https://docs.aws.amazon.com/codepipeline/latest/userguide/pipelines-view-console.html) en la *Guía del CodePipeline usuario de AWS*.Cuando se confirma un cambio en la ramificación principal del repositorio de origen, la canalización de pruebas se activa automáticamente. | DevOps ingeniero | 
| Verifique el resultado del informe. | [See the AWS documentation website for more details](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/create-a-ci-cd-pipeline-to-validate-terraform-configurations-by-using-aws-codepipeline.html)El `<project_name>-validate` CodeBuild proyecto genera informes de vulnerabilidad para el código durante la `"validate"` fase. | DevOps ingeniero | 

### Eliminación de sus recursos
<a name="clean-up-your-resources"></a>


| 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:<pre>terraform destroy --var-file=terraform.tfvars</pre> | DevOps ingeniero | 

## Resolución de problemas
<a name="create-a-ci-cd-pipeline-to-validate-terraform-configurations-by-using-aws-codepipeline-troubleshooting"></a>


| Problema | Solución | 
| --- | --- | 
| Recibes un **AccessDenied **error durante la `"apply"` etapa. | [See the AWS documentation website for more details](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/create-a-ci-cd-pipeline-to-validate-terraform-configurations-by-using-aws-codepipeline.html) | 

## Recursos relacionados
<a name="create-a-ci-cd-pipeline-to-validate-terraform-configurations-by-using-aws-codepipeline-resources"></a>
+ [Bloques de módulos](https://developer.hashicorp.com/terraform/language/modules/syntax) (documentación de Terraform)
+ [Cómo implementar y configurar CI/CD los servicios de seguridad de AWS con Terraform](https://aws.amazon.com/blogs/security/how-use-ci-cd-deploy-configure-aws-security-services-terraform/) (entrada del blog de AWS)
+ [Uso de roles vinculados a servicios](https://docs.aws.amazon.com/IAM/latest/UserGuide/using-service-linked-roles.html) (documentación de IAM)
+ [create-pipeline](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/codepipeline/create-pipeline.html) (documentación de AWS CLI)
+ [Configurar el cifrado del lado del servidor para los artefactos almacenados en Amazon S3 para](https://docs.aws.amazon.com/codepipeline/latest/userguide/S3-artifact-encryption.html) (documentación de CodePipeline AWS CodePipeline )
+ [Cuotas para AWS CodeBuild](https://docs.aws.amazon.com/codebuild/latest/userguide/limits.html) ( CodeBuild documentación de AWS)
+ [Protección de datos en AWS CodePipeline](https://docs.aws.amazon.com/codepipeline/latest/userguide/data-protection.html) ( CodePipeline documentación de AWS)

## Información adicional
<a name="create-a-ci-cd-pipeline-to-validate-terraform-configurations-by-using-aws-codepipeline-additional"></a>

**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 CodeBuild proyectos que forman cada etapa del proceso.
+ `codecommit_infrastructure_source_repo`captura y crea el CodeCommit repositorio 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 CodeCommit repositorio de origen.
+ `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 | Predeterminado | Description (Descripción) | 
| --- |--- |--- |
| `CODE_SRC_DIR` | "." | Define el CodeCommit directorio de origen | 
| `TF_VERSION` | «1.3.7» | Define la versión de Terraform para el entorno de compilación | 

El archivo `buildspec_validate.yml`también admite las siguientes variables para activar diferentes ajustes específicos de la compilación:


| 
| 
| Variable | Predeterminado | Description (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 | 