

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

# Teste a AWS infraestrutura usando LocalStack e Terraform Tests
<a name="test-aws-infra-localstack-terraform"></a>

*Ivan Girardi e Ioannis Kalyvas, Amazon Web Services*

## Resumo
<a name="test-aws-infra-localstack-terraform-summary"></a>

Esse padrão ajuda você a testar localmente a infraestrutura como código (IaC) AWS no Terraform sem a necessidade de provisionar a infraestrutura em seu AWS ambiente. Ele integra a [estrutura do Terraform Tests](https://developer.hashicorp.com/terraform/language/tests) com. [LocalStack](https://github.com/localstack/localstack) O contêiner LocalStack Docker fornece um ambiente de desenvolvimento local que emula vários. Serviços da AWS Isso permite testar e iterar implantações de infraestrutura sem gerar custos na Nuvem AWS.

Essa solução oferece os seguintes benefícios:
+ **Otimização de custos** — a execução de testes LocalStack elimina a necessidade de uso Serviços da AWS. Isso evita que você incorra em custos associados à criação, operação e modificação desses AWS recursos.
+ **Velocidade e eficiência** — Testar localmente também é normalmente mais rápido do que implantar os AWS recursos. Esse ciclo de feedback rápido acelera o desenvolvimento e a depuração. Como LocalStack é executado localmente, você pode desenvolver e testar seus arquivos de configuração do Terraform sem uma conexão com a Internet. Você pode depurar arquivos de configuração do Terraform localmente e receber feedback imediato, o que agiliza o processo de desenvolvimento.
+ **Consistência e reprodutibilidade** — LocalStack fornece um ambiente consistente para testes. Essa consistência ajuda a garantir que os testes produzam os mesmos resultados, independentemente de AWS alterações externas ou problemas de rede.
+ **Isolamento** — Testar com LocalStack evita que você acidentalmente afete AWS recursos ativos ou ambientes de produção. Esse isolamento permite que você teste e experimente diversas configurações com segurança.
+ **Automação**: a integração com um pipeline de integração e de entrega contínua (CI/CD) possibilita o teste automático de [arquivos de configuração](https://developer.hashicorp.com/terraform/language/files) do Terraform. O pipeline realiza testes rigorosos na IaC antes da implantação.
+ **Flexibilidade** — você pode simular configurações diferentes Regiões da AWS e de serviço para se adequar melhor aos seus ambientes de produção. Contas da AWS

## Pré-requisitos e limitações
<a name="test-aws-infra-localstack-terraform-prereqs"></a>

**Pré-requisitos **
+ [Instalar o Docker](https://docs.docker.com/get-started/get-docker/)
+ [Habilite o acesso](https://docs.docker.com/reference/cli/dockerd/#daemon-socket-option) ao soquete padrão do Docker (`/var/run/docker.sock`). Para obter mais informações, consulte a [documentação do LocalStack ](https://docs.localstack.cloud/user-guide/aws/lambda/#migrating-to-lambda-v2).
+ [Instale](https://docs.docker.com/compose/install/) com o Docker Compose
+ [Instale](https://developer.hashicorp.com/terraform/tutorials/aws-get-started/install-cli) o Terraform na versão 1.6.0 ou em versões posteriores
+ [Instale](https://developer.hashicorp.com/terraform/cli) a CLI do Terraform
+ [Configurar](https://hashicorp.github.io/terraform-provider-aws/) o Terraform Provider AWS 
+ (Opcional) [Instale](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) e [configure](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html) o AWS Command Line Interface (AWS CLI). Para ver um exemplo de como usar o AWS CLI with LocalStack, consulte o repositório GitHub [Test AWS infrastructure using LocalStack and Terraform Tests](https://github.com/aws-samples/localstack-terraform-test).

**Limitações**
+ Esse padrão fornece exemplos explícitos para testar os recursos do Amazon Simple Storage Service (Amazon S3),, AWS Lambda e AWS Step Functions do Amazon DynamoDB. No entanto, você pode estender essa solução para incluir AWS recursos adicionais.
+ Esse padrão fornece instruções para executar testes do Terraform localmente, mas você pode integrar os testes em qualquer CI/CD pipeline.
+ Esse padrão fornece instruções para usar a imagem LocalStack da comunidade. Se você estiver usando a imagem LocalStack Pro, consulte a [documentação do LocalStack Pro](https://hub.docker.com/r/localstack/localstack-pro).
+ LocalStack fornece serviços de emulação para diferentes. AWS APIs Para obter uma lista completa, consulte [AWS Service Feature Coverage](https://docs.localstack.cloud/user-guide/aws/feature-coverage/). Alguns recursos avançados podem exigir uma assinatura do LocalStack Pro.

## Arquitetura
<a name="test-aws-infra-localstack-terraform-architecture"></a>

O diagrama apresentado a seguir ilustra a arquitetura para esta solução. Os componentes principais são um repositório de código-fonte, um CI/CD pipeline e um contêiner LocalStack Docker. O LocalStack Docker Container hospeda o seguinte Serviços da AWS localmente:
+ Um bucket do Amazon S3 para armazenar arquivos
+ Amazon CloudWatch para monitoramento e registro
+ Uma AWS Lambda função para executar código sem servidor
+ Uma máquina de AWS Step Functions estado para orquestrar fluxos de trabalho em várias etapas
+ Uma tabela do Amazon DynamoDB para armazenar dados NoSQL

![Um CI/CD pipeline cria e testa o contêiner LocalStack Docker e os recursos da AWS.](http://docs.aws.amazon.com/pt_br/prescriptive-guidance/latest/patterns/images/pattern-img/34bfbdbf-14e7-42a0-9022-c85a9c30cdcd/images/dc61fac9-b92c-4841-9132-ff8bb865eed9.png)


O diagrama mostra o seguinte fluxo de trabalho:

1. Você adiciona e confirma um arquivo de configuração do Terraform no repositório de código-fonte.

1. O CI/CD pipeline detecta as alterações e inicia um processo de construção para análise estática do código do Terraform. O pipeline cria e executa o contêiner LocalStack Docker. Depois disso, o pipeline dá início à execução dos testes.

1. O pipeline carrega um objeto em um bucket do Amazon S3 que está hospedado no contêiner LocalStack do Docker.

1. O upload do objeto invoca uma função. AWS Lambda 

1. A função Lambda armazena a notificação de eventos do Amazon S3 em um log. CloudWatch 

1. A função Lambda inicia uma máquina de AWS Step Functions estado.

1. A máquina de estado grava o nome do objeto do Amazon S3 em uma tabela do DynamoDB.

1. O processo de teste no CI/CD pipeline verifica se o nome do objeto carregado corresponde à entrada na tabela do DynamoDB. Também verifica se o bucket do S3 foi implantado com o nome especificado e se a AWS Lambda função foi implantada com sucesso.

## Ferramentas
<a name="test-aws-infra-localstack-terraform-tools"></a>

**Serviços da AWS**
+  CloudWatchA [Amazon](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/WhatIsCloudWatch.html) ajuda você a monitorar as métricas dos seus AWS recursos e dos aplicativos em que você executa AWS em tempo real.
+ O [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html) é um serviço de banco de dados NoSQL totalmente gerenciado que fornece performance rápida, previsível e escalável.
+ O [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) é um serviço de computação que ajuda a executar código sem exigir provisionamento ou gerenciamento de servidores. Ele executa o código somente quando necessário e dimensiona automaticamente, assim, você paga apenas pelo tempo de computação usado.
+ 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.
+ [AWS Step Functions](https://docs.aws.amazon.com/step-functions/latest/dg/welcome.html)é um serviço de orquestração sem servidor que ajuda você a combinar AWS Lambda funções e outras Serviços da AWS para criar aplicativos essenciais para os negócios.

**Outras ferramentas**
+ O [Docker](https://www.docker.com/) é um conjunto de produtos de plataforma como serviço (PaaS) que usam a virtualização no nível do sistema operacional para fornecer software em contêineres.
+ O [Docker Compose](https://docs.docker.com/compose/) é uma ferramenta para definir e executar aplicações com diversos contêineres.
+ [LocalStack](https://localstack.cloud)é um emulador de serviços em nuvem executado em um único contêiner. Ao usar LocalStack, você pode executar cargas de trabalho em sua máquina local que usam Serviços da AWS, sem se conectar ao Nuvem AWS.
+ [O Terraform](https://www.terraform.io/) é uma ferramenta de IaC HashiCorp que ajuda você a criar e gerenciar recursos na nuvem e no local.
+ O [Terraform Tests](https://developer.hashicorp.com/terraform/language/tests) auxilia na validação das atualizações na configuração de módulos do Terraform por meio de testes semelhantes a testes de integração ou a testes de unidade.

**Repositório de código**

O código desse padrão está disponível na [AWS infraestrutura de GitHub teste usando LocalStack o repositório Terraform Tests](https://github.com/aws-samples/localstack-terraform-test).

## Práticas recomendadas
<a name="test-aws-infra-localstack-terraform-best-practices"></a>
+ Essa solução testa a AWS infraestrutura especificada nos arquivos de configuração do Terraform e não implanta esses recursos no Nuvem AWS. Se você deseja implantar os recursos, siga o [princípio de privilégio mínimo](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege) (documentação do IAM) e [configure corretamente o backend do Terraform](https://developer.hashicorp.com/terraform/language/backend) (documentação do Terraform).
+ Ao fazer a integração LocalStack em um CI/CD pipeline, recomendamos que você não execute o contêiner do LocalStack Docker no modo privilegiado. Para obter mais informações, consulte [Privilégio de tempo de execução e recursos do Linux](https://docs.docker.com/engine/containers/run/#runtime-privilege-and-linux-capabilities) (documentação do Docker) e [Segurança para executores autogerenciados](https://docs.gitlab.com/runner/security/) (documentação). GitLab 

## Épicos
<a name="test-aws-infra-localstack-terraform-epics"></a>

### Implante a solução
<a name="deploy-the-solution"></a>


| Tarefa | Description | Habilidades necessárias | 
| --- | --- | --- | 
| Clonar o repositório. | Em um shell bash, insira o comando a seguir. Isso clona a [AWS infraestrutura de teste usando LocalStack o repositório Terraform Tests](https://github.com/aws-samples/localstack-terraform-test) de: GitHub<pre>git clone https://github.com/aws-samples/localstack-terraform-test.git</pre> | DevOps engenheiro | 
| Execute o LocalStack contêiner. | [See the AWS documentation website for more details](http://docs.aws.amazon.com/pt_br/prescriptive-guidance/latest/patterns/test-aws-infra-localstack-terraform.html) | DevOps engenheiro | 
| Inicializar o Terraform. | Insira o seguinte comando para inicializar o Terraform:<pre>terraform init</pre> | DevOps engenheiro | 
| Execute o Terraform Tests. | [See the AWS documentation website for more details](http://docs.aws.amazon.com/pt_br/prescriptive-guidance/latest/patterns/test-aws-infra-localstack-terraform.html) | DevOps engenheiro | 
| Limpe recursos. | Digite o seguinte comando para destruir o LocalStack contêiner:<pre>docker-compose down</pre> | DevOps engenheiro | 

## Solução de problemas
<a name="test-aws-infra-localstack-terraform-troubleshooting"></a>


| Problema | Solução | 
| --- | --- | 
| Resultado `Error: reading DynamoDB Table Item (Files\|README.md): empty` retornado durante a execução do comando `terraform test`. | [See the AWS documentation website for more details](http://docs.aws.amazon.com/pt_br/prescriptive-guidance/latest/patterns/test-aws-infra-localstack-terraform.html) | 

## Recursos relacionados
<a name="test-aws-infra-localstack-terraform-resources"></a>
+ [Introdução ao Terraform: orientação AWS CDK e orientação para AWS CloudFormation especialistas](https://docs.aws.amazon.com/prescriptive-guidance/latest/getting-started-terraform/introduction.html) (orientação AWS prescritiva)
+ [Melhores práticas para usar o Terraform AWS Provider](https://docs.aws.amazon.com/prescriptive-guidance/latest/terraform-aws-provider-best-practices/introduction.html) (orientação AWS prescritiva)
+ [Terraform CI/CD e testes AWS com o novo Terraform Test Framework](https://aws.amazon.com/blogs/devops/terraform-ci-cd-and-testing-on-aws-with-the-new-terraform-test-framework/) (AWS postagem no blog)
+ [Acelerando a entrega de software usando o LocalStack Cloud Emulator de AWS Marketplace](https://aws.amazon.com/blogs/awsmarketplace/accelerating-software-delivery-localstack-cloud-emulator-aws-marketplace/) (AWS postagem no blog)

## Mais informações
<a name="test-aws-infra-localstack-terraform-additional"></a>

**Integração com GitHub ações**

Você pode integrar LocalStack e realizar testes do Terraform em um CI/CD pipeline usando o GitHub Actions. Para obter mais informações, consulte a [documentação de GitHub ações](https://docs.github.com/en/actions). Veja a seguir um exemplo de arquivo de configuração de GitHub ações:

```
name: LocalStack Terraform Test

on:
  push:
    branches:
      - '**'

  workflow_dispatch: {}

jobs:
  localstack-terraform-test:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v4

    - name: Build and Start LocalStack Container
      run: |
        docker compose up -d

    - name: Setup Terraform
      uses: hashicorp/setup-terraform@v3
      with:
        terraform_version: latest

    - name: Run Terraform Init and Validation
      run: |
        terraform init
        terraform validate
        terraform fmt --recursive --check
        terraform plan
        terraform show

    - name: Run Terraform Test
      run: |
        terraform test

    - name: Stop and Delete LocalStack Container
      if: always()
      run: docker compose down
```