12 de outubro de 2024 • 3 min de leitura
Terraform condicoes customizadas - Parte 3
O Terraform possui diversas alternativas para validar variáveis e configurações dentro do seu código. Essas validações ajudam a evitar erros e seguir boas práticas, assegurando que a infraestrutura seja robusta e confiável.
Ao trabalhar com infraestrutura como código no Terraform, garantir que seus recursos sejam criados de maneira previsível e validada é essencial para evitar problemas em ambientes críticos. Preconditions e postconditions são mecanismos poderosos que ajudam a adicionar validações antes e depois da aplicação de mudanças, garantindo que as condições certas sejam atendidas.
Neste artigo, vamos explorar o que são preconditions e postconditions, como usá-los no Terraform e exemplos práticos de sua aplicação.
O que são Preconditions e Postconditions?
- Preconditions: São validações que ocorrem antes que um recurso seja criado ou modificado. Elas garantem que certos critérios sejam atendidos antes de permitir que o Terraform execute a mudança. Se as preconditions não forem atendidas, o Terraform falha antes de aplicar qualquer alteração.
- Postconditions: São condições verificadas após a execução de um recurso. Elas confirmam se o estado final do recurso está de acordo com as expectativas definidas. Caso contrário, o Terraform também interrompe o processo com um erro.
Essas validações podem ser úteis para evitar falhas em ambientes de produção, impor padrões ou garantir que os parâmetros fornecidos estejam corretos.
Casos de Aplicação Real
1. Garantir Limites em Contas Multiambientes
Imagine que você está lidando com múltiplos ambientes no Terraform (dev
, uat
, prd
). É importante que, em cada ambiente, a quantidade de instâncias seja limitada, por exemplo, dev
com no máximo 2 instâncias, uat
com no máximo 4 e prd
com no máximo 10.
Utilizando preconditions, você pode evitar que um erro humano cause a criação de mais instâncias do que o ambiente suporta.
2. Validação de Tags Obrigatórias
Em organizações que dependem de tags para a correta categorização e cobrança dos recursos, como o squad
, environment
, e cost-center
, as preconditions podem garantir que essas tags sejam aplicadas corretamente antes de qualquer recurso ser criado.
Por exemplo, garantir que a tag environment
seja sempre uma entre dev
, uat
, ou prd
pode evitar inconsistências e falhas no processo de deploy.
3. Verificação de Estado Após Modificações
Postconditions podem ser usadas para verificar se, após a criação de um bucket S3, o ciclo de vida está configurado corretamente. Isso garante que qualquer alteração ou criação no Terraform siga as políticas definidas para gerenciamento de dados no longo prazo, como a exclusão de objetos após um certo período.
Exemplos de Implementação
Exemplo 1: Validando instance_count
com Precondition
Neste exemplo, validamos que a quantidade de instâncias criada está dentro do permitido para o ambiente.
variable "instance_count" {
type = number
}
variable "environment" {
type = string
validation {
condition = contains(["dev", "uat", "prd"], var.environment)
error_message = "O environment deve ser 'dev', 'uat', ou 'prd'."
}
}
resource "aws_instance" "example" {
count = var.instance_count
precondition {
condition = var.instance_count <= (var.environment == "dev" ? 2 : var.environment == "uat" ? 4 : 10)
error_message = "O número de instâncias não pode exceder o limite do ambiente ${var.environment}."
}
ami = "ami-12345678"
instance_type = "t2.micro"
}
Aqui, validamos se o número de instâncias está adequado ao ambiente antes de permitir a criação.
Exemplo 2: Garantindo Tags Obrigatórias
Neste caso, usamos uma precondition para garantir que as tags obrigatórias estejam corretas
resource "aws_instance" "example" {
ami = "ami-12345678"
instance_type = "t2.micro"
tags = {
Name = "ExampleInstance"
squad = var.squad
environment = var.environment
cost-center = var.cost_center
}
precondition {
condition = contains(["cloud", "sre", "engenharia"], var.squad) &&
contains(["dev", "uat", "prd"], var.environment) &&
contains(["core", "business", "marketing"], var.cost_center)
error_message = "As tags 'squad', 'environment', e 'cost-center' devem conter valores válidos."
}
}
Exemplo 3: Verificando a Configuração de Ciclo de Vida do S3 com Postcondition
Neste exemplo, verificamos que o bucket S3 foi criado com a política de ciclo de vida correta.
resource "aws_s3_bucket" "example" {
bucket = "example-bucket"
}
resource "aws_s3_bucket_lifecycle_configuration" "example" {
bucket = aws_s3_bucket.example.bucket
rule {
id = "ExpireOldObjects"
status = "Enabled"
expiration {
days = 30
}
}
postcondition {
condition = aws_s3_bucket_lifecycle_configuration.example.rule[0].expiration.days == 30
error_message = "O ciclo de vida do bucket S3 deve estar configurado para expirar objetos após 30 dias."
}
}
Ao aplicar essas práticas em seus projetos Terraform, você pode reduzir o risco de erros em ambientes de produção e garantir que suas implementações sejam executadas de acordo com as expectativas.