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: Se você não tiver uma assinatura do Azure, crie uma conta gratuita antes de começar.
Configurar o Terraform: se ainda não tiver feito isso, configure o Terraform usando uma das seguintes opções:
Docker: instalar o Docker.
Python: instalar 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 remotas da API estejam sincronizadas. Como o Terraform é usado principalmente em APIs do Cloud, 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.
No diretório de exemplo, acesse o diretório
src
.Execute o comando terraform init para inicializar o diretório de trabalho.
terraform init
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.
Execute o comando terraform plan para criar um plano de execução.
terraform plan -out main.tfplan
Execute terraform show para converter o plano de execução em JSON na etapa de conformidade.
terraform show -json main.tfplan > main.tfplan.json
Execute o comando docker pull para baixar a imagem do Terraform-compliance.
docker pull eerkunt/terraform-compliance
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
eCreator
estão ausentes.
- 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
Corrija o erro alterando
main.tf
, conforme mostrado abaixo (em que as marcasRole
eCreator
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
Execute
terraform validate
novamente para verificar a sintaxe.terraform validate
Execute
terraform plan
novamente para criar um plano de execução.terraform plan -out main.tfplan
Execute terraform show para converter o plano de execução em JSON na etapa de conformidade.
terraform show -json main.tfplan > main.tfplan.json
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
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>
.
- Um grupo de recursos será criado com um nome seguindo o padrão
Solucionar problemas do Terraform no Azure
Solucionar problemas comuns ao usar o Terraform no Azure