

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.

# Se utiliza CodePipeline para implementar Terraform y plantillas CloudFormation
<a name="using-codepipeline"></a>

En la DPA, se utilizan bloques de construcción para crear aceleradores AWS CodePipeline para Terraform e IaC. CloudFormation En esta sección se describe lo siguiente para este caso de uso:
+ Estructura de canalización estandarizada
+ Etapas y trabajos reutilizables
+ Herramientas integradas para escaneos de seguridad

El repositorio de DPA contiene carpetas para [Terraform](https://github.com/aws-samples/aws-devops-pipeline-accelerator/tree/main/aws-codepipeline/terraform) y. [CloudFormation](https://github.com/aws-samples/aws-devops-pipeline-accelerator/tree/main/aws-codepipeline/cloudformation) Cada una de estas carpetas contiene las dos subcarpetas siguientes:
+ **pipeline-modules**: esta carpeta contiene el código para implementar la estructura de canalización estandarizada.
+ **compartida**: esta carpeta contiene archivos de ready-to-use especificaciones de compilación para las etapas y trabajos del DPA.

## Requisitos previos
<a name="prerequisites-codepipeline"></a>
+ Un activo Cuenta de AWS
+ Permisos para aprovisionar recursos mediante plantillas de IaC
+ Permisos para crear AWS CodeCommit repositorios y componentes CodePipeline 

## Tools (Herramientas)
<a name="tools-codepipeline"></a>
+ [cfn-lint es un linter](https://github.com/aws-cloudformation/cfn-lint) [que compara las plantillas CloudFormation YAML o JSON con la especificación del recurso.AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-resource-specification.html) También realiza otras comprobaciones, como verificar los valores válidos de las propiedades de los recursos y el cumplimiento de las prácticas recomendadas.
+ [cfn\$1nag](https://github.com/stelligent/cfn_nag) es una herramienta de código abierto que identifica posibles problemas de seguridad en las plantillas mediante la búsqueda de patrones. CloudFormation
+ [Checkov](https://www.checkov.io/1.Welcome/What%20is%20Checkov.html) es una herramienta de análisis de código estático que comprueba si el IaC está mal configurado en materia de seguridad y conformidad.
+ [TFLint](https://github.com/terraform-linters/tflint)es un filtro que comprueba el código de Terraform para detectar posibles errores y si se cumplen las mejores prácticas.
+ [tfsec](https://github.com/aquasecurity/tfsec) es una herramienta de análisis de código estático que comprueba el código de Terraform para detectar posibles errores de configuración.

## Instrucciones
<a name="instructions-codepipeline"></a>

### Crea repositorios CodeCommit
<a name="instructions-repo"></a>

1. Cree dos CodeCommit repositorios independientes de la siguiente manera:
   + `common-repo`— Este repositorio contiene las bibliotecas compartidas, los archivos de especificaciones de compilación y las dependencias.
   + `app-repo`— Este repositorio contiene el Terraform o las CloudFormation plantillas para implementar su infraestructura.

   Para obtener instrucciones, consulte [Crear un AWS CodeCommit repositorio](https://docs.aws.amazon.com/codecommit/latest/userguide/how-to-create-repository.html).

1. En el `common-repo` repositorio, crea una carpeta con el nombre`shared`. Copie los archivos buildspec de [Terraform](https://github.com/aws-samples/aws-devops-pipeline-accelerator/tree/main/aws-codepipeline/terraform/shared) o de la carpeta [CloudFormation](https://github.com/aws-samples/aws-devops-pipeline-accelerator/tree/main/aws-codepipeline/cloudformation/shared)**compartida** del repositorio de GitHub DPA a la nueva carpeta. Para obtener instrucciones, consulte [Crear o añadir](https://docs.aws.amazon.com/codecommit/latest/userguide/how-to-create-file.html) un archivo a un repositorio. AWS CodeCommit 

1. En el `app-repo` repositorio, cree una carpeta con el nombre`entrypoint`. Copie el archivo de la carpeta [Terraform](https://github.com/aws-samples/aws-devops-pipeline-accelerator/blob/main/examples/aws_codepipeline/terraform/entrypoint/terraform-infrastructure.json) o [CloudFormation](https://github.com/aws-samples/aws-devops-pipeline-accelerator/blob/main/examples/aws_codepipeline/cloudformation/entrypoint/config.json)**entrypoint** del repositorio de GitHub DPA a la nueva carpeta. Para obtener más información sobre estos archivos, consulte. [Comprender el archivo JSON del punto de entrada](#understanding-json-file)

1. Revise el directorio [Terraform](https://github.com/aws-samples/aws-devops-pipeline-accelerator/tree/main/examples/aws_codepipeline/terraform) o de [CloudFormation](https://github.com/aws-samples/aws-devops-pipeline-accelerator/tree/main/examples/aws_codepipeline/cloudformation)**ejemplos** y, a continuación, estructure `app-repo` la carpeta de acuerdo con estos ejemplos. Estos directorios contienen ejemplos para implementar una instancia de Amazon Elastic Compute Cloud (Amazon EC2) o un bucket de Amazon Simple Storage Service (Amazon S3).

1. Continúe con una de las dos secciones siguientes:
   + [Cree la canalización y defina las etapas (Terraform)](#instructions-terraform-pipeline)
   + [Cree la canalización y defina las etapas (CloudFormation)](#instructions-cfn-pipeline)

### Cree la canalización y defina las etapas (Terraform)
<a name="instructions-terraform-pipeline"></a>

1. Clone el [repositorio de DevOps Pipeline Accelerator (DPA)](https://github.com/aws-samples/aws-devops-pipeline-accelerator) en su estación de GitHub trabajo local.

1. En el repositorio clonado, navegue hasta la carpeta. `aws-codepipeline/terraform/pipeline-modules`

1. En el archivo **terraform.tfvars**, actualiza y valida el estado de Terraform y las variables específicas del rol (IAM). AWS Identity and Access Management 

1. Crea una imagen de Docker. Para obtener instrucciones, consulte [Creación de imágenes de Docker para usarlas en CodeBuild](https://github.com/aws-samples/aws-devops-pipeline-accelerator/blob/main/shared-docker/docker-images/README.md) ()GitHub.

1. Actualice la `builder_image` variable definida en el archivo **terraform.tfvars**.

1. Introduzca los comandos siguientes. Esto inicializa, previsualiza y despliega la infraestructura a través de Terraform.

   ```
   terraform init
   terraform plan
   terraform apply
   ```

1. Inicie sesión en. Cuenta de AWS En la [CodePipeline consola](https://console.aws.amazon.com/codesuite/codepipeline/home), confirme que se ha creado la nueva canalización.

   **Nota**: Si la primera ejecución está en un `failed` estado, repita el paso anterior.

1. Cuando se crea la nueva CodePipeline canalización, se crea automáticamente una nueva función de AWS CodeBuild IAM. El nombre de este rol creado automáticamente termina en`-codebuild-role`. Actualice este rol con los permisos necesarios para implementar su infraestructura.

### Cree la canalización y defina las etapas (CloudFormation)
<a name="instructions-cfn-pipeline"></a>

1. Clone el [repositorio de DevOps Pipeline Accelerator (DPA)](https://github.com/aws-samples/aws-devops-pipeline-accelerator) en su estación GitHub de trabajo local.

1. En el repositorio clonado, navegue hasta la carpeta. `aws-codepipeline/cloudformation/pipeline-modules`

1. Implemente la plantilla ** CloudFormation pipeline-cft.yaml**. Los siguientes son los parámetros obligatorios que debes pasar a la pila.
   + `ArtifactsBucket`— Nombre del repositorio que contiene los artefactos de canalización que se van a actualizar
   + `EcrDockerRepository`— Identificador uniforme de recursos (URI) del repositorio de Amazon ECR con la etiqueta `image`
   + `CodeCommitAppRepo`— Nombre del CodeCommit repositorio que contiene las plantillas
   + `CodeCommitBaseRepo`— Nombre del CodeCommit repositorio que contiene los archivos compartidos
   + `CodeCommitRepoBranch`— Nombre de la rama del CodeCommit repositorio
   + `SNSMailAddress`— Dirección de correo electrónico que recibirá las notificaciones del Amazon Simple Notification Service (Amazon SNS) sobre el estado de la canalización

   Para obtener instrucciones, consulte [Cómo trabajar con pilas](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/stacks.html) en la CloudFormation documentación.

1. Inicie sesión en la cuenta de AWS. En la [CodePipeline consola](https://console.aws.amazon.com/codesuite/codepipeline/home), confirme que se ha creado la nueva canalización.  

1. Cuando se crea la nueva CodePipeline canalización, se crea automáticamente una nueva función de IAM para AWS CodeBuild . El nombre de este rol creado automáticamente termina en`-codebuild-role`. Actualice este rol con los permisos necesarios para implementar su infraestructura.

## Comprender el archivo JSON del punto de entrada
<a name="understanding-json-file"></a>

### Archivo de puntos de entrada de Terraform
<a name="entry-point-terraform"></a>

Este es el archivo de configuración principal. En este archivo, puede personalizar y activar o desactivar una etapa. Si deshabilita una etapa, no se elimina ni elimina la etapa de la canalización. En su lugar, la etapa se omite durante el tiempo de ejecución.

```
{
    "build_stage_required" : "true",
    "test_stage_required" : "true",
    "predeploy_stage_required": "true",
    "deploy_stage_required": "true",
    "postdeploy_stage_required": "true",
    "destroy_stage_required": "true",
    "bucket":"tf-state-dpa",                # S3 bucket used for Terraform backend
    "key":"terraform_test.tfstate",         # S3 key to be used
    "region":"us-east-1",       
    "dynamodb_table":"tf-state-dpa"         # DynamoDB Table for Terraform backend
}
```

### CloudFormation archivo de punto de entrada
<a name="entry-point-cfn"></a>

Este es el archivo de configuración principal. En este archivo, puede personalizar las etapas y habilitarlas o deshabilitarlas. Si deshabilita una etapa, no se elimina ni elimina la etapa de la canalización. En su lugar, la canalización omite la etapa durante el tiempo de ejecución.

```
{
    "init_stage_required" : "true",
    "test_stage_required" : "true",
    "createinfra_stage_required": "true",
    "envType" : "cloudformation",
    "stage_required" : "true",
    "cft_s3_bucket" : "pipeline-bucket",               #S3 bucket from the destination account to keep CFT templates
    "stack_name" : "aws-cft-poc",                      #CloudFormation stack name
    "account" : "************",                        #Destination AWS account to deploy stack
    "roleName" : "codestack-poc-cross-account-role",   #Cross-account IAM role name
    "region" : "us-east-1",
    "destroy_stack" : "false"                          #To destroy the provisioned stack, set this value to "true"
}
```