Умови найменувань
Загальні умови
Використовуйте
_(підкреслення) замість-(тире) всюди (імена ресурсів, імена джерел даних, імена змінних, вихідні дані тощо).Віддавайте перевагу використанню малих літер і цифр (навіть якщо підтримується 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і декілька типів ресурсівaws_route_table, так щоaws_nat_gatewayмає бути названийthisіaws_route_tableповинен мати більш описову назву - наприклад - приватний, публічний, база даних).Завжди використовуйте іменники в однині для назв.
Використання - всередині значень аргументів і в місцях, де значення буде доступне для людини (наприклад, всередині імені DNS екземпляра RDS).
Включайте аргумент
count/for_eachвсередині блоку ресурсу або джерела даних як перший аргумент угорі та розділяйте новим рядком після нього.Включайте аргумент
tags,якщо це підтримується ресурсом, як останній реальний аргумент, наступний заdepends_onтаlifecycle, якщо необхідно. Всі вони повинні бути розділені одним порожнім рядком.При використанні умов в аргументі
count/for_eachвіддавайте перевагу логічним значенням замість використання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
}Розміщення тегів
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
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(...),над спеціальними, як наприкладobject(),якщо вам не потрібні жорсткі обмеження для кожного ключа.Використовуйте спеціальні типи, наприклад
map(map(string))якщо всі елементи у map мають одинаковий тип (наприклад,string) або можна конвертувати в нього (наприклад типnumberможна конвертувати уstring).Використовуйте тип
anyщоб відключити перевірку типу, починаючи з певної глибини або коли має підтримуватися декілька типів.Значенння
{}це іноді map, а іноді - object. Використовуйтеtomap(...)щоб зробити map, тому що немає можливості зробити об'єкт.
Вихідні дані
Робіть вихідні дані узгодженими і зрозумілими за межами їх області (коли користувач використовує модуль, має бути очевидним, який тип і атрибут значення він повертає).
Ім’я виводу має описувати властивість, яку він містить, і бути менш вільною формою, ніж ви зазвичай хотіли б.
Хороша структура назви виводу виглядає так
{name}_{type}_{attribute}, де:{name} -це ім’я ресурсу або джерела даних без префікса постачальника.{name}дляaws_subnet- цеsubnet, дляaws_vpc- цеvpc.{type}є різновидом джерела ресурсів.{attribute}є атрибутом, який повертає вихідні дані.
Якщо вихідні дані повертають значення з функціями інтерполяції та кількома ресурсами,
{name}і{type},вонимають бути якомога загальнішими (це як префікс слід пропустити). Перегляньте приклади.Якщо повертається значення у вигляді списка, воно повинно мати назву у множині. Перегляньте приклади.
Завжди включайте
descriptionдля всіх результатів, навіть якщо ви думаєте, що це очевидно.Уникайте налаштування
чутливихаргументів, якщо ви повністю не контролюєте використання цього виводу в усіх місцях і у всіх модулях.Віддавайте перевагу
try()(доступний з Terraform 0.13) надelement(concat(...))(застарілий підхід для версій до 0.13)
Приклади коду вихідних даних
Повертає щонайбільше один ідентифікатор із групи безпеки:
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, "")
}Якщо є декілька ресурсів одного типу, це слід пропустити в назві виводу:
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