Teste a AWS infraestrutura usando LocalStack e Terraform Tests - Recomendações da AWS

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

Ivan Girardi e Ioannis Kalyvas, Amazon Web Services

Resumo

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

Pré-requisitos

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.

  • LocalStack fornece serviços de emulação para diferentes. AWS APIs Para obter uma lista completa, consulte AWS Service Feature Coverage. Alguns recursos avançados podem exigir uma assinatura do LocalStack Pro.

Arquitetura

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.

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.

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

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

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

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

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

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

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

Serviços da AWS

  • CloudWatchA Amazon 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 é um serviço de banco de dados NoSQL totalmente gerenciado que fornece performance rápida, previsível e escalável.

  • O AWS Lambda é 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) é 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é 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 é 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 é uma ferramenta para definir e executar aplicações com diversos contêineres.

  • LocalStacké 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 é uma ferramenta de IaC HashiCorp que ajuda você a criar e gerenciar recursos na nuvem e no local.

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

Práticas recomendadas

Épicos

TarefaDescriptionHabilidades 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 de: GitHub

git clone https://github.com/aws-samples/localstack-terraform-test.git
DevOps engenheiro

Execute o LocalStack contêiner.

  1. Insira o seguinte comando para navegar até o repositório clonado:

    cd localstack-terraform-test
  2. Digite o comando a seguir para iniciar o contêiner LocalStack Docker no modo desanexado:

    docker-compose up -d
  3. Espere até que o contêiner LocalStack Docker esteja operacional.

DevOps engenheiro

Inicializar o Terraform.

Insira o seguinte comando para inicializar o Terraform:

terraform init
DevOps engenheiro

Execute o Terraform Tests.

  1. Digite o seguinte comando para executar o Terraform Tests:

    terraform test
  2. Verifique se todos os testes foram concluídos com êxito. A saída deve ser semelhante ao seguinte:

    Success! 3 passed, 0 failed.
DevOps engenheiro

Limpe recursos.

Digite o seguinte comando para destruir o LocalStack contêiner:

docker-compose down
DevOps engenheiro

Solução de problemas

ProblemaSolução

Resultado Error: reading DynamoDB Table Item (Files|README.md): empty retornado durante a execução do comando terraform test.

  1. Digite novamente o comando terraform test.

  2. Caso o erro persista, edite o arquivo main.tf para aumentar o tempo de espera para um valor superior a 15 segundos:

    resource "time_sleep" "wait" { create_duration = "15s" triggers = { s3_object = local.key_json } }

Recursos relacionados

Mais informações

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