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/how/tf-dependency-graph

how/workflow

Граф зависимостей: что Terraform параллелит, а что блокирует

Откуда Terraform узнаёт, в каком порядке создавать ресурсы. Граф из implicit-refs, параллельные «слои», и почему destroy идёт ровно в обратном направлении.

Когда ты пишешь:

hcl
resource "aws_s3_bucket" "demo" {
  bucket = "linuxlab-${random_id.suffix.hex}"
}
  • ты неявно сказал Terraform: aws_s3_bucket.demo зависит от random_id.suffix. Не потому что ты так сказал, а потому что в имени бакета лежит ссылка на атрибут другого ресурса. Это и есть implicit reference.

Terraform читает все такие ссылки, строит из них направленный ациклический граф (DAG) и сам решает, что создавать сначала, что потом, а что - параллельно. Жми ▶ - посмотрим, как это выглядит на пяти ресурсах.

step 1/6·00 · пять ресурсов в HCL
random_id.suffixIDLEaws_iam_role.lambdaIDLEaws_s3_bucket.demoIDLEaws_iam_policy.accessIDLEaws_..._policy_attachment.xIDLEMAIN.TFresource "random_id" "suffix" { byte_length = 4 }resource "aws_iam_role" "lambda" { ... }resource "aws_s3_bucket" "demo" { bucket = "linuxlab-${random_id.suffix.hex}"}resource "aws_iam_policy" "access" { role = aws_iam_role.lambda.id ... }resource "aws_iam_role_policy_attachment" "x" { role = aws_iam_role.lambda.name policy_arn = aws_iam_policy.access.arn}5 ресурсов в HCL · граф ещё не построен

§ шаги

  1. Учебный пример: bucket, который зависит от random_id (для уникального имени), IAM-роль, IAM-политика (привязана к роли), attachment (требует и роль, и политику).

    В HCL зависимости не записаны явно. Terraform увидит их сам в момент следующей команды.

итого

Что важно запомнить:

  • Зависимости вычисляются из кода. Любая ссылка A.B.C в значениях ресурса X автоматически создаёт ребро A → X.
  • Если зависимость есть, но её не видно в коде (например, IAM-роль должна существовать до того, как Lambda попробует ассумнуться, и Lambda этой роли в HCL не упоминает), пишут tf-depends-on явно. Это редкий случай, не первая опция.
  • Внутри одного слоя графа Terraform создаёт ресурсы параллельно (по умолчанию до 10 одновременно, флаг -parallelism=N). Поэтому большие конфиги быстрее, чем кажется.
  • На destroy граф разворачивается: листья (никто от них не зависит) удаляются первыми, корни (от которых зависят другие) - последними.
  • Циклы в графе = ошибка Error: Cycle. Terraform отказывается работать, пока ты её не разрулишь (обычно через рефакторинг или null_resource с break-the-cycle логикой). См. tf-dag-internals.

Дальше: tf-module-io-flow про то, как граф пересекает границы модулей.

§ копнуть в базу знаний

  • tf-dag-internalsDAG internals: как Terraform строит граф
  • tf-depends-ondepends_on: явная зависимость без ссылки
  • tf-graphterraform graph: визуализация в Graphviz
  • tf-referencesСсылки между ресурсами

§ попробовать руками

  • ›tf-beginner-09-lifecycle- Lifecycle: depends_on, create_before_destroy
  • ›tf-garden-01-cycle-error- Сломанный сад: cycle в графе
Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки