Compartilhar via


Implementar testes de conformidade com o Terraform e o Azure

O Terraform permite a definição, a visualização e a implantação da infraestrutura de nuvem. Usando o Terraform, você cria arquivos de configuração usando sintaxe de HCL. A sintaxe da HCL permite que você especifique o provedor de nuvem, como o Azure, e os elementos que compõem sua infraestrutura de nuvem. Depois de criar os arquivos de configuração, você cria um plano de execução que permite visualizar as alterações de infraestrutura antes de serem implantadas. Depois de verificar as alterações, aplique o plano de execução para implantar a infraestrutura.

Muitas vezes, o teste de conformidade faz parte do processo de integração contínua e é usado para garantir que as políticas definidas pelo usuário sejam seguidas. Por exemplo, você pode definir convenções de nomenclatura geopolítica para seus recursos do Azure. Outro exemplo comum é a criação de máquinas virtuais a partir de um subconjunto definido de imagens. O teste de conformidade seria usado para impor regras nesses e em muitos outros cenários.

Neste artigo, você aprenderá a:

  • Entender quando usar o teste de conformidade
  • Saiba como fazer um teste de conformidade
  • Ver e executar um exemplo de teste de conformidade

1. Configurar seu ambiente

  • Assinatura do Azure: Se você não tiver uma assinatura do Azure, crie uma conta gratuita antes de começar.
  • Docker:Instale o Docker.

  • Python:Instale o Python.

  • Ferramenta de conformidade do Terraform: Instale a ferramenta de conformidade do Terraform executando o seguinte comando: pip install terraform-compliance.

  • Exemplo de código e recursos: Usando a ferramenta DownGit, baixe do GitHub o projeto de teste de conformidade e descompacte em um novo diretório para conter o código de exemplo. Esse diretório é conhecido como o diretório de exemplo.

2. Entender o teste de conformidade e as verificações

O teste de conformidade é uma técnica de teste não funcional para determinar se um sistema atende aos padrões prescritos. O teste de conformidade também é conhecido como teste de conformidade.

A maioria das equipes de software faz uma análise para verificar se os padrões são aplicados e implementados corretamente. Muitas vezes trabalhando simultaneamente para melhorar os padrões que, por sua vez, levam a um aumento da qualidade.

Com o teste de conformidade, há dois conceitos importantes a serem considerados: teste de conformidade e verificações de conformidade.

  • O teste de conformidade garante que a saída de cada fase do ciclo de vida de desenvolvimento esteja em conformidade com os requisitos acordados.
  • As verificações de conformidade devem ser integradas ao ciclo de desenvolvimento no início dos projetos. A tentativa de adicionar verificações de conformidade em um estágio posterior torna-se cada vez mais difícil quando o próprio requisito não está devidamente documentado.

Fazer verificações de conformidade é simples. Um conjunto de padrões e procedimentos é desenvolvido e documentado para cada fase do ciclo de vida de desenvolvimento. A saída de cada fase é comparada com os requisitos documentados. Os resultados do teste são eventuais "lacunas" quando não está em conformidade com os padrões predeterminados. O teste de conformidade é feito por meio do processo de inspeção e o resultado do processo de revisão deve ser documentado.

Vamos dar uma olhada em um exemplo específico.

Um problema comum são os ambientes que param de funcionar quando vários desenvolvedores aplicam alterações incompatíveis. Digamos que uma pessoa trabalhe em uma alteração e aplique recursos como a criação de uma VM em um ambiente de teste. Em seguida, outra pessoa aplica uma versão diferente do código que provisiona uma versão diferente dessa VM. O que é necessário aqui é a supervisão para garantir a conformidade com as regras declaradas.

Uma maneira de resolver esse problema seria definir uma política de marcação dos recursos, como com as tags role e creator. Depois de definir as políticas, uma ferramenta como Terraform-compliance é usada para garantir que as políticas sejam seguidas.

O Terraform-compliance se concentra em testes negativos. O teste negativo é o processo de garantir que um sistema possa lidar normalmente com entrada inesperada ou comportamento indesejado. Fuzzing é um exemplo de teste negativo. Com o fuzzing, um sistema que recebe entrada é testado para garantir que ele possa, com segurança, lidar com entradas inesperadas.

Felizmente, o Terraform é uma camada de abstração para qualquer API que crie, atualize ou destrua entidades de infraestrutura de nuvem. O Terraform também garante que a configuração local e as respostas da API remota estejam sincronizadas. Como o Terraform é usado principalmente em apis de nuvem, ainda precisamos de uma maneira de garantir que o código implantado na infraestrutura siga políticas específicas. Terraform-compliance – uma ferramenta gratuita e de código aberto – fornece essa funcionalidade para configurações do Terraform.

Usando o exemplo de VM, uma política de conformidade pode ser a seguinte: "Se você estiver criando um recurso do Azure, ele deverá conter uma marca".

A ferramenta de conformidade do Terraform fornece uma estrutura de teste na qual você cria políticas como o exemplo. Em seguida, você executa essas políticas no plano de execução do Terraform.

A conformidade com o Terraform permite que você aplique princípios de BDD ou desenvolvimento controlado por comportamento. O BDD é um processo colaborativo em que todos os stakeholders trabalham juntos para definir o que um sistema deve fazer. Esses stakeholders geralmente incluem os desenvolvedores, testadores e qualquer pessoa com interesse investido em - ou quem será afetado pelo - sistema que está sendo desenvolvido. O objetivo do BDD é incentivar as equipes a criar exemplos concretos que expressem uma compreensão comum de como o sistema deve se comportar.

3. Examinar um exemplo de teste de conformidade

Anteriormente neste artigo, você leu sobre um exemplo de teste de conformidade da criação de uma VM para um ambiente de teste. Esta seção mostra como traduzir esse exemplo em um recurso e cenário do BDD. A regra é expressa pela primeira vez usando o Pepino, que é uma ferramenta usada para dar suporte ao BDD.

when creating Azure resources, every new resource should have a tag

A regra anterior é traduzida da seguinte maneira:

If the resource supports tags
Then it must contain a tag
And its value must not be null

O código HCL do Terraform seguiria a regra da seguinte maneira.

resource "random_uuid" "uuid" {}

resource "azurerm_resource_group" "rg" {
  name     = "rg-hello-tf-${random_uuid.uuid.result}"
  location = var.location

  tags = {
    environment = "dev"
    application = "Azure Compliance"
  } 
}

A primeira política pode ser escrita como um cenário de funcionalidade BDD da seguinte maneira:

Feature: Test tagging compliance  # /target/src/features/tagging.feature
    Scenario: Ensure all resources have tags
        If the resource supports tags
        Then it must contain a tag
        And its value must not be null

O código a seguir mostra um teste de uma tag específica:

Scenario Outline: Ensure that specific tags are defined
    If the resource supports tags
    Then it must contain a tag <tags>
    And its value must match the "<value>" regex

    Examples:
      | tags        | value              |
      | Creator     | .+                 |
      | Application | .+                 |
      | Role        | .+                 |
      | Environment | ^(prod\|uat\|dev)$ |

4. Execute o exemplo de teste de conformidade

Nesta seção, você baixará e testará o exemplo.

  1. Navegue até o diretório src no diretório de exemplo.

  2. Execute o terraform init para inicializar o diretório de trabalho.

    terraform init
    
  3. Execute terraform validate para validar a sintaxe dos arquivos de configuração.

    terraform validate
    

    Pontos principais:

    • Você verá uma mensagem indicando que a configuração do Terraform é válida.
  4. Execute o comando terraform plan para criar um plano de execução.

    terraform plan -out main.tfplan
    
  5. Execute o terraform show para converter o plano de execução em JSON para a etapa de conformidade.

    terraform show -json main.tfplan > main.tfplan.json
    
  6. Execute docker pull para baixar a imagem terraform-compliance.

    docker pull eerkunt/terraform-compliance
    
  7. Execute docker run para executar os testes em um contêiner Docker.

    docker run --rm -v $PWD:/target -it eerkunt/terraform-compliance -f features -p main.tfplan.json
    

    Pontos principais:

    • O teste falhará porque, enquanto a primeira regra que exige a existência de tags for bem-sucedida, a segunda regra falhará porque as tags Role e Creator estão ausentes.

    Exemplo de um teste com falha

  8. Corrija o erro modificando main.tf da seguinte maneira (onde são adicionadas as marcas Role e Creator).

      tags = {
        Environment = "dev"
        Application = "Azure Compliance"
        Creator     = "Azure Compliance"
        Role        = "Azure Compliance"
      } 
    
    

    Pontos principais:

    • A configuração agora está em conformidade com a política.

5. Verificar os resultados

  1. Execute terraform validate novamente para verificar a sintaxe.

    terraform validate
    
  2. Execute terraform plan novamente para criar um novo plano de execução.

    terraform plan -out main.tfplan
    
  3. Execute o terraform show para converter o plano de execução em JSON para a etapa de conformidade.

    terraform show -json main.tfplan > main.tfplan.json
    
  4. Execute docker run novamente para testar a configuração. Se a especificação completa tiver sido implementada, o teste será bem-sucedido.

    docker run --rm -v $PWD:/target -it eerkunt/terraform-compliance -f features -p main.tfplan.json
    

    Exemplo de um teste bem-sucedido

  5. Execute o comando terraform apply para aplicar o plano de execução.

    terraform apply main.tfplan -target=random_uuid.uuid
    

    Pontos principais:

    • Um grupo de recursos é criado com um nome seguindo o padrão: rg-hello-tf-<random_number>.

Solucionar problemas do Terraform no Azure

Solucionar problemas comuns ao usar o Terraform no Azure

Próximas etapas