Умови найменувань
Загальні умови
Використовуйте
_
(підкреслення) замість-
(тире) всюди (імена ресурсів, імена джерел даних, імена змінних, вихідні дані тощо).Віддавайте перевагу використанню малих літер і цифр (навіть якщо підтримується 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_each
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
}
Розміщення тегів
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
значення для змінних, як зазначено в розділі «Довідник аргументів» для ресурсу, з яким ви працюєте.Підтримка перевірки змінних досить обмежена (наприклад, не можна отримати доступ до інших змінних або виконати пошук). Плануйте відповідно, тому що в багатьох випадках ця функція не корисна.
Використовуйте форму множини в імені змінної, якщо тип є
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