3 dicas para gerenciar o drift causado por alterações manuais no Terraform
Stephane Jourdan
22 de maio de 2020
0 minutos de leituraNota do editor: Esta publicação foi originalmente publicada em CloudSkiff.com. A CloudSkiff se juntou à Snyk em outubro de 2021.
Como gerenciar o drift causado por alterações manuais no Terraform? Se alguém altera algo manualmente na infraestrutura, como você lida com isso no Terraform e executa o Terraform plan da próxima vez? Há diferentes maneiras de gerenciar o drift causado por alterações manuais na sua infraestrutura com Terraform, dependendo da situação.
Veja três opções:
Altere o código manualmente para atualizar seu State
Recrie o ambiente existente no Terraform usando uma ferramenta
Importe partes específicas do novo código usando o subcomando Terraform import
1. Altere o código manualmente para atualizar seu State
É sempre mais fácil começar com um exemplo. Digamos que alguém da sua equipe tenha alterado manualmente um grupo de segurança, por exemplo, abrindo uma porta HTTP para uma sub-rede específica, e você descubra isso no próximo terraform apply. (Este é um caso simples.)
Depois dessa ação, você verá uma diferença no seu terraform output (seja no CI ou no seu laptop). Isso significa que você pode adicionar essa diferença como um trecho diretamente ao seu código Terraform e aplicá-lo. Em outras palavras, você precisará adicionar o código manualmente após a implantação. Na próxima vez que executar um terraform apply, o Terraform perceberá que o estado não inclui esse novo item (no nosso exemplo, a permissão para HTTP em uma sub-rede) e solicitará que seu provedor de nuvem (por exemplo, a AWS) faça isso. A AWS responderá: “Isso já está configurado.”
Nesse caso simples, a diferença aparece apenas no arquivo TFstate, e você resolveu o problema manualmente. É um pouco como resolver um conflito durante um merge do Git.
As etapas principais são:
Escreva o código que falta
Envie-o
Aplique-o
O delta desaparece
E o estado final é atualizado no arquivo de estado
2. Recrie o ambiente existente no Terraform
Se o caso for bem mais complexo, como uma VM inteira ou, pior ainda, um cluster Kubernetes completo com 10.000 nós criado manualmente, você obviamente não vai tentar escrever o código manualmente como fiz no exemplo simples. Recomendo usar uma ferramenta como Terraformer ou Terraforming.
Esse tipo de ferramenta examina as contas do seu provedor de nuvem em busca de recursos e parâmetros. Depois de coletar todos os parâmetros (por exemplo, em uma VM: disco rígido, endereço IP, tipo de sistema operacional etc.), a ferramenta transforma tudo isso em código Terraform válido e cria um TFState a partir do código.
O Terraformer foi criado pela equipe de SRE do Waze no Google, em Tel Aviv. Ele faz cerca de 80% do trabalho; você só precisa adaptar alguns detalhes aqui e ali.
Ao usar essa ferramenta, você terá três elementos:
O código que você acabou de extrair
Uma implantação manual existente
Um arquivo de estado
O problema agora é que esses elementos ainda não estão realmente integrados ao repositório da sua infraestrutura existente. Esse é o tema do próximo tópico: escolher o que importar.
3. Importe partes específicas do novo código usando o subcomando Terraform import
Depois de ter o código, você pode importá-lo usando o subcomando terraform import para escolher com precisão o que será importado.
Digamos, por exemplo, que você tenha iniciado manualmente um endereço IP específico para um balanceador de carga antigo, mas a produção precise manter esse endereço IP e você queira garantir que ele seja gerenciado pelo Terraform. Você pode escrever o código Terraform correspondente e importar o ID correspondente na AWS.
Isso é bem diferente de simplesmente enviar e aplicar algum código e verificar se “funciona” do outro lado. Você tem esse código e sabe que, se executá-lo agora, ele criará uma duplicata (neste exemplo específico, porque pode haver centenas de endereços IP com um nome; não era o caso do exemplo anterior com o grupo de segurança, em que só pode haver uma porta 80 aberta).
Neste exemplo, eu identificaria esse endereço IP específico usando uma ferramenta de importação, como o Terraformer, e o copiaria para o meu código existente. Em seguida, não aplicaria o código diretamente; faria a importação com o subcomando terraform import.
Veja um exemplo de como é o comando terraform import.


Considerações finais sobre como gerenciar o drift causado por alterações manuais no Terraform
Dependendo da situação, estas são as três maneiras que recomendo para gerenciar alterações manuais na sua infraestrutura com Terraform:
Escreva o código e aplique-o para pequenas alterações que não precisam ser importadas novamente, deixando que ele seja reconciliado automaticamente com o arquivo de estado.
Importe o novo ambiente e recrie-o no Terraform com uma ferramenta como o Terraformer.
E/ou importe manualmente componentes muito específicos usando o subcomando Terraform import.
Proteja seu código Terraform
Snyk IaC protege suas configurações do Terraform (e também seus templates de Kubernetes, CloudFormation e ARM!) enquanto você programa, com correções guiadas para você fazer o merge e seguir em frente. Você pode testar enquanto escreve, monitorar alterações nos seus repositórios Git e automatizar testes nos pipelines de build antes da implantação. Leva poucos minutos para começar com um plano gratuito, enquanto uma violação causada por uma configuração incorreta de IaC pode gerar danos permanentes. Cadastre-se abaixo e comece a proteger suas configurações. Acesse este artigo para saber mais sobre como detectar e evitar o drift de configuração.
Proteja a infraestrutura desde a origem
A Snyk automatiza a segurança e a conformidade de IaC nos fluxos de trabalho e detecta recursos com configurações divergentes ou ausentes.



