linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
Intro
Lessons
Footer
linuxlab-УчебникиЦеныО платформеКонфиденциальность и куки
Copyright © 2026 LinuxLab. Все права защищены.
linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
  • Введение
  • Уроки
  • How it works
  • База знаний
  • Шпаргалка
  • Capstone
  • Собеседование
home/terraform/kb/Основы Terraform/tf-references

kb/core ── Основы Terraform ── beginner

Ссылки в HCL: как читать aws_s3_bucket.demo.bucket

Любое значение в HCL можно получить через адрес: var.x, local.x, aws_s3_bucket.demo.arn, module.net.vpc_id, data.aws_region.current.name. Понимание этого синтаксиса, половина продуктивности в Terraform.

view as markdown

Зачем понимать ссылки

В HCL почти всё, это ссылки. Имя бакета зависит от региона? Ссылаемся на data.aws_region. Имя зависит от переменной? var.something. Атрибут одного ресурса нужен в другом? aws_s3_bucket.demo.arn.

Без уверенного знания синтаксиса ссылок Terraform превращается в копипаст без понимания. С ним, наоборот.

Главные пять префиксов

ПрефиксЧтоПример
var.имяПеременнаяvar.region
local.имяЛокалlocal.name_prefix
тип.имя.атрибутResourceaws_s3_bucket.demo.arn
data.тип.имя.атрибутData-источникdata.aws_region.current.name
module.имя.output_имяOutput дочернего модуляmodule.network.vpc_id

Плюс есть специальные внутри блоков:

  • count.index, внутри блока с count.
  • each.key, each.value, внутри блока с for_each.
  • self.атрибут, внутри provisioner (advanced).

Простые примеры

hcl
variable "env" { default = "dev" }
locals {
  prefix = "myapp-${var.env}"
}
data "aws_region" "current" {}
resource "aws_s3_bucket" "logs" {
  bucket = "${local.prefix}-logs-${data.aws_region.current.name}"
  # myapp-dev-logs-us-east-1
}
resource "aws_s3_bucket_versioning" "logs" {
  bucket = aws_s3_bucket.logs.id   # ссылка на первый бакет
  versioning_configuration {
    status = "Enabled"
  }
}

Внутри ${...} vs без них

В современном HCL ${...} нужны только если выражение, часть строки:

hcl
# interpolation внутри строки, обязательны
bucket = "myapp-${var.env}-${local.region}"
# выражение целиком, кавычки и ${...} НЕ нужны
bucket = local.bucket_name
count  = var.instance_count
region = data.aws_region.current.name

Старый стиль "${var.foo}" для одного выражения тоже работает, но Terraform будет ругаться warning'ом «Interpolation-only expressions are deprecated».

Splat operator [*], взять одно поле от всех

Если ресурс создан с count или for_each, он становится list/map. Чтобы получить, например, все arn:

hcl
resource "aws_s3_bucket" "logs" {
  count  = 3
  bucket = "logs-${count.index}"
}
# Все arn'ы списком
output "all_arns" {
  value = aws_s3_bucket.logs[*].arn
  # = [aws_s3_bucket.logs[0].arn, aws_s3_bucket.logs[1].arn, aws_s3_bucket.logs[2].arn]
}

Знак [*] называется splat operator. Применяется к count и for_each одинаково.

Альтернативный синтаксис через for:

hcl
output "all_arns" {
  value = [for b in aws_s3_bucket.logs : b.arn]
}

Адреса с индексом

hcl
# count
aws_s3_bucket.logs[0]                # первый
aws_s3_bucket.logs[length(aws_s3_bucket.logs) - 1]  # последний
# for_each
aws_s3_bucket.regional["us"]
aws_s3_bucket.regional["eu"].arn
# внутри resource с count
resource "aws_s3_bucket" "logs" {
  count  = 3
  bucket = "logs-${count.index}"   # 0, 1, 2
}
# внутри resource с for_each
resource "aws_s3_bucket" "regional" {
  for_each = toset(["us", "eu"])
  bucket   = "data-${each.key}"     # us, eu
  tags     = { region = each.value }  # тот же us/eu, для toset
}

Какой атрибут существует у ресурса

Когда вы пишете aws_s3_bucket.demo.X, какие X доступны? Это зависит от провайдера. Список, в документации провайдера:

  • https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/s3_bucket

Раздел "Attributes Reference", что можно прочитать. Раздел "Arguments", что можно задать.

Совет: запомните адресацию terraform.io/providers/<vendor>/<provider>/latest/docs/resources/<resource_name>, пригодится постоянно.

Подводные камни

  • local vs locals снова. Объявление, locals { ... }, ссылка, local.name. Без s.

  • Ресурс с count в state, list. Адрес без индекса работает не везде. aws_s3_bucket.logs.arn, ошибка если count > 1. Нужно aws_s3_bucket.logs[0].arn или aws_s3_bucket.logs[*].arn.

  • var.имя, для variable, не для locals. Часто новички пишут var.prefix имея в виду local. Это два разных namespace.

  • (known after apply) ломает интуицию. Если вы ссылаетесь на атрибут, который вычисляется на стороне облака. Terraform знает что значение появится, но не показывает его в plan. Это нормально.

  • Циклические зависимости, фатальны. Если A ссылается на B, а B на A. Terraform упадёт с «cyclic dependency». Лечится через tf-locals или пересмотром архитектуры.

  • Ссылаться на ресурс из самого блока, нельзя. resource "x" { foo = self.bar }, self доступен только в provisioner блоках. Обычно, никак.

§ команды

bash
terraform console

Интерактивно проверить значение ссылки. Очень помогает с splat и for-выражениями.

bash
terraform state list

Полный список адресов в текущем state: копируй прямо из вывода.

bash
terraform state show aws_s3_bucket.demo

Все атрибуты ресурса: посмотреть на что можно ссылаться.

§ см. также

  • tf-resource-blockБлок resource: главный кирпич Terraformresource, это блок, который говорит Terraform «создай мне такую штуку в облаке». У него три части: тип ресурса (что это), имя (как зовём внутри), и аргументы (как настроить). 90% времени в Terraform, это написание таких блоков.
  • tf-variableБлок variable: вход в конфигурациюvariable, параметр, который принимает значение снаружи (CLI, env, .tfvars). Объявляешь в HCL: type, default, description, validation. Используешь как var.name. Нужен чтобы убрать хардкод и переиспользовать один HCL для разных окружений.
  • tf-localslocals: вычисляемые внутренние именаlocals: блок с именами, видимыми только внутри HCL (не вход, не выход). Удобны для DRY: один раз сосчитал общий префикс или теги: везде используешь через local.x. Не путать с variable (вход) и output (выход).
  • tf-outputБлок output: что Terraform возвращает наружуoutput, это значение, которое Terraform показывает после apply и сохраняет в state. Используется для (а) показать пользователю ID/ARN созданного ресурса, (б) передать значения между модулями, (в) скриптам через terraform output -raw.
  • tf-count-for-eachcount и for_each: несколько ресурсов из одного блокаcount создаёт N одинаковых ресурсов по индексам 0..N-1. for_each: ресурсы по ключам из set или map. Правило: count для одинаковых, for_each когда у каждого свои настройки. Если сомневаешься, бери for_each.
Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки