Умови найменувань
Не повинно бути ніяких причин не дотримуватися принаймні цих умов :)
Майте на увазі, що реальні хмарні ресурси часто мають обмеження у дозволених іменах. Деякі ресурси, наприклад, не можуть містити тире, деякі мають бути у формі camel-cased стилю. Умови в цій книзі посилаються на самі імена Terraform.
- 1.Використовуйте
_
(підкреслення) замість-
(тире) всюди (імена ресурсів, імена джерел даних, імена змінних, вихідні дані тощо). - 2.Віддавайте перевагу використанню малих літер і цифр (навіть якщо підтримується UTF-8).
- 1.Не повторюйте тип ресурсу в назві ресурсу (ні частково, ні повністю):
resource "aws_route_table" "public" {}
resource "aws_route_table" "public_route_table" {}
resource "aws_route_table" "public_aws_route_table" {}
- 2.Ім'я ресурсу повинно називатись
this,
якщо немає більш описової та загальної назви, або якщо модуль ресурсів створює один ресурс цього типу (наприклад, у AWS VPC module існує єдиний ресурс типуaws_nat_gateway
і декілька типів ресурсівaws_route_table
, так щоaws_nat_gateway
має бути названийthis
іaws_route_table
повинен мати більш описову назву - наприклад - приватний, публічний, база даних). - 3.Завжди використовуйте іменники в однині для назв.
- 4.Використання - всередині значень аргументів і в місцях, де значення буде доступне для людини (наприклад, всередині імені DNS екземпляра RDS).
- 5.Включайте аргумент
count
/for_each
всередині блоку ресурсу або джерела даних як перший аргумент угорі та розділяйте новим рядком після нього. - 6.Включайте аргумент
tags,
якщо це підтримується ресурсом, як останній реальний аргумент, наступний заdepends_on
таlifecycle
, якщо необхідно. Всі вони повинні бути розділені одним порожнім рядком. - 7.При використанні умов в аргументі
count
/for_each
віддавайте перевагу логічним значенням замість використанняlength
або інших виразів.
main.tf
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
}
main.tf
resource "aws_route_table" "public" {
vpc_id = "vpc-12345678"
count = 2
# ... remaining arguments omitted
}
main.tf
resource "aws_nat_gateway" "this" {
count = 2
allocation_id = "..."
subnet_id = "..."
tags = {
Name = "..."
}
depends_on = [aws_internet_gateway.this]
lifecycle {
create_before_destroy = true
}
}
main.tf
resource "aws_nat_gateway" "this" {
count = 2
tags = "..."
depends_on = [aws_internet_gateway.this]
lifecycle {
create_before_destroy = true
}
allocation_id = "..."
subnet_id = "..."
}
outputs.tf
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
}
- 1.Не винаходьте велосипед у ресурсних модулях: використовуйте
name
,description
, іdefault
значення для змінних, як зазначено в розділі «Довідник аргументів» для ресурсу, з яким в и працюєте. - 2.Підтримка перевірки змінних досить обмежена (наприклад, не можна отримати доступ до інших змінних або виконати пошук). Плануйте відповідно, тому що в багатьох випадках ця функція не корисна.
- 3.Використовуйте форму множини в імені змінної, якщо тип є
list(...)
абоmap(...)
. - 4.Упорядковуйте ключі у змінному блоці, як описано далі:
description
,type
,default
,validation
. - 5.Завжди включайте
description
для всіх змінних, навіть якщо ви думаєте, що це очевидно (це знадобиться вам у майбутньому). - 6.Віддавайте перевагу використанню простих типів (
number
,string
,list(...)
,map(...),
над спеціальними, як наприкладobject(),
якщо вам не потрібні жорсткі обмеження для кожного ключа. - 7.Використовуйте спеціальні типи, наприклад
map(map(string))
якщо всі елементи у map мають одинаковий тип (наприклад,string
) або можна конвертувати в нього (наприклад типnumber
можна конвертувати уstring
). - 8.Використовуйте тип
any
щоб відключити перевірку типу, починаючи з певної глибини або коли має підтримуватися декілька типів. - 9.Значенння
{}
це іноді map, а іноді - object. Використовуйтеtomap(...)
щоб зробити map, тому що немає можливості зробити об'єкт.
Робіть вихідні дані узгодженими і зрозумілими за межами їх області (коли користувач використовує модуль, має бути очевидним, який тип і атрибут значення він повертає).
- 1.Ім’я виводу має описувати властивість, яку він мі стить, і бути менш вільною формою, ніж ви зазвичай хотіли б.
- 2.Хороша структура назви виводу виглядає так
{name}_{type}_{attribute}
, де:- 1.
{name} -
це ім’я ресурсу або джерела даних без префікса постачальника.{name}
дляaws_subnet
- цеsubnet
, дляaws_vpc
- цеvpc
. - 2.
{type}
є різновидом джерела ресурсів. - 3.
{attribute}
є атрибутом, який повертає вихідні дані.
- 3.Якщо вихідні дані повертають значення з функціями інтерполяції та кількома ресурсами,
{name}
і{type},вони
мають бути якомога загальнішими (це як префікс слід пропустити). Перегляньте приклади. - 4.Якщо повертається значення у вигляді списка, воно повинно мати назву у множині. Перегляньте приклади.
- 5.Завжди включайте
description
для всіх результатів, навіть якщо ви думаєте, що це очевидно. - 6.Уникайте налаштування
чутливих
аргументів, якщо ви повністю не контролюєте використання цього виводу в усіх місцях і у всіх модулях. - 7.Віддавайте перевагу
try()
(доступний з Terraform 0.13) надelement(concat(...))
(застарілий підхід для версій до 0.13)
Повертає щонайбільше один ідентифікатор із групи безпеки:
outputs.tf
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, "")
}
Якщо є декілька ресурсів одного типу, це слід пропустити в назві виводу:
outputs.tf
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)
}
outputs.tf
output "rds_cluster_instance_endpoints" {
description = "A list of all cluster instance endpoints"
value = aws_rds_cluster_instance.this.*.endpoint
}
Last modified 1yr ago