Implementar um teste de conformidade usando 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, um teste de conformidade faz parte do processo de integração contínua. Além disso, ele é usado para garantir o cumprimento de políticas definidas pelo usuário. Por exemplo, você pode definir convenções de nomenclatura geopolítica para os recursos do Azure. Outro exemplo comum é criar máquinas virtuais de um subconjunto definido de imagens. O teste de conformidade é usado para impor regras nesses exemplos, bem como em vários outros cenários.

Neste artigo, você aprenderá como:

  • Entender quando usar o teste de conformidade
  • Saber como implementar um teste de conformidade
  • Conferir e executar um teste de conformidade de exemplo

1. Configurar seu ambiente

  • Assinatura do Azure: caso você não tenha 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 comando pip install terraform-compliance.

  • Códigos e recursos de exemplo: baixe o projeto de teste de conformidade do GitHub usando a ferramenta DownGit, depois descompacte-o em um novo diretório para incluir o código de exemplo. Esse diretório é conhecido como diretório de exemplo.

2. Entender os testes e as verificações de conformidade

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

A maioria das equipes de software faz uma análise para verificar se os padrões estão sendo aplicados e implementados corretamente. Em geral trabalhando simultaneamente para melhorar os padrões que, por sua vez, levam à melhora da qualidade.

Em relação ao teste de conformidade, considere dois conceitos importantes: testes de conformidade e verificações de conformidade.

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

A realização de verificações de conformidade é uma tarefa direta. 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 ambientes que apresentam falha quando vários desenvolvedores aplicam alterações incompatíveis. Digamos que uma pessoa esteja trabalhando em uma alteração e aplique recursos como, por exemplo, a criação de uma VM em um ambiente de teste. Então, outra pessoa aplica uma versão diferente do código que provisiona uma versão diferente daquela VM. Neste cenário, é preciso dispor de uma supervisão para verificar a conformidade com as regras estabelecidas.

Uma forma de resolver esse problema seria definir uma política de marcação de recursos, como ocorre com as marcas role e creator. Após definir as políticas, uma ferramenta como o Terraform-compliance será usada para garantir que as políticas sejam seguidas.

O Terraform-compliance se concentra em testes negativos. O teste negativo é o processo de verificar se um sistema é capaz de gerenciar com tranquilidade entradas inesperadas ou comportamentos indesejados. O teste de fuzzing é um exemplo de teste negativo. Com o teste de fuzzing, um sistema que recebe entradas é testado para garantir que seja capaz de gerenciar com segurança entradas inesperadas.

Felizmente, o Terraform é uma camada de abstração para qualquer API que cria, atualiza ou destrói 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 contra APIs de nuvem, ainda precisamos de uma maneira de garantir que o código implantado na infraestrutura siga políticas específicas. O Terraform-compliance, uma ferramenta gratuita e de software livre, 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 Terraform-compliance fornece uma estrutura de teste na qual você cria políticas como no exemplo. Em seguida, você executa essas políticas no plano de execução do Terraform.

O Terraform-compliance permite que você aplique os princípios do BDD (Desenvolvimento Orientado por Comportamento). O BDD é um processo de colaboração em que todos os stakeholders trabalham juntos para definir o que um determinado sistema deve fazer. Esses stakeholders geralmente incluem desenvolvedores, testadores e qualquer pessoa que tenha interesse no sistema que está sendo desenvolvido ou que seja afetada por ele. O objetivo do BDD é incentivar as equipes a criar exemplos concretos que expressem um entendimento comum sobre como o sistema deve se comportar.

3. Examinar um teste de conformidade de exemplo

Anteriormente neste artigo, você leu sobre um exemplo de teste de conformidade que criava uma VM para um ambiente de teste. Esta seção mostra como traduzir aquele exemplo em um cenário e recurso do BDD. A regra é expressa primeiro usando o Cucumber, 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

Então, o código HCL do Terraform faria adesão à regra conforme a seguir.

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 poderia ser escrita como um cenário de recurso do 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 seguinte código mostra um teste para uma marca 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. Executar um teste de conformidade de exemplo

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

  1. No diretório de exemplo, acesse o diretório src.

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

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

    terraform validate
    

    Pontos principais:

    • Veja uma mensagem indicando se 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 terraform show para converter o plano de execução em JSON na etapa de conformidade.

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

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

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

    Pontos principais:

    • Haverá uma falha no teste porque enquanto a primeira regra é executada com êxito exigindo a presença de marcas, a segunda regra tem uma falha, pois as marcas Role e Creator estão ausentes.

    Example of a failed test

  8. Corrija o erro alterando main.tf, conforme mostrado abaixo (em que as marcas Role e Creator são adicionadas).

      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 plano de execução.

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

    terraform show -json main.tfplan > main.tfplan.json
    
  4. Execute docker run novamente para testar a configuração. Caso a especificação completa tenha sido implementada, o teste terá êxito.

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

    Example of a successful test

  5. Execute a aplicação do Terraform para aplicar o plano de execução.

    terraform apply main.tfplan -target=random_uuid.uuid
    

    Pontos principais:

    • Um grupo de recursos será 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