Implementar testes de conformidade com o Terraform e o Azure

Terraform permite a definição, visualização e implantação de infraestrutura em nuvem. Usando Terraform, você cria arquivos de configuração usando a sintaxe HCL. A sintaxe HCL permite especificar 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 na infraestrutura antes que elas sejam implantadas. Depois de verificar as alterações, você aplica o plano de execução para implantar a infraestrutura.

Muitas vezes, os testes de conformidade fazem parte do processo de integração contínua e são usados 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. Os testes de conformidade seriam utilizados para impor regras nestes e em muitos outros cenários.

Neste artigo, vai aprender a:

  • Entender quando usar testes de conformidade
  • Saiba como fazer um teste de conformidade
  • Veja e execute um exemplo de teste de conformidade

1. Configure seu ambiente

  • Subscrição do Azure: se não tem uma subscrição do Azure, crie uma conta gratuita antes de começar.

2. Compreender os testes e 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. Os testes de conformidade também são conhecidos como testes de conformidade.

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

Com os testes de conformidade, há dois conceitos importantes a considerar: testes de conformidade e verificações de conformidade.

  • Os testes de conformidade garantem que a saída de cada fase do ciclo de vida do desenvolvimento esteja em conformidade com os requisitos acordados.
  • Os controlos de conformidade devem ser integrados no ciclo de desenvolvimento no início dos projetos. Tentar adicionar verificações de conformidade em um estágio posterior torna-se cada vez mais difícil quando o requisito em si não é adequadamente documentado.

Fazer verificações de conformidade é simples. Um conjunto de normas e procedimentos é desenvolvido e documentado para cada fase do ciclo de vida do desenvolvimento. Os resultados de cada fase são comparados com os requisitos documentados. Os resultados do teste são quaisquer "lacunas" em não conformidade com as normas pré-determinadas. Os testes de conformidade são realizados através 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 quebram 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 é uma supervisão para garantir a conformidade com as regras estabelecidas.

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

A conformidade com a Terraform concentra-se em testes negativos. O teste negativo é o processo de garantir que um sistema possa lidar graciosamente com entradas inesperadas ou comportamentos indesejados. Fuzzing é um exemplo de teste negativo. Com a difusão, um sistema que recebe entrada é testado para garantir que ele possa lidar com a entrada inesperada com segurança.

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 de API remotas 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. Terraform-compliance - uma ferramenta gratuita e de código aberto - fornece esta funcionalidade para configurações Terraform.

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

A ferramenta de conformidade Terraform fornece uma estrutura de teste onde você cria políticas como o exemplo. Em seguida, execute essas políticas em relação ao seu plano de execução do Terraform.

A conformidade com Terraform permite que você aplique princípios de BDD, ou desenvolvimento orientado por comportamento. O BDD é um processo colaborativo onde todas as partes interessadas trabalham juntas para definir o que um sistema deve fazer. Essas partes interessadas geralmente incluem os desenvolvedores, testadores e qualquer pessoa com interesse no sistema que está sendo desenvolvido ou que será impactado por ele. O objetivo do BDD é incentivar as equipes a construir exemplos concretos que expressem um entendimento 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 BDD. A regra é expressa primeiro usando Cucumber, que é uma ferramenta usada para suportar BDD.

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

A regra anterior é traduzida da seguinte forma:

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

O código Terraform HCL aderiria então à regra da seguinte forma.

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 recurso 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 para 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 do teste de conformidade

Nesta seção, você baixa e testa o exemplo.

  1. Dentro do diretório de exemplo, navegue até o src diretório.

  2. Execute 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 plano de terraforma 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 para a etapa de conformidade.

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

    docker pull eerkunt/terraform-compliance
    
  7. Execute o 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:

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

    Example of a failed test

  8. Corrija o erro modificando main.tf da seguinte forma (onde a Role e Creator tag 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 novo plano de execução.

    terraform plan -out main.tfplan
    
  3. Execute 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 o 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
    

    Example of a successful test

  5. Execute 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óximos passos