Modificando o comportamento padrão do ciclo de vida de recursos do Terraform
Nesse post, vou tentar abordar um pouco sobre o ciclo de vida de recursos do Terraform e falar um pouco sobre um bloco de meta-argumento bem especial.
O que acontece quando eu executo um terraform apply?
De forma resumida, quando você executa um apply
, o comportamento padrão do Terraform é tentar realizar uma (ou mais de uma) das seguintes tarefas:
Criar recursos que existem no seu código mas não estão associados a um objeto da infraestrutura real no state.
Atualizar em execução recursos que tiveram alguma mudança na sua configuração em código.
Destruir recursos que existem no state mas não existem mais no seu código.
Destruir e recriar recursos que tiveram alguma mudança na sua configuração mas não podem ser atualizados em execução por limitações da API do provider.
Como deu pra ver, o apply
não vai só criar ou atualizar recursos em execução, em certos casos vai ser preciso destruir o recurso.
O bloco de meta-argumento lifecycle
Pensando em casos onde por algum motivo você não quer que o Terraform tenha esse comportamento padrão em um apply
, existe um bloco de meta-argumento bem especial chamado lifecycle
:
lifecycle {
}
Esse bloco pode ser adicionado no corpo de um resource
e tem os seguintes argumentos:
create_before_destroy (booleano)
: Caso sejatrue
vai alterar o comportamento para casos onde a atualização precise destruir e recriar o recurso, nesse caso vai primeiro criar o novo recurso e só depois destruir.prevent_destroy (booleano)
: Caso sejatrue
o Terraform vai retornar um erro em qualquerplan
que tenha a destruição de algum recurso.ignore_changes (lista de nomes de atributos)
: Para a lista de atributos recebida, o Terraform vai ignorar mudanças nesses atributos. Um caso especial desse argumento é que caso seja uma lista com a keywordall
o Terraform nunca vai verificar por mudanças.
Abaixo um exemplo com todos os argumentos:
resource "aws_instance" "my_instance" {
....
lifecycle {
prevent_destroy = true
create_before_destroy = true # esse caso vai ser desnecessário porque já existe o prevent_destroy habilitado.
ignore_changes = [
tags,
]
}
}