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
this
se 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_gateway
e vários recursos do tupoaws_route_table
, entãoaws_nat_gateway
deve ser nomeadothis
eaws_route_table
deve 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_each
no 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_on
elifecycle
, 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 usarlength
ou outras expressões.
Exemplos de código de resource
resource
Uso do count
/ for_each
count
/ for_each
resource "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
tags
resource "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
count
resource "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 valordefault
para 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
description
em 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.number
pode ser convertido parastring
).Use tipo
any
para 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 (this
como prefixo deve ser omisso). Veja exemplos.Se o valor retornado for uma lista, deve ter um nome no plural. Veja exemplos.
Sempre inclua
description
para 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
output
Retorne 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