O null_resource
do Terraform foi introduzido em 2014 e, de acordo com a Hashicorp¹, é o 3º provedor mais baixado no Registro do Terraform.
Esse recurso é amplamente utilizado porque ele pode ser usado como um contêiner vazio, ou uma casca de recurso. Dentro deste contêiner, os usuários podem definir e executar códigos ou scripts arbitrários sem que estejam vinculados a um ciclo de vida de recurso.
Um caso de uso para o null_resource
no Terraform é acionar processos externos ou executar ações que não estão diretamente relacionadas a nenhum recurso de infraestrutura, como executar um script personalizado ou executar um comando remoto em um servidor.
O exemplo abaixo mostra como imprimir “Ola Mundo” no terminal sempre que o ID da instância EC2 mudar.
resource "aws_instance" "ec2_example" {
ami = "ami-XXXXXXXX"
instance_type = "t2.micro"
}
resource "null_resource" "null_resource_hello" {
# Define quando o provisionador deve ser executado
triggers = {
# O provisionador é executado quando o `id` da instância EC2 muda
id = aws_instance.ec2_example.id
}
provisioner "local-exec" {
command = "echo Ola Mundo"
}
}
Agora, se o null_resource
é tão popular e útil, por que devemos parar de usá-lo?
Bem… o motivo é…
Um novo substituto nativo para o null_resource
Sim, um motivo para você parar de usar o null_resource
é que o novo Terraform v1.4 suporta nativamente um recurso de contêiner vazio². Isso também significa que você não precisa mais configurar o null provider, o que tornará seu código um pouco mais limpo.
O nome do novo recurso é terraform_data
. Ele está disponível por meio de um provedor integrado terraform.io/builtin/terraform
e, de acordo com o anúncio¹, ele suporta todas as mesmas funcionalidades do null_resource
.
Abaixo está um exemplo de como implementar o mesmo código apresentado anteriormente, mas usando o terraform_data
em vez do null_resource
.
resource "aws_instance" "ec2_example" {
ami = "ami-XXXXXXXX"
instance_type = "t2.micro"
}
resource "terraform_data" "tf_data_resource_hello" {
# Define quando o provisionador deve ser executado
triggers_replace = [
# O provisionador é executado quando o `id` da instância EC2 muda
aws_instance.ec2_example.id
]
provisioner "local-exec" {
command = "echo Ola Mundo"
}
}
Há duas principais diferenças entre o terraform_data
e o null_resource
.
- O recurso é chamado de
terraform_data
em vez denull_resource
- O gatilho
terraform_data
é chamado de triggers_replace em vez de triggers.
Quando você não deve usar o recurso terraform_data
?
A regra geral do null_resource
também se aplica ao terraform_data
. Ele deve ser usado com moderação apenas quando não houver outra opção adequada disponível. Exemplos de quando você não deve usar o recurso são:
- Quando um recurso mais específico estiver disponível: Se houver um recurso Terraform especificamente projetado para executar a tarefa de que você precisa, geralmente é melhor usar esse recurso em vez do
terraform_data
. - Quando você precisa manter o estado: O
terraform_data
não mantém o estado, ou seja, não pode ser usado para acompanhar mudanças ao longo do tempo ou impor certas condições. - Quando você precisa gerenciar configurações complexas em servidores provisionados: Em vez disso, considere usar ferramentas de gerenciamento de configuração dedicadas, como Chef, Puppet ou Ansible. Essas ferramentas são projetadas especificamente para gerenciar configurações complexas e podem fornecer melhor visibilidade e escalabilidade do que o
terraform_data
.
Recursos extras:
¹ https://www.hashicorp.com/blog/terraform-1-4-improves-the-cli-experience-for-terraform-cloud
Até o próximo post! 👋
Caso queira entrar em contato, você pode me encontrar no Twitter ou no LinkedIn.