Este documento fornece diretrizes e recomendações para testar o Terraform para módulos e configurações. Trusted Cloud
Por vezes, os testes de módulos e configurações do Terraform seguem padrões e convenções diferentes dos testes de código de aplicações. Embora os testes de código de aplicação envolvam principalmente testar a lógica empresarial das próprias aplicações, os testes completos de código de infraestrutura requerem a implementação de recursos reais na nuvem para minimizar o risco de falhas de produção. Existem algumas considerações quando executa testes do Terraform:
- A execução de um teste do Terraform cria, modifica e destrói infraestrutura real, pelo que os testes podem ser demorados e dispendiosos.
- Não pode testar puramente as unidades de uma arquitetura ponto a ponto. A melhor abordagem é dividir a arquitetura em módulos e testá-los individualmente. As vantagens desta abordagem incluem um desenvolvimento iterativo mais rápido devido ao tempo de execução mais rápido dos testes, custos reduzidos para cada teste e menores probabilidades de falhas nos testes devido a fatores fora do seu controlo.
- Evite reutilizar o estado, se possível. Pode haver situações em que está a fazer testes com configurações que partilham dados com outras configurações, mas, idealmente, cada teste deve ser independente e não deve reutilizar o estado entre testes.
Use primeiro métodos de teste menos dispendiosos
Existem vários métodos que pode usar para testar o Terraform. Por ordem ascendente de custo, tempo de execução e profundidade, incluem o seguinte:
- Análise estática: testar a sintaxe e a estrutura da sua configuração sem implementar recursos, usando ferramentas como compiladores, linters e testes de execução. Para o fazer, use
terraform validate
- Testes de integração de módulos: para garantir que os módulos funcionam corretamente, teste os módulos individuais isoladamente. Os testes de integração para módulos envolvem a implementação do módulo num ambiente de teste e a verificação de que os recursos esperados são criados. Existem várias frameworks de testes que facilitam a escrita de testes, como se segue:
- Testes ponto a ponto: ao estender a abordagem de testes de integração a um ambiente completo, pode confirmar que vários módulos funcionam em conjunto. Nesta abordagem, implemente todos os módulos que compõem a arquitetura num ambiente de teste novo. Idealmente, o ambiente de teste é o mais semelhante possível ao seu ambiente de produção. Isto é dispendioso, mas oferece a maior confiança de que as alterações não vão danificar o seu ambiente de produção.
Comece devagar
Certifique-se de que os testes se baseiam uns nos outros de forma iterativa. Considere executar primeiro testes mais pequenos e, em seguida, avançar para testes mais complexos, usando uma abordagem de reprovação rápida.
Aleatorizar IDs de projetos e nomes de recursos
Para evitar conflitos de nomes, certifique-se de que as suas configurações têm um ID do projeto globalmente exclusivo e nomes de recursos não sobrepostos em cada projeto. Para tal, use espaços de nomes para os seus recursos. O Terraform tem um fornecedor aleatório integrado para este fim.
Use um ambiente separado para testes
Durante os testes, são criados e eliminados muitos recursos. Certifique-se de que o ambiente está isolado dos projetos de desenvolvimento ou produção para evitar eliminações acidentais durante a limpeza de recursos. A melhor abordagem é fazer com que cada teste crie um novo projeto ou pasta. Para evitar uma configuração incorreta, considere criar contas de serviço especificamente para cada execução de teste.
Limpe todos os recursos
Testar o código de infraestrutura significa que está a implementar recursos reais. Para evitar incorrer em custos, pondere implementar um passo de limpeza.
Para destruir todos os objetos remotos geridos por uma configuração específica, use o comando
terraform destroy
. Algumas frameworks de testes têm um passo de limpeza incorporado para si. Por exemplo, se estiver a usar o Terratest, adicione defer terraform.Destroy(t, terraformOptions)
ao seu teste. Se estiver a usar o
Kitchen-Terraform, elimine o seu espaço de trabalho com o comando
terraform kitchen delete WORKSPACE_NAME
.
Depois de executar o comando terraform destroy
, execute também procedimentos de limpeza adicionais para remover todos os recursos que o Terraform não conseguiu destruir. Para tal, elimine todos os projetos usados para a execução de testes ou use uma ferramenta como o módulo project_cleanup
.
Otimize o tempo de execução do teste
Para otimizar o tempo de execução do teste, use as seguintes abordagens:
- Execute testes em paralelo. Algumas estruturas de testes suportam a execução de vários testes do Terraform em simultâneo.
- Por exemplo, com o Terratest, pode fazê-lo adicionando
t.Parallel()
após a definição da função de teste.
- Por exemplo, com o Terratest, pode fazê-lo adicionando
- Teste por fases. Separe os testes em configurações independentes que podem ser testadas separadamente. Esta abordagem elimina a necessidade de passar por todas as fases quando executa um teste e acelera o ciclo de desenvolvimento iterativo.
- Por exemplo, no Kitchen-Terraform, divida os testes em conjuntos separados. Quando iterar, execute cada conjunto de testes de forma independente.
- Da mesma forma, usando o Terratest, envolva cada fase do teste com
stage(t, STAGE_NAME, CORRESPONDING_TESTFUNCTION)
. Defina variáveis de ambiente que indicam os testes a executar. Por exemplo,SKIP
STAGE_NAME="true"
. - O framework de testes de planos suporta a execução faseada.
O que se segue?
- Saiba mais sobre as práticas recomendadas gerais de estilo e estrutura para o Terraform no Trusted Cloud.
- Saiba mais sobre as práticas recomendadas quando usar módulos raiz do Terraform.