

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

# Crie um CI/CD pipeline para validar as configurações do Terraform usando a AWS CodePipeline
<a name="create-a-ci-cd-pipeline-to-validate-terraform-configurations-by-using-aws-codepipeline"></a>

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

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

Esse padrão mostra como testar as configurações do HashiCorp Terraform usando um pipeline de integração contínua e entrega contínua (CI/CD) implantado pela AWS. CodePipeline

O Terraform é um aplicativo de interface da linha de comando que ajuda você a usar o código para fornecer e gerenciar a infraestrutura e os recursos da nuvem. [A solução fornecida nesse padrão cria um CI/CD pipeline que ajuda você a validar a integridade de suas configurações do Terraform executando cinco estágios: CodePipeline ](https://docs.aws.amazon.com/codepipeline/latest/userguide/concepts.html#concepts-stages)

1. `"checkout"`extrai a configuração do Terraform que você está testando de um repositório da AWS CodeCommit .

1. `"validate"`[executa ferramentas de validação de infraestrutura como código (IaC), incluindo [tfsec](https://github.com/aquasecurity/tfsec) e [TFLint](https://github.com/terraform-linters/tflint)checkov.](https://www.checkov.io/) O estágio também executa os seguintes comandos de validação do Terraform IaC: `terraform validate` e `terraform fmt`.

1. `"plan"` mostra quais mudanças serão aplicadas à infraestrutura se a configuração do Terraform for aplicada.

1. `"apply"` usa o plano gerado para provisionar a infraestrutura necessária em um ambiente de teste.

1. `"destroy"` remove a infraestrutura de teste que foi criada durante o estágio `"apply"`.

## Pré-requisitos e limitações
<a name="create-a-ci-cd-pipeline-to-validate-terraform-configurations-by-using-aws-codepipeline-prereqs"></a>

**Pré-requisitos **
+ Uma conta AWS ativa
+ AWS Command Line Interface (AWS CLI), [instalado](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) e [configurado](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 e configurado em sua máquina 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 e configurado em sua máquina local

**Limitações**
+ A abordagem desse padrão implanta a AWS CodePipeline em uma conta da AWS e somente em uma região da AWS. Alterações na configuração são necessárias para implantações em várias contas e em várias regiões.
+ O perfil do AWS Identity and Access Management (IAM) que esse padrão fornece (**codepipeline\_iam\_role**) segue o princípio do privilégio mínimo. As permissões desse perfil do IAM devem ser atualizadas com base nos recursos específicos que seu pipeline precisa criar.** **

**Versões do produto**
+ AWS CLI versão 2.9.15 ou superior
+ Terraform versão 1.3.7 ou superior

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

**Pilha de tecnologias de destino**
+ AWS CodePipeline
+ AWS CodeBuild
+ AWS CodeCommit
+ AWS IAM
+ Amazon Simple Storage Service (Amazon S3)
+ AWS Key Management Service (AWS KMS)
+ Terraform

**Arquitetura de destino**

O diagrama a seguir mostra um exemplo de fluxo de trabalho de CI/CD pipeline para testar as configurações do Terraform em. CodePipeline

![Arquitetura para testar as configurações do Terraform usando um pipeline da AWS CI/CD .](http://docs.aws.amazon.com/pt_br/prescriptive-guidance/latest/patterns/images/pattern-img/4df7b1f8-8eef-4d85-a971-a7f158be9691/images/90b931c8-e745-4b52-92de-a367fb0f1f51.png)


O diagrama mostra o seguinte fluxo de trabalho:

1. Em CodePipeline, um usuário da AWS inicia as ações propostas em um plano do Terraform executando o `terraform apply` comando na CLI da AWS.

1. A AWS CodePipeline assume uma função de serviço do IAM que inclui as políticas necessárias para acessar CodeCommit o AWS KMS e o Amazon S3. CodeBuild

1. CodePipeline executa o estágio de `"checkout"` pipeline para extrair a configuração do Terraform de um CodeCommit repositório da AWS para testes.

1. CodePipeline executa o `"validate"` estágio para testar a configuração do Terraform executando as ferramentas de validação do IaC e executando os comandos de validação do Terraform IaC em um projeto. CodeBuild 

1. CodePipeline executa o `"plan"` estágio para criar um plano no CodeBuild projeto com base na configuração do Terraform. O usuário da AWS pode revisar esse plano antes que as alterações sejam aplicadas ao ambiente de teste.

1. O Code Pipeline executa o `"apply"` estágio de implementação do plano usando o CodeBuild projeto para provisionar a infraestrutura necessária no ambiente de teste.

1. CodePipeline executa o `"destroy"` estágio, que é usado CodeBuild para remover a infraestrutura de teste que foi criada durante o `"apply"` estágio.

1. Um bucket do Amazon S3 armazena artefatos de pipeline, que são criptografados e descriptografados usando uma [chave gerenciada pelo cliente](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk) do AWS KMS.

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

**Ferramentas**

*Serviços da AWS*
+  CodePipelineA [AWS](https://docs.aws.amazon.com/codepipeline/latest/userguide/welcome.html) ajuda você a modelar e configurar rapidamente os diferentes estágios de uma versão de software e automatizar as etapas necessárias para liberar alterações de software continuamente.
+  CodeBuildA [AWS](https://docs.aws.amazon.com/codebuild/latest/userguide/welcome.html) é um serviço de criação totalmente gerenciado que ajuda você a compilar o código-fonte, executar testes unitários e produzir artefatos prontos para implantação.
+  CodeCommitA [AWS](https://docs.aws.amazon.com/codecommit/latest/userguide/welcome.html) é um serviço de controle de versão que ajuda você a armazenar e gerenciar repositórios Git de forma privada, sem precisar gerenciar seu próprio sistema de controle de origem.
+ O [AWS Identity and Access Management (IAM)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html) ajuda você a gerenciar com segurança o acesso aos seus recursos da AWS, controlando quem está autenticado e autorizado a usá-los.
+ O [AWS Key Management Service (AWS KMS)](https://docs.aws.amazon.com/kms/latest/developerguide/overview.html) ajuda você a criar e controlar chaves criptográficas para proteger seus dados.
+ O [Amazon Simple Storage Service (Amazon S3)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html) é um serviço de armazenamento de objetos baseado na nuvem que ajuda você a armazenar, proteger e recuperar qualquer quantidade de dados.

*Outros serviços*
+ [HashiCorp O Terraform](https://www.terraform.io/docs) é um aplicativo de interface de linha de comando que ajuda você a usar o código para provisionar e gerenciar a infraestrutura e os recursos da nuvem.

**Código **

O código desse padrão está disponível no GitHub [aws-codepipeline-terraform-cicdsamples](https://github.com/aws-samples/aws-codepipeline-terraform-cicd-samples)repositório. O repositório contém as configurações do Terraform necessárias para criar a arquitetura de destino descrita nesse padrão.

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

### Provisione os componentes da solução
<a name="provision-the-solution-components"></a>


| Tarefa | Description | Habilidades necessárias | 
| --- | --- | --- | 
| Clone o GitHub repositório. | Clone o GitHub [aws-codepipeline-terraform-cicdsamples](https://github.com/aws-samples/aws-codepipeline-terraform-cicd-samples)repositório executando o seguinte comando em uma janela de terminal:<pre>git clone https://github.com/aws-samples/aws-codepipeline-terraform-cicd-samples.git</pre><br />Para obter mais informações, consulte [Clonar um repositório](https://docs.github.com/en/repositories/creating-and-managing-repositories/cloning-a-repository) na GitHub documentação. | DevOps engenheiro | 
| Crie um arquivo de definições de variáveis do Terraform.  | Crie um arquivo `terraform.tfvars` com base nos requisitos do seu caso de uso. Você pode atualizar as variáveis no arquivo `examples/terraform.tfvars` que está no repositório clonado.<br />Para obter mais informações, consulte [Atribuição de valores às variáveis do módulo raiz](https://developer.hashicorp.com/terraform/language/values/variables#assigning-values-to-root-module-variables) na documentação do Terraform.O arquivo `Readme.md` do repositório contém mais informações sobre as variáveis necessárias. | DevOps engenheiro | 
| Configure a AWS como o provedor do Terraform. | [See the AWS documentation website for more details](http://docs.aws.amazon.com/pt_br/prescriptive-guidance/latest/patterns/create-a-ci-cd-pipeline-to-validate-terraform-configurations-by-using-aws-codepipeline.html)Para obter mais informações, consulte o [provedor da AWS](https://registry.terraform.io/providers/hashicorp/aws/latest/docs) na documentação do Terraform. | DevOps engenheiro | 
| Atualize a configuração do provedor Terraform para criar o bucket de replicação do Amazon S3. | [See the AWS documentation website for more details](http://docs.aws.amazon.com/pt_br/prescriptive-guidance/latest/patterns/create-a-ci-cd-pipeline-to-validate-terraform-configurations-by-using-aws-codepipeline.html)Com a replicação, os objetos são copiados automaticamente e de forma assíncrona entre os buckets do Amazon S3. | DevOps engenheiro | 
| Inicialize a configuração do Terraform. | Para inicializar seu diretório de trabalho que contém os arquivos de configuração Terraform, execute o seguinte comando na pasta raiz do repositório clonado:<pre>terraform init</pre> | DevOps engenheiro | 
| Crie o plano do Terraform. | Para criar um plano do Terraform, execute o seguinte comando na pasta raiz do repositório clonado:<pre>terraform plan --var-file=terraform.tfvars -out=tfplan</pre>O Terraform avalia os arquivos de configuração para determinar o estado de destino dos recursos declarados. Em seguida, ele compara o estado de destino com o estado atual e cria um plano. | DevOps engenheiro | 
| Verifique o plano do Terraform. | Revise o plano do Terraform e confirme se ele configura a arquitetura necessária em sua conta da AWS de destino. | DevOps engenheiro | 
| Implante a solução. | [See the AWS documentation website for more details](http://docs.aws.amazon.com/pt_br/prescriptive-guidance/latest/patterns/create-a-ci-cd-pipeline-to-validate-terraform-configurations-by-using-aws-codepipeline.html)O Terraform cria, atualiza ou destrói a infraestrutura para atingir o estado de destino declarado nos arquivos de configuração. | DevOps engenheiro | 

### Valide as configurações do Terraform executando o pipeline
<a name="validate-terraform-configurations-by-running-the-pipeline"></a>


| Tarefa | Description | Habilidades necessárias | 
| --- | --- | --- | 
| Configure o repositório de código-fonte. | [See the AWS documentation website for more details](http://docs.aws.amazon.com/pt_br/prescriptive-guidance/latest/patterns/create-a-ci-cd-pipeline-to-validate-terraform-configurations-by-using-aws-codepipeline.html) | DevOps engenheiro | 
| Valide os estágios do pipeline. | [See the AWS documentation website for more details](http://docs.aws.amazon.com/pt_br/prescriptive-guidance/latest/patterns/create-a-ci-cd-pipeline-to-validate-terraform-configurations-by-using-aws-codepipeline.html)Para obter mais informações, consulte [Visualizar detalhes e histórico do pipeline (console)](https://docs.aws.amazon.com/codepipeline/latest/userguide/pipelines-view-console.html) no *Guia CodePipeline do usuário da AWS*.Quando uma alteração é confirmada na ramificação principal do repositório de origem, o pipeline de teste é ativado automaticamente. | DevOps engenheiro | 
| Verifique a saída do relatório. | [See the AWS documentation website for more details](http://docs.aws.amazon.com/pt_br/prescriptive-guidance/latest/patterns/create-a-ci-cd-pipeline-to-validate-terraform-configurations-by-using-aws-codepipeline.html)O `<project_name>-validate` CodeBuild projeto gera relatórios de vulnerabilidade para seu código durante a `"validate"` etapa. | DevOps engenheiro | 

### Limpe os seus recursos
<a name="clean-up-your-resources"></a>


| Tarefa | Description | Habilidades necessárias | 
| --- | --- | --- | 
| Limpe o pipeline e os recursos associados. | Para excluir os recursos de teste da sua conta da AWS, execute o seguinte comando na pasta raiz do repositório clonado:<pre>terraform destroy --var-file=terraform.tfvars</pre> | DevOps engenheiro | 

## Solução de problemas
<a name="create-a-ci-cd-pipeline-to-validate-terraform-configurations-by-using-aws-codepipeline-troubleshooting"></a>


| Problema | Solução | 
| --- | --- | 
| Você recebe um **AccessDenied **erro durante a `"apply"` etapa. | [See the AWS documentation website for more details](http://docs.aws.amazon.com/pt_br/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>
+ [Blocos de módulos](https://developer.hashicorp.com/terraform/language/modules/syntax) (documentação do Terraform)
+ [Como usar para CI/CD implantar e configurar serviços de segurança da AWS com o Terraform](https://aws.amazon.com/blogs/security/how-use-ci-cd-deploy-configure-aws-security-services-terraform/) (postagem no blog da AWS)
+ [Using service-linked roles](https://docs.aws.amazon.com/IAM/latest/UserGuide/using-service-linked-roles.html) (documentação do IAM)
+ [create-pipeline](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/codepipeline/create-pipeline.html) (documentação da AWS CLI)
+ [Configure a criptografia do lado do servidor para artefatos armazenados no Amazon S3](https://docs.aws.amazon.com/codepipeline/latest/userguide/S3-artifact-encryption.html) para (documentação da AWS) CodePipeline CodePipeline 
+ [Cotas para a AWS CodeBuild](https://docs.aws.amazon.com/codebuild/latest/userguide/limits.html) ( CodeBuild documentação da AWS)
+ [Proteção de dados na AWS CodePipeline](https://docs.aws.amazon.com/codepipeline/latest/userguide/data-protection.html) ( CodePipeline documentação da AWS)

## Mais informações
<a name="create-a-ci-cd-pipeline-to-validate-terraform-configurations-by-using-aws-codepipeline-additional"></a>

**Módulos personalizados do Terraform**

A seguir está uma lista de módulos personalizados do Terraform que são usados nesse padrão:
+ `codebuild_terraform`cria os CodeBuild projetos que formam cada estágio do pipeline.
+ `codecommit_infrastructure_source_repo`captura e cria o CodeCommit repositório de origem.
+ `codepipeline_iam_role` cria os perfis do IAM necessários para o pipeline.
+ `codepipeline_kms` cria a chave do AWS KMS necessária para criptografia e descriptografia de objetos do Amazon S3.
+ `codepipeline_terraform`cria o pipeline de teste para o CodeCommit repositório de origem.
+ `s3_artifacts_bucket` cria um bucket do Amazon S3 para gerenciar artefatos de pipeline.

**Arquivos de especificação de compilação**

Veja a seguir uma lista de arquivos de especificação de compilação (buildspec) que esse padrão usa para executar cada estágio do pipeline:
+ `buildspec_validate.yml` executa o estágio `"validate"`.
+ `buildspec_plan.yml` executa o estágio `"plan"`.
+ `buildspec_apply.yml` executa o estágio `"apply"`.
+ `buildspec_destroy.yml` executa o estágio `"destroy"`.

*Variáveis do arquivo de especificação de compilação*

Cada arquivo buildspec usa as seguintes variáveis para ativar diferentes configurações específicas da compilação:


| 
| 
| Variável | Valor padrão  | Description | 
| --- |--- |--- |
| `CODE_SRC_DIR` | "." | Define o CodeCommit diretório de origem | 
| `TF_VERSION` | "1.3.7" | Define a versão do Terraform para o ambiente de construção | 

O arquivo `buildspec_validate.yml` também suporta as seguintes variáveis para ativar diferentes configurações específicas da compilação:


| 
| 
| Variável | Valor padrão  | Description | 
| --- |--- |--- |
| `SCRIPT_DIR` | "./templates/scripts" | Define o diretório do script | 
| `ENVIRONMENT` | "dev" | Define o nome do ambiente | 
| `SKIPVALIDATIONFAILURE` | "Y" | Ignora a validação em caso de falhas | 
| `ENABLE_TFVALIDATE` | "Y" | Ativa a validação do Terraform  | 
| `ENABLE_TFFORMAT` | "Y" | Ativa o formato do Terraform | 
| `ENABLE_TFCHECKOV` | "Y" | Ativa varredura checkov | 
| `ENABLE_TFSEC` | "Y" | Ativa varredura tfsec | 
| `TFSEC_VERSION` | “v1.28.1" | Define a versão do tfsec | 