lesson ── terraform-beginner ── ~12 мин ── 3 шагов
Когда несколько ресурсов используют один и тот же префикс, набор
тегов или вычисленное значение, копипастить плохо. HCL даёт два
инструмента: locals для именованных значений внутри HCL и
встроенные функции для трансформации строк, чисел, списков.
В этом уроке слепим имя бакета из переменной + текущего региона, общие теги вынесем в locals, и применим строковые функции для нормализации. Это финал beginner-трека. См. tf-locals, tf-interpolation, tf-functions-string.
интерактивный sandbox
Поднимется пара контейнеров: terraform 1.9 и localstack 3.8 в одной сети. В браузере откроется терминал, можно сразу terraform init. Каждый шаг проверяется автоматически. TTL 45 минут, без регистрации.
stack ── terraform · localstack · 1 GB RAM · самоуничтожается через 45 мин простоя
Создай main.tf:
variable "env" {type = string
default = "dev"
}
data "aws_region" "current" {}locals { name_prefix = "linuxlab-${var.env}-${data.aws_region.current.name}" common_tags = {Project = "linuxlab-terraform-course"
Env = var.env
ManagedBy = "terraform"
}
}
resource "aws_s3_bucket" "logs" { bucket = "${local.name_prefix}-logs-${random_id.suffix.hex}"tags = local.common_tags
}
resource "aws_s3_bucket" "data_store" { bucket = "${local.name_prefix}-data-${random_id.suffix.hex}"tags = local.common_tags
}
resource "random_id" "suffix" {byte_length = 4
}
Заметь:
local.name_prefix, собирается из переменной и data.local.common_tags, один раз, два раза используется.cd /home/student/tf-locals
terraform init -input=false
terraform apply -auto-approve -input=false
Префикс `local.x` без s: типичная ошибка. Объявление: `locals { ... }`, ссылка, `local.x`.
✓ Оба бакета получили один и тот же набор тегов через locals.
Добавь файл outputs.tf:
output "buckets_summary" {value = format(
"%s в регионе %s: logs=%s, data=%s",
upper(var.env),
data.aws_region.current.name,
aws_s3_bucket.logs.bucket,
aws_s3_bucket.data_store.bucket,
)
}
output "common_tags" {value = local.common_tags
}
Запусти:
terraform apply -auto-approve
terraform output buckets_summary
Получишь строку вида:
"DEV в регионе us-east-1: logs=linuxlab-dev-us-east-1-logs-abc12345, data=linuxlab-dev-us-east-1-data-abc12345"
format(), это sprintf. %s, placeholder для строки. upper()
Подробнее, tf-functions-string.
Если apply жалуется на «inconsistent format»: проверь, что число %s совпадает с числом аргументов после spec.
✓ Output собран через format() из нескольких источников: locals, data, переменной.
S3, не единственное место, где удобны locals. Тот же common_tags
и name_prefix отлично ложатся на другие AWS-ресурсы, которые
LocalStack эмулирует:
# IAM-роль с общими тегами
resource "aws_iam_role" "events_handler" { name = "${local.name_prefix}-events-handler" tags = merge(local.common_tags, { Purpose = "events" }) assume_role_policy = jsonencode({Version = "2012-10-17"
Statement = [{Action = "sts:AssumeRole"
Effect = "Allow"
Principal = { Service = "lambda.amazonaws.com" }}]
})
}
# SQS-очередь, общий префикс, общие теги, своё Purpose
resource "aws_sqs_queue" "events" { name = "${local.name_prefix}-events" tags = merge(local.common_tags, { Purpose = "events-queue" })}
Дальше, beginner-трек закрывается. Темы intermediate:
terraform plan в PR, apply после ревью.terraform test или terratest.То же самое на OpenTofu, locals и встроенные функции работают идентично, синтаксис идентичен. См. tf-opentofu-parity.
Ты вынес общий префикс и теги в locals, использовал функции
upper(), lower(), format() для нормализации, и собрал
имя бакета из нескольких частей. HCL стал DRY: добавишь
новый ресурс, он автоматически получит общие теги.
команды
terraform consoleпроверить значение local.x перед applyterraform planувидеть как локалы развернулись в реальные значенияконцепции