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/Переменные и outputs/tf-output

kb/variables ── Переменные и outputs ── beginner

Блок output: что Terraform возвращает наружу

output, это значение, которое Terraform показывает после apply и сохраняет в state. Используется для (а) показать пользователю ID/ARN созданного ресурса, (б) передать значения между модулями, (в) скриптам через terraform output -raw.

view as markdown

Зачем нужен output

Когда Terraform создаст ресурс, у него появятся атрибуты, id, arn, endpoint. Иногда эти значения нужны:

  • Пользователю, посмотреть, какой URL получил создаваемый сервис.
  • Другому Terraform-проекту, через remote state.
  • Внешнему скрипту, aws_endpoint=$(terraform output -raw endpoint).
  • Родительскому модулю, child-модуль возвращает свои значения.

output, это способ «открыть» нужные значения наружу.

Базовый синтаксис

hcl
resource "aws_s3_bucket" "demo" {
  bucket = "my-bucket-12345"
}
output "bucket_arn" {
  value       = aws_s3_bucket.demo.arn
  description = "ARN созданного бакета: нужен для cross-account IAM-политик."
}
output "bucket_url" {
  value = "https://${aws_s3_bucket.demo.bucket}.s3.amazonaws.com"
}

После apply Terraform покажет:

Outputs:
bucket_arn = "arn:aws:s3:::my-bucket-12345"
bucket_url = "https://my-bucket-12345.s3.amazonaws.com"

sensitive, спрятать значение

hcl
output "db_password" {
  value     = aws_db_instance.main.password
  sensitive = true
}

Сейчас:

  • В terraform apply значение покажется как (sensitive value).
  • В terraform output db_password напечатает реальное значение (для скриптов).
  • В terraform output -raw db_password, то же.
  • В state-файле значение лежит открытым текстом. sensitive, только про логирование.

Если значение приходит из sensitive-переменной

Если output ссылается на переменную с sensitive = true, output тоже автоматически считается sensitive. Иначе Terraform упадёт с ошибкой «выводишь sensitive в non-sensitive output».

Чтобы вывести явно, пометьте output как sensitive.

depends_on в output

Редко но бывает: нужно гарантировать порядок создания ресурсов, на которые output ссылается косвенно:

hcl
output "endpoint" {
  value      = aws_lb.web.dns_name
  depends_on = [aws_lb_listener.https]
}

Зачем? Если другой проект читает этот output через remote state, можно гарантировать что listener настроен, иначе клиент будет получать пустоту.

В большинстве случаев depends_on в output не нужен.

Чтение output из CLI

bash
# Все output одним JSON
terraform output -json
# Один output, в человеческом формате
terraform output bucket_arn
# "arn:aws:s3:::my-bucket-12345"
# Один output, без кавычек и JSON-обвязки, для подстановки в shell
terraform output -raw bucket_arn
# arn:aws:s3:::my-bucket-12345
# В переменную bash
BUCKET_ARN=$(terraform output -raw bucket_arn)

-raw работает только для простых типов (string/number). Для list/map, используйте -json + jq.

Output между модулями

Если есть child-модуль:

hcl
# modules/vpc/outputs.tf
output "vpc_id" {
  value = aws_vpc.main.id
}

В родительском HCL:

hcl
module "network" {
  source = "./modules/vpc"
}
resource "aws_subnet" "private" {
  vpc_id = module.network.vpc_id   # ← обращение к output модуля
}

Префикс module.имя_модуля.имя_output. Это единственный способ child-модуля «отдать» значение наружу. Internal атрибуты модуля недоступны.

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

  • State-файл не шифруется. Сколько ни ставьте sensitive = true, значение лежит в terraform.tfstate в открытом виде. Для секретов нужно шифровать state на уровне backend (S3 с SSE-KMS, Terraform Cloud с шифрованием).

  • output читается через output() функцию не работает. В HCL нет способа сослаться на свой же output из другой части HCL. Хотите переиспользуемое значение, это tf-locals.

  • При удалении ресурса output исчезает. Если другой проект завязан через remote state, у него поломается. Думайте перед удалением.

  • output value должно быть вычислимо. Нельзя value = "${unknown_var}" если unknown_var не определён. Terraform упадёт с понятной ошибкой.

  • description полезно. Это документация для тех, кто будет использовать ваш output (в том числе вы через год). Не ленитесь его заполнять.

  • -raw для сложных типов, ошибка. Если попробовать terraform output -raw all_tags (где all_tags, map), упадёт с ошибкой. Только string/number.

§ команды

bash
terraform output

Показать все output в человеческом формате (после apply).

bash
terraform output -json

Все output в JSON: для парсинга в скриптах.

bash
terraform output -raw bucket_arn

Один output без кавычек: для подстановки в bash переменную.

bash
terraform output -raw bucket_arn | xargs aws s3 ls

Композиция в shell: взять ARN и передать дальше.

§ см. также

  • 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-referencesСсылки в 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.
Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки