Convenzioni sui nomi
Convenzioni generali
Usa
_(trattino basso) invece del-(trattino) ovunque (nomi sul tipo resourse, nomi sul tipo data, nomi di variabili, outputs, ecc).Preferisci l'uso di lettere minuscole e numero (perfino dove é supportato UTF-8).
Argomenti di resource and data source
Non ripetere il tipo di risorsa nel nome della risorsa (ne parzialmente ne interamente):
resource "aws_route_table" "public" {}resource "aws_route_table" "public_route_table" {}resource "aws_route_table" "public_aws_route_table" {}Il nome delle risorse dovrebbe essere chiamato
thisse non c'è disponibile un nome più descrittivo e generale, o se il modulo di risorsa crea una singola risorsa di questo tipo (per esempio, in AWS VPC module c'è una singola risorsa di tipoaws_nat_gatewaye risorse multiple di tipoaws_route_table, quindiaws_nat_gatewaydovrebbe essere chiamatothiseaws_route_tabledovrebbe avere un nomi più descrittivi come per esempioprivate,public,database).Usare sempre nomi al singolare.
Usa
-(il trattino )dentro i valori degli argomenti interni e in posti dove i valori sono esposti agli essere umani (per esempio, dentro i nomi DNS o le istanze RDS).Includi l'argomento
count/for_eachdentro la risorsa o il blocco di data source come primo argomento in cima separalo da una nuova linea dopo di lui.Includi argomenti di tipo
tags,se supportati dalla risorsa, come ultimo argomento, seguito daldepends_onelifecycle, se necessario. Tutti questi dovrebbero essere separati da una singola linea vuota.Quando si usano le condizioni in un argomento
count/for_eachpreferisci valori boleani invece di usarelengtho un'altra espressione.
Esempi di codice di resource
resourceUso di count / for_each
count / for_eachresource "aws_route_table" "public" {
count = 2
vpc_id = "vpc-12345678"
# ... remaining arguments omitted
}
resource "aws_route_table" "private" {
for_each = toset(["one", "two"])
vpc_id = "vpc-12345678"
# ... remaining arguments omitted
}resource "aws_route_table" "public" {
vpc_id = "vpc-12345678"
count = 2
# ... remaining arguments omitted
}Posizionamento di 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 = "..."
}Condizioni in count
countresource "aws_nat_gateway" "that" { # Best
count = var.create_public_subnets ? 1 : 0
}
resource "aws_nat_gateway" "this" { # Good
count = length(var.public_subnets) > 0 ? 1 : 0
}Variabili
Non reinventare la ruota in moduli risorsa: usa
name,description, e il valore didefaultper le variabili come sono definitie nella sezione "Argument Reference" per le risorse con cui stai lavorando.Il supporto per la validazione nelle variabili è piuttosto limitato (per esempio non è possibile accedere a altre variabili o fare lookups). Bisogna tenerne conto perchè in molti casi questa feature è inutile.
Usare la forma plurale nel nome delle variabili quando il tipo è
list(...)omap(...).Ordina le chiavi in un blocco per le variabil in questo modo:
description,type,default,validation.Includere sempre la descrizione
descriptionsu tutte le variabili perfino se pensi che è ovvio (potresti averne bisogno in futuro).Usa se è possibile tipi semplici (
number,string,list(...),map(...),any) invece di tipi specifici comeobject()a meno che hai bisogno di fare costrizioni specifiche su ogni chiave.Usa tipi specifici come
map(map(string))se tutti gli elementi della mappa hanno lo stesso tipo (per esempiostring) o possono essere convertiti (per esempio il tiponumberpuò essere convertito in unastring).Usa il tipo
any, la validazione sul tipo iniziando da una certa profondità o quando tipo multipli dovrebbero essere supportati.Value
{}alcune volte è una map ma altre volte un object. Usatomap(...)per creare una map in questo modo sei sicuro di non fare un oggetto.
Outputs
Fai in modo che gli outputs siano consistenti e comprensibilit fuori dal loro raggio d'azione (quando un utente sta usando un modulo dovrebbe essere ovvio cosa un tipo o il valore di un attributo restituiscono).
Il nome di un output dovrebbe descrivere la proprietà che contiene ed essere meno libero della forma che normalmente vorresti.
Una buona struttura per il nome di un output apparirà in questa maniera
{name}_{type}_{attribute}, dove:{name}è una risorsa o un data source senza il prefisso del provider.{name}peraws_subnetèsubnet, peraws_vpcèvpc.{type}è un tipo di una risorsa sorgente{attribute}è un attributo restituito da un output
Se l'output sta restituendo un valore con funzioni di interpolazione e risorse multiple,
{name}e{type}dovrebbero essere quanto più generici possibile (thisè un prefisso e dovrebbe essere omesso). Vedi gli esempi.Se il valore restituito è una lista dovrebbe avere un nome plurale. Vedi gli esempi.
Includere sempre la descrizione
descriptionper tutti gli output anche se pensi che sia ovvio.Evita di settare argomenti
sensitivea meno che hai il controllo totale su tutti gli output in tutti i punti dei moduli.Preferisci l'uso di
try()(disponibile da Terraform 0.13) invece dielement(concat(...))(approccio legacy per le versioni prima della 0.13)
Esempi di codice di output
outputRestituire al massimo un security group ID:
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 abbiamo risorse multiple dello stesso tipo, this dovrebbe essere omesso nel nome dell'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)
}Usare un nome pluralre se il valore restituito e' una lista
output "rds_cluster_instance_endpoints" {
description = "A list of all cluster instance endpoints"
value = aws_rds_cluster_instance.this.*.endpoint
}Last updated