Συμβάσεις ονοματοδοσίας
Γενικές συμβάσεις
Χρησιμοποιήστε
_(υπογράμμιση) αντί για-(παύλα) παντού (σε ονόματα πόρων, ονόματα πηγών δεδομένων, ονόματα μεταβλητών, εξόδους κλπ.).Προτιμήστε να χρησιμοποιείτε πεζά γράμματα και αριθμούς (παρόλο που υποστηρίζεται το UTF-8).
Ορίσματα πηγής πόρων και δεδομένων
Μην επαναλαμβάνετε τον τύπο του πόρου στο όνομα του πόρου (ούτε μερικώς ούτε πλήρως):
`resource "aws_route_table" "public" {}``resource "aws_route_table" "public_route_table" {}``resource "aws_route_table" "public_aws_route_table" {}`Το όνομα του πόρου θα πρέπει να ονομάζεται
thisεάν δεν υπάρχει πιο περιγραφικό και γενικό όνομα ή εάν η μονάδα πόρων δημιουργεί έναν μόνο πόρο αυτού του τύπου (π.χ. στη μονάδα AWS VPC υπάρχει ένας μόνο πόρος τύπουaws_nat_gatewayκαι πολλαπλοί πόροι τύπουaws_route_table, οπότε τοaws_nat_gatewayθα πρέπει να ονομάζεταιthisκαι τοaws_route_tableθα πρέπει να έχει πιο περιγραφικά ονόματα - όπωςprivate,public,database).Χρησιμοποιείτε πάντα ουσιαστικά στον ενικό αριθμό για τα ονόματα.
Χρησιμοποιήστε
-μέσα σε τιμές ορισμάτων και σε σημεία όπου η τιμή θα είναι εκτεθειμένη σε άνθρωπο (π.χ. μέσα στο όνομα DNS του RDS instance).Συμπεριλάβετε το όρισμα
count/for_eachμέσα σε μπλοκ πόρων ή πηγής δεδομένων ως το πρώτο όρισμα στην κορυφή και διαχωρίστε το με νέα γραμμή μετά από αυτό.Συμπεριλάβετε το όρισμα
tags, εάν υποστηρίζεται από τον πόρο, ως το τελευταίο πραγματικό όρισμα, ακολουθούμενο από ταdepends_onκαιlifecycle, εάν είναι απαραίτητο. Όλα αυτά θα πρέπει να διαχωρίζονται με μία κενή γραμμή.Όταν χρησιμοποιείτε συνθήκες/conditions σε ένα argument
count/for_eachπροτιμήστε boolean τιμές αντί να χρησιμοποιείτεlengthή άλλες εκφράσεις.
Παραδείγματα κώδικα πόρου
πόρουΧρήση του 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
}Τοποθέτηση ετικετών/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 = "..."
}Συνθήκες σε 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
}Μεταβλητές
Μην ανακαλύπτετε ξανά τον τροχό στις μονάδες πόρων: χρησιμοποιήστε το
όνομα/name, τηνπεριγραφή/descriptionκαι τηνπροεπιλεγμένη/defaultτιμή για τις μεταβλητές όπως ορίζονται στην ενότητα «Αναφορά ορίσματος» για τον πόρο με τον οποίο εργάζεστε.Η υποστήριξη για επικύρωση σε μεταβλητές είναι μάλλον περιορισμένη (π.χ. δεν μπορεί να έχει πρόσβαση σε άλλες μεταβλητές ή να κάνει αναζητήσεις). Προγραμματίστε αναλόγως, διότι σε πολλές περιπτώσεις αυτή η λειτουργία είναι άχρηστη.
Χρησιμοποιήστε τον πληθυντικό αριθμό στο όνομα μιας μεταβλητής όταν ο τύπος είναι
list(...)ήmap(...).Ταξινομήστε τα κλειδιά σε ένα μπλοκ μεταβλητών ως εξής:
περιγραφή/description,τύπος/type,προεπιλογή/default,επικύρωση/validation.Περιλαμβάνετε πάντα
περιγραφή/descriptionσε όλες τις μεταβλητές ακόμα και αν νομίζετε ότι είναι προφανές (θα σας χρειαστεί στο μέλλον).Προτιμήστε τη χρήση απλών τύπων (
number,string,list(...),map(...),any) έναντι ειδικών τύπων όπωςobject()εκτός αν χρειάζεται να έχετε αυστηρούς περιορισμούς σε κάθε κλειδί.Χρησιμοποιήστε συγκεκριμένους τύπους όπως
map(map(string))αν όλα τα στοιχεία του map έχουν τον ίδιο τύπο (π.χ.string) ή μπορούν να μετατραπούν σε αυτόν (π.χ. ο τύποςnumberμπορεί να μετατραπεί σεstring).Χρησιμοποιήστε τύπο
anyγια να απενεργοποιήσετε την επικύρωση τύπου ξεκινώντας από ένα συγκεκριμένο βάθος ή όταν πρέπει να υποστηρίζονται πολλαπλοί τύποι.Η τιμή
{}είναι μερικές φορές ένα map αλλά μερικές φορές ένα αντικείμενο. Χρησιμοποιήστε τοtomap(....)για να φτιάξετε ένα map επειδή δεν υπάρχει τρόπος να φτιάξετε ένα αντικείμενο.
Outputs
Κάντε τα outputs συνεπή και κατανοητά εκτός του πεδίου εφαρμογής της (όταν ένας χρήστης χρησιμοποιεί μια μονάδα θα πρέπει να είναι προφανές τι τύπο και τι ιδιότητα έχει η τιμή που επιστρέφει).
Το όνομα του output θα πρέπει να περιγράφει την ιδιότητα που περιέχει και να είναι λιγότερο «ελεύθερο» από ό,τι θα θέλατε κανονικά.
Μια καλή δομή για το όνομα του output μοιάζει με
{name}_{type}_{attribute}, όπου:{name}είναι ένα όνομα πόρου ή πηγής δεδομένων χωρίς πρόθεμα παρόχου. Το{name}για τοaws_subnetείναι τοsubnet, για τοaws_vpcείναι τοvpc.{type}είναι ο τύπος μιας πηγής πόρων.{attribute}είναι ένα χαρακτηριστικό που επιστρέφεται από το output
Εάν το output επιστρέφει μια τιμή με συναρτήσεις παρεμβολής/interpolation functions και πολλαπλούς πόρους, τα
{name}και{type}εκεί θα πρέπει να είναι όσο το δυνατόν πιο γενικά (τοthisως πρόθεμα θα πρέπει να παραλείπεται). Δείτε παράδειγμα.Αν η επιστρεφόμενη τιμή είναι μια λίστα θα πρέπει να έχει όνομα στον πληθυντικό. Δείτε παράδειγμα.
Πάντα να περιλαμβάνετε
περιγραφή/descriptionγια όλα τα outputs ακόμα και αν νομίζετε ότι είναι προφανής.Αποφύγετε να ορίσετε
ευαίσθητο/sensitiveόρισμα εκτός αν ελέγχετε πλήρως τη χρήση αυτού του output σε όλα τα σημεία σε όλες τις μονάδες.Προτιμήστε την
try()(διαθέσιμη από το Terraform 0.13) έναντι τηςelement(concat(...))(παλαιότερη προσέγγιση για την έκδοση πριν την 0.13)
Παραδείγματα κώδικαoutput
outputΕπιστρέψτε το πολύ ένα ID τoυ 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, "")
}Όταν υπάρχουν πολλαπλοί πόροι του ίδιου τύπου, το this θα πρέπει να παραλείπεται στο όνομα τoυ 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)
}Χρησιμοποιήστε όνομα πληθυντικού αν η τιμή που επιστρέφει είναι λίστα
output "rds_cluster_instance_endpoints" {
description = "A list of all cluster instance endpoints"
value = aws_rds_cluster_instance.this.*.endpoint
}Last updated