დასახელების კონვენცია
ზოგადი კონვენცია
გამოიყენეთ
_(underscore)-(dash) მაგიერ ყველგან (რესურსების დასახელებაში, მონაცემთა წყაროს სახელებში, ცვლადების სახელეში და ა.შ.).უკეთესია გამოიყენოთ lowercase ასოები და ციფრები (მიუხედავად 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 module -ში არის მხოლოდ ერთიaws_nat_gatewayტიპის რესურსი და რამოდენიმე typeaws_route_tableტიპის რესურსი, ამიტომaws_nat_gateway-ს უნდა დაერქვასthisდაaws_route_table-ს უნდა ჰქონდეს მეტი აღწერითი სახელები - როგორიცააprivate,public,database).დასახელებებში ყოველთვის გამოიყენეთ მხოლობითი არსებითი სახელები.
გამოიყენეთ
-არგუმენტების მნიშვნელობებსა და იმ ადგილებში სადაც ეს მნიშვნელობები იქნება გამოტანილი საჯაროდ (მაგალითად, RDS instance-ის DNS სახელში).გამოიყენე არგუმენტი nclude argument
count/for_eachრესურსში ან მონაცემთა წყაროს ბლოკში პირველ არგუმენტად დასაწყისში და გამოყავით ახალი ხაზით.გამოიყენეთ არგუმენტი
tags,თუ რესურსს აქვს ამის მხარდაჭერა,depends_onდაlifecycleბლოკებამდე, თუ არსებობს ამის საჭიროება. ყველა ბლოკი უნდა გამოიყოს ცარიელი ხაზით.count/for_eachარგუმენტებში კონდიციების გამოყენებისას, უპირატესობა მიანიჭეთ boolean მნიშვნელობს ვიდრეlengthან სხვა ტიპის expression-ებს.
რესურსის(resource) კოდის მაგალითები
resource) კოდის მაგალითებიcount / for_eachU-ის გამოყენება
count / for_eachU-ის გამოყენებაresource "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) განთავსება
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 = "..."
}კონდიციები count-ში
count-შიresource "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მნიშვნელობები ცვლადებისთვის ისე როგორც "Argument Reference" სექციაში არის განსაზღვრული.ცვლადებში ვალიდაციის მხარდაჭერა არის საკმაოდ შეზღუდული (მაგალითად არ აქვს წვდომა სხვა ცვლადებზე). ძირითად შემთხვევბში მიზანშეწონილია გამოიყენოთ Plan-ი, რადგაც ვალიდაციის ოფცია ხშირ შემთხვევაში არის უშედეგო.
ცვლადის სახელებში გამოიყენეთ მრავლობითი ფორმა როდესაც მისი ტიპი არის
list(...)ანmap(...).ცვლადის ბლოკში დაიცავით ელემენტების შემდეგი მიმდევრობა:
description,type,default,validation.ყოველთვის გამოიყენეთ
descriptionყველა ცვლადზე (სამომავლოდ აუცილებლად გამოგადგებათ)უმჯობესია გამოიყენოთ მარტივი ცვლადის ტიპები (
number,string,list(...),map(...),any) ვიდრე სპეციფიური ტიპები როგორიცააobject()იმ შემთხვევაში თუ არ გჭირდებათ მკაცრი შეზღუდვები key-ებზე.გამოიყენეთ სპეციფიური ცვლადის ტიპები როგორიცაა
map(map(string))იმ შემთხვევაში თუ ყველა ელემენტს map-ზე ერთი და იგივე ცვლადის ტიპი (მაგალითადstring) ან შესაძლოა დაკონვერტირდეს მასში (მაგალითადnumberშესაძლოა დაკონვერტირდესstring-ში).გამოიყენეთ ცვლადის ტიპი
anyრათა გამოტოვოთ ვალიდაცია როდესაც კონკრეტულ შრეზე ან როდესაც რამოდენიმე ცვლადის ტიპი უნდა იქნას მხარდაჭერილი.მნიშვნელობა(Value)
{}ზოგჯერ არის map ტიპისა მაგრამ ხანდახან არის object ტიპის. გამოიყენეთtomap(...)რათა შექმნა map იმ შემთხვევაში თუ შეზღუდულია object-ის შექმნა.
Outputs
Make outputs consistent and understandable outside of its scope (when a user is using a module it should be obvious what type and attribute of the value it returns).
The name of output should describe the property it contains and be less free-form than you would normally want.
Good structure for the name of output looks like
{name}_{type}_{attribute}, where:{name}is a resource or data source name without a provider prefix.{name}foraws_subnetissubnet, foraws_vpcit isvpc.{type}is a type of a resource sources{attribute}is an attribute returned by the output
If the output is returning a value with interpolation functions and multiple resources,
{name}and{type}there should be as generic as possible (thisas prefix should be omitted). See example.If the returned value is a list it should have a plural name. See example.
Always include
descriptionfor all outputs even if you think it is obvious.Avoid setting
sensitiveargument unless you fully control usage of this output in all places in all modules.Prefer
try()(available since Terraform 0.13) overelement(concat(...))(legacy approach for the version before 0.13)
outputკოდის მაგალითი
outputკოდის მაგალითიდააბრუნეთ 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, "")
}ერთი და იმავე ტიპის მრავალი რესურსის არსებობისას, this უნდა იყოს გამოტოვებული 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