Codestruktur
Welche Namenskonventionen bei der Verwendung von Terraform sind bewährt. Warum es sinnvoll ist eine einheitliche Schreibweise für Resourcen zu verwenden.
Allgemeine Namenskonventionen
Es sollte keinen Grund geben, diesen nicht zu folgen.
- Verwenden Sie
_(Unterstrich) anstelle von-(Bindestrich) in allen: Ressourcennamen, Datenquellennamen, Variablennamen, Ausgaben.- Beachten Sie, dass tatsächliche Cloud-Ressourcen viele versteckte Einschränkungen in ihren Namenskonventionen aufweisen. Einige dürfen keine Bindestriche enthalten, andere müssen am Anfang gross geschrieben werden. Diese Konventionen beziehen sich auf den Namen von Terraform Ressourcen.
- Verwenden Sie nur Kleinbuchstaben und Zahlen.
Argumente für Ressourcen und Datenquellen
- Ressourcentyp im Ressourcennamen nicht wiederholen:
- Gut:
Ressource "aws_route_table" "public" {} - Schlecht:
Ressource "aws_route_table" "public_route_table" {} - Schlecht:
Ressource "aws_route_table" "public_aws_route_table" {}
- Gut:
- Der Ressourcenname sollte
thisheißen, wenn kein beschreibender und allgemeiner Name mehr verfügbar ist oder wenn das Ressourcenmodul eine einzelne Ressource dieses Typs erstellt (z.B. gibt es eine einzelne Ressource des Typsaws_nat_gatewayund mehrere Ressourcen des Typsaws_route_table, also sollteaws_nat_gatewaythisheißen undaws_route_tablesollte aussagekräftigere Namen haben - wieprivate,public,database). - Verwenden Sie für Namen immer Nomen im Singular.
- Verwenden Sie
-innerhalb von Argument und an Stellen, an denen der Wert für Andere lesbar sein soll (z.B. innerhalb des DNS-Namens der RDS-Instanz). - Fügen Sie das Argument
countin Ressourcenblöcke als erstes Argument oben ein und trennen Sie es durch einen Zeilenumbruch dahinter. Siehe Beispiel. - Fügen Sie die Kondition
tagsals letztes Argument ein, wenn es von der Ressource unterstützt wird, gefolgt vondepends_onundlifecycle, falls erforderlich. All dies sollte durch eine einzelne Leerzeile getrennt werden. Siehe Beispiel. - Wenn Bedingung im
count-Argument verwendet wird, verwenden Sie einen booleschen Wert, wenn dies sinnvoll ist, andernfalls verwenden Sielengthoder eine andere Interpolation. Siehe Beispiel . - Um invertierte Bedingungen zu erstellen, führen Sie keine andere Variable ein, es sei denn, es ist wirklich notwendig, sondern verwenden stattdessen
1 - boolescher Wert. Zum Beispielcount = "${1 - var.create_public_subnets}"
Codebeispiele für Ressource
Verwendung von count
Ressource "aws_route_table" "public" {
count = "2"
vpc_id = "vpc-12345678"
# ... verbleibende Argumente weggelassen
}
Ressource "aws_route_table" "public" {
vpc_id = "vpc-12345678"
count = "2"
# ... verbleibende Argumente weggelassen
}
Platzierung von Tags
Ressource "aws_nat_gateway" "this" {
count = "1"
allocation_ids = "..."
subnet_id = "..."
Tags = {
Name = "..."
}
depends_on = ["aws_internet_gateway.this"]
lifecycle {
create_before_destroy = true
}
}
Ressource "aws_nat_gateway" "this" {
count = "1"
Tags = "..."
depends_on = ["aws_internet_gateway.this"]
lifecycle {
create_before_destroy = true
}
allokation_id = "..."
subnet_id = "..."
}
Bedingungen in count
count = "${length(var.public_subnets) > 0 ? 1 : 0}"
count = "${var.create_public_subnets}"
Variablen
- Erfinden Sie das Rad in Ressourcenmodulen nicht neu – verwenden Sie dieselben Variablennamen, Beschreibungen und Voreinstellungen wie im Abschnitt “Argumentreferenz” für die Ressource, an der Sie arbeiten.
- Lassen Sie die
type = "list"-Deklaration weg, wenn es auchdefault = []gibt. - Lassen Sie die Deklaration
type = "map"weg, wenn es auchdefault = {}gibt. - Verwenden Sie die Pluralform im Namen von Variablen vom Typ
listundmap. - Beim Definieren von Variablen ordnen Sie die Schlüssel:
description,type,default. - Fügen Sie für alle Variablen immer eine
Beschreibunghinzu, auch wenn Sie denken, dass es offensichtlich ist.
Outputs
Der Name für die Outputs ist wichtig, um sie außerhalb ihres Geltungsbereichs konsistent und verständlich zu machen (wenn der Benutzer ein Modul verwendet, sollte offensichtlich sein, welcher Typ und welches Attribut des Werts zurückgegeben wird).
- Die allgemeine Empfehlung für die Namen von Outputs lautet, dass sie für den darin enthaltenen Wert beschreiben.
- Eine gute Struktur für Ausgabenamen sieht wie folgt aus:
{name}_{type}_{attribute}, wobei:{name}ist ein Ressourcen- oder Datenquellenname ohne Anbieterpräfix.{name}füraws_subnetistsubnet, füraws_vpcist esvpc.{type}ist ein Typ einer Ressourcenquelle{attribute}ist ein Attribut, das von der Ausgabe zurückgegeben wird- Siehe Beispiele.
- Wenn die Ausgabe einen Wert mit Interpolationsfunktionen und mehreren Ressourcen zurückgibt, sollten die
{name}und{type}dort so generisch wie möglich sein (thisist oft die generischste und sollte bevorzugt werden) . Siehe Beispiel. - Wenn der zurückgegebene Wert eine Liste ist, sollte der Name im Plurar stehen. Siehe Beispiel.
- Geben Sie immer eine
Beschreibungfür alle Ausgaben an, auch wenn Sie denken, dass es offensichtlich ist.
Codebeispiele für Output
Gibt die ID der Sicherheitsgruppe zurück:
output "this_security_group_id" {
description = "Die ID der Sicherheitsgruppe"
value = "${element(concat(coalescelist(aws_security_group.this.*.id, aws_security_group.this_name_prefix.*.id), list("")), 0)}"
}
Wenn mehrere Ressourcen des gleichen Typs vorhanden sind, sollte this bevorzugt werden und es sollte Teil des Namens in der Ausgabe sein, auch another_security_group_id sollte web_security_group_id heißen:
output "security_group_id" {
description = "Die ID der Sicherheitsgruppe"
value = "${element(concat(coalescelist(aws_security_group.this.*.id, aws_security_group.web.*.id), list("")), 0)}"
}
output "another_security_group_id" {
description = "Die ID der Websicherheitsgruppe"
value = "${element(concat(aws_security_group.web.*.id, list("")), 0)}"
}
Verwenden Sie Pluralnamen, wenn der Rückgabewert eine Liste ist
output "this_rds_cluster_instance_endpoints" {
description = "Eine Liste aller Endpunkte von Clusterinstanzen"
Wert = ["${aws_rds_cluster_instance.this.*.endpoint}"]
}
Bedingungen in Ausgabe
Es gibt zwei Ressourcen vom Typ aws_db_instance mit den Namen this und this_mssql, bei denen maximal eine Ressource gleichzeitig erstellt werden kann.
output "this_db_instance_id" {
description = "Die RDS-Instanz-ID"
value = "${element(concat(coalescelist(aws_db_instance.this_mssql.*.id, aws_db_instance.this.*.id), list("")), 0)}"
}