Olá! Bem-vindo à nossa lição final do curso.
Nas últimas aulas, você trilhou um caminho impressionante: definiu uma infraestrutura complexa como código, desde a rede (VPC, subnets) até a computação (ECS Cluster, Fargate Service, ALB) e, na lição mais recente, transformou essa configuração em um modelo flexível e reutilizável com variáveis e outputs. Agora, sua infraestrutura AWS está de pé, pronta para rodar sua aplicação .NET.
Nesta aula, abordaremos a etapa final e igualmente crucial do ciclo de vida da infraestrutura: a desativação. Nosso objetivo é claro: descomissionar recursos de nuvem usando terraform destroy. Assim como um bom desenvolvedor limpa a memória e os recursos que aloca, um bom praticante de IaC precisa saber como remover de forma limpa e segura a infraestrutura que não é mais necessária. Isso é fundamental para gerenciar custos, limpar ambientes de teste e manter seu ambiente de nuvem organizado.

Este diagrama ilustra o ciclo de vida do Terraform, mostrando como destroy é o passo final lógico após init, plan e apply.
1. O Que é e Como Funciona o terraform destroy?
O comando terraform destroy é a contraparte direta do terraform apply. Enquanto o apply trabalha para criar ou atualizar recursos para que correspondam à sua configuração, o destroy faz o oposto: ele lê o arquivo de estado (terraform.tfstate) para identificar todos os recursos que ele gerencia e, em seguida, os remove sistematicamente do seu provedor de nuvem.
Para uma introdução mais detalhada sobre a mecânica do comando, leia a primeira seção do artigo a seguir.
How to Destroy Resources from Terraform
O artigo "How to Destroy Resources from Terraform" do Spacelift explica como o comando interage com o arquivo de estado e o grafo de dependências para remover a infraestrutura.
Leia a seção "What is the Terraform destroy command?" para entender o seu funcionamento fundamental. Preste atenção em como ele depende do arquivo de estado e na importância de validar o plano de destruição.
O Plano de Destruição: Sua Rede de Segurança
Antes de executar uma operação tão impactante, é vital saber exatamente o que será destruído. Assim como terraform plan mostra o que será criado ou alterado, você pode usar terraform plan -destroy para obter uma prévia completa das ações de destruição. Este comando não remove nada; ele apenas mostra o que o terraform destroy faria.
Executar terraform plan -destroy é a prática recomendada mais importante antes de qualquer destruição real.
2. Aplicação Prática: Removendo Nosso Ambiente ECS
Vamos colocar a teoria em prática e remover o ambiente AWS que você provisionou.
-
Navegue até o diretório do seu projeto Terraform no terminal.
-
Gere o plano de destruição:
terraform plan -destroyVocê verá uma saída longa, detalhando cada recurso que será destruído, desde o
aws_lbaté oaws_vpc. O plano terminará com um resumo, indicando o número de recursos a serem destruídos. Revise essa lista para confirmar que ela corresponde à infraestrutura que você espera remover. -
Execute a destruição:
Agora que você revisou o plano, execute o comando de destruição.terraform destroyO Terraform exibirá o plano de destruição novamente e solicitará uma confirmação final. Esta é sua última chance de voltar atrás. Para prosseguir, digite
yese pressione Enter.

*Esta imagem mostra a saída típica do comando `terraform destroy`, incluindo o prompt de confirmação e a mensagem de sucesso após a remoção dos recursos.*
4. Verificação:
Após a conclusão do comando, o Terraform informará que a destruição foi concluída. Para ter certeza, faça login no seu Console da AWS. Verifique os serviços ECS, EC2 (para o Load Balancer) e VPC. Você verá que os recursos que o Terraform gerenciava foram removidos. Seu arquivo de estado (terraform.tfstate) agora estará praticamente vazio, refletindo que não há mais infraestrutura sob sua gestão.
3. Controle Avançado e Casos de Uso
Embora o comando básico terraform destroy remova tudo, existem cenários onde você pode precisar de mais controle. Dada sua experiência com pipelines de CI/CD, essas opções serão particularmente relevantes.
| Opção | Descrição e Caso de Uso |
|---|---|
terraform destroy -auto-approve |
Executa a destruição sem o prompt interativo de confirmação. Cuidado: use isso apenas em ambientes automatizados (como Jenkins ou GitLab CI) onde a intervenção manual não é possível, por exemplo, para desmontar ambientes de teste efêmeros após a execução dos testes. |
terraform destroy -target=... |
Destrói um recurso específico, ignorando todos os outros. Por exemplo: terraform destroy -target=aws_ecs_service.main. Isso deve ser usado com extrema cautela, principalmente para cenários de reparo, pois pode levar a um "desvio de estado" (state drift), onde seu estado não reflete mais a configuração completa. A abordagem preferida para remover um recurso permanentemente é removê-lo do seu arquivo .tf e executar terraform apply. |
terraform destroy -var-file=... |
Permite que você passe um arquivo de variáveis para o processo de destruição. Isso é útil se sua infraestrutura tiver lógica condicional baseada em variáveis que também afeta a maneira como ela deve ser desmontada. |
Para aprofundar seu conhecimento sobre essas e outras opções, consulte o material a seguir.
Terraform Destroy Command: A Guide to Controlled ...
Para um mergulho mais profundo nas opções de linha de comando, o artigo "Terraform Destroy Command: A Guide to Controlled..." da env0 oferece explicações claras.
Leia a seção "Using terraform destroy Options". Foque em entender os casos de uso para -auto-approve e -target.
Aqui está uma demonstração rápida do uso do -auto-approve em um script.
Take full control of ecs fargate using terraform
Este clipe curto do canal AWS cloud demos mostra a sintaxe do comando com a flag -auto-approve.
Assista ao trecho de 00:38:58 a 00:39:14 para ver o comando terraform destroy -auto-approve em ação. É um exemplo visual de como ele seria usado em um contexto não interativo.
4. Boas Práticas e Mecanismos de Segurança
O terraform destroy é irreversível. Uma execução acidental no ambiente errado pode ser catastrófica. Portanto, é vital implementar salvaguardas.
prevent_destroy
O Terraform fornece um meta-argumento de ciclo de vida chamado prevent_destroy. Quando definido como true em um bloco de recurso, o Terraform gerará um erro se qualquer plano tentar destruir aquele recurso. Isso é essencial para recursos críticos, como bancos de dados de produção.
resource "aws_db_instance" "database" {
# ... outras configurações do banco de dados
lifecycle {
prevent_destroy = true
}
}
Proteção no Nível do Provedor
Muitos provedores de nuvem oferecem suas próprias proteções. Por exemplo, uma instância EC2 na AWS pode ter a disable_api_termination ativada, e um banco de dados RDS pode ter a "Proteção contra exclusão" (Deletion Protection) habilitada. O Terraform respeita essas configurações; se uma delas estiver ativa, a operação destroy falhará para aquele recurso, fornecendo uma camada extra de segurança.
Teste seu entendimento!
Você está gerenciando uma infraestrutura que inclui uma API web (em um aws_ecs_service) e um banco de dados de produção (em um aws_rds_instance). Você precisa de uma garantia robusta de que o banco de dados nunca será excluído acidentalmente por um comando terraform destroy. Que duas medidas, uma no nível do código Terraform e outra no nível do provedor AWS, você pode implementar para proteger o banco de dados?
Show answer
- No código Terraform: Adicionar o bloco
lifecycle { prevent_destroy = true }dentro do recursoaws_rds_instance. - No provedor AWS: Habilitar a "Proteção contra exclusão" (
Deletion Protection) nas configurações da instância RDS diretamente no Console da AWS ou via Terraform.
Para uma lista abrangente de boas práticas ao lidar com a destruição de recursos, o artigo do Spacelift é um excelente guia.
How to Destroy Resources from Terraform
Este artigo consolida várias práticas recomendadas essenciais para usar terraform destroy com segurança.
Leia a seção "Best practices for destroying Terraform resources". Preste atenção especial aos pontos sobre acesso de menor privilégio (least privileged access) e o uso de políticas em CI/CD, que se conectam diretamente à sua experiência profissional.
Conclusão e Encerramento do Curso
Parabéns! Você não apenas aprendeu a provisionar uma infraestrutura de nuvem complexa, mas também a gerenciá-la de forma flexível e, agora, a desativá-la com segurança. Você completou todo o ciclo de vida do IaC com o Terraform.
Principais Pontos Desta Lição:
terraform destroyé o comando para remover de forma limpa todos os recursos gerenciados pelo Terraform em um determinado estado.- É uma operação irreversível e deve ser usada com o máximo cuidado.
- Sempre use
terraform plan -destroycomo uma etapa de revisão antes de executar a destruição real. - Flags como
-auto-approvesão para automação, enquanto-targeté para situações de exceção. - Use salvaguardas como o bloco
lifecycle { prevent_destroy = true }e as proteções do provedor de nuvem para seus recursos mais críticos.
Jornada Concluída
Este é o final do nosso curso. Olhando para trás, você percorreu um caminho notável, desde refrescar os conceitos fundamentais do Docker até a orquestração de um aplicativo .NET moderno com o .NET Aspire e, finalmente, a implantação e gerenciamento de toda a infraestrutura na AWS usando Terraform. Você agora possui um conjunto de habilidades altamente relevante e prático para o desenvolvimento de aplicações nativas da nuvem.
Espero que este curso tenha fornecido a base sólida que você buscava e que você se sinta confiante para aplicar esses conceitos em seus projetos pessoais e profissionais. Boa sorte em suas futuras empreitadas no mundo da tecnologia