Convenções de nomenclatura
Convenções gerais
Utilize
_(subtraço) ao invés do-(traço) em todo o lugar (nomes de recursos, nomes de fontes de dados, nomes de variáveis, outputs, etc.).Prefira usar letras minúsculas e números (mesmo que o UTF-8 seja suportado).
Argumentos de recursos e fontes de dados
Não repita a categoria de recurso no nome do recurso (não parcialmente, nem completamente):
resource "aws_route_table" "public" {}resource "aws_route_table" "public_route_table" {}resource "aws_route_table" "public_aws_route_table" {}O nome do recurso deve ser nomeado
thisse não houver mais um nome descritivo e geral disponível ou se o módulo de recurso criar um único recurso desse tipo (por exemplo, no módulo AWS VPC há um único recurso do tipoaws_nat_gatewaye vários recursos do tupoaws_route_table, entãoaws_nat_gatewaydeve ser nomeadothiseaws_route_tabledeve ter nomes mais descritivos - comoprivate,public,database).Sempre utilize substantivos singulares para nomes.
Utilize
-em valores de argumentos e em locais onde o valor será exposto a um humano (por exemplo, no nome de DNS da instância RDS).Inclua o(s) argumento(s)
count/for_eachno bloco de recurso ou fonte de dados como o primeiro argumento na parte superior e separe por uma nova linha depois dele.Inclua o argumento
tags,se suportadas pelo recurso, como o último argumento real, seguido pordepends_onelifecycle, se necessário. Estes devem ser separados por uma única linha vazia.Ao utilizar condições em um argumento
count/for_each, prefira valores boleanos (true/false) em vez de usarlengthou outras expressões.
Exemplos de código de resource
resourceUso do count / for_each
count / for_eachresource "aws_route_table" "public" {
count = 2
vpc_id = "vpc-12345678"
# ... argumentos restantes omitidos
}
resource "aws_route_table" "private" {
for_each = toset(["one", "two"])
vpc_id = "vpc-12345678"
# ... argumentos restantes omitidos
}resource "aws_route_table" "public" {
vpc_id = "vpc-12345678"
count = 2
# ... argumentos restantes omitidos
}Colocação das tags
tagsresource "aws_nat_gateway" "this" {
count = 2
allocation_id = "..."
subnet_id = "..."
tags = {
Name = "..."
}
depends_on = [aws_internet_gateway.this]
lifecycle {
create_before_destroy = true
}
} resource "aws_nat_gateway" "this" {
count = 2
tags = "..."
depends_on = [aws_internet_gateway.this]
lifecycle {
create_before_destroy = true
}
allocation_id = "..."
subnet_id = "..."
}Condições com o count
countresource "aws_nat_gateway" "that" { # Perfeito
count = var.create_public_subnets ? 1 : 0
}
resource "aws_nat_gateway" "this" { # Bom
count = length(var.public_subnets) > 0 ? 1 : 0
}Variáveis
Não reinvente a roda em módulos de recursos: use
name,description, e valordefaultpara variáveis conforme definido na seção “Referência de argumento” para o recurso com o qual você está trabalhando.O suporte para validação em variáveis é bastante limitado (por exemplo, não pode acessar outras variáveis ou fazer pesquisas). Planeje de acordo porque em muitos casos esse recurso é inútil.
Use a forma plural em um nome de variável quando o tipo for
list(...)oumap(...).Chaves de ordem em um bloco variável como:
description,type,default,validation.Sempre inclua
descriptionem todas as variáveis, mesmo que você julgue ser óbvio (você precisará disso, no futuro).Prefira usar tipos simples (
number,string,list(...),map(...),any) sobre tipos específicos comoobject(), a menos que você precise ter restrições estritas em cada chave.Use tipos específicos como
map(map(string))se todos os elementos do mapa tiverem o mesmo tipo (ex.string) ou podem ser convertidos para ele (ex.numberpode ser convertido parastring).Use tipo
anypara desabilitar a validação de tipo a partir de uma determinada profundidade ou quando vários tipos devem ser suportados.O valor
{}às vezes é um mapa, mas às vezes é um objeto. Usetomap(...)para criar um mapa porque não há como criar um objeto.
Outputs
Torne os outputs consistentes e compreensíveis fora de seu escopo (quando um usuário está usando um módulo, deve ser óbvio que tipo e atributo do valor ele retorna).
O nome do output deve descrever a propriedade que ela contém e ser menos livre do que você normalmente desejaria.
Uma boa estrutura para o nome do output parece com
{name}_{type}_{attribute}, onde:{name}um nome de recurso ou fonte de dados sem um prefixo de provedor. O{name}doaws_subnetésubnet, para oaws_vpcévpc.{type}é um tipo de fontes de recursos.{attribute}é um atributo retornado pelo output.
Se o output estiver retornando um valor com funções de interpolação e vários recursos,
{name}e{type}devem ser o mais genéricos possível (thiscomo prefixo deve ser omisso). Veja exemplos.Se o valor retornado for uma lista, deve ter um nome no plural. Veja exemplos.
Sempre inclua
descriptionpara todos os outputs mesmo que você julgue que ser óbvio.Evite definir o argumento
sensitive, a menos que você controle totalmente o uso desse output em todos os locais em todos os módulos.Prefira
try()(disponível desde o Terraform 0.13) ao invés deelement(concat(...))(abordagem herdada para a versão anterior a 0.13).
Exemplos de código do output
outputRetorne no máximo um ID do security-group:
output "security_group_id" {
description = "The ID of the security group"
value = try(aws_security_group.this[0].id, aws_security_group.name_prefix[0].id, "")
}Quando há vários recursos do mesmo tipo, this deve ser omisso no nome do output:
output "this_security_group_id" {
description = "The ID of the security group"
value = element(concat(coalescelist(aws_security_group.this.*.id, aws_security_group.web.*.id), [""]), 0)
}Use o nome no plural se o valor de retorno for uma lista
output "rds_cluster_instance_endpoints" {
description = "A list of all cluster instance endpoints"
value = aws_rds_cluster_instance.this.*.endpoint
}Last updated