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
this
heiß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_gateway
und mehrere Ressourcen des Typsaws_route_table
, also sollteaws_nat_gateway
this
heißen undaws_route_table
sollte 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
count
in Ressourcenblöcke als erstes Argument oben ein und trennen Sie es durch einen Zeilenumbruch dahinter. Siehe Beispiel. - Fügen Sie die Kondition
tags
als letztes Argument ein, wenn es von der Ressource unterstützt wird, gefolgt vondepends_on
undlifecycle
, 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 Sielength
oder 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
list
undmap
. - Beim Definieren von Variablen ordnen Sie die Schlüssel:
description
,type
,default
. - Fügen Sie für alle Variablen immer eine
Beschreibung
hinzu, 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_subnet
istsubnet
, füraws_vpc
ist 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 (this
ist 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
Beschreibung
fü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)}"
}