lesson ── terraform-beginner ── ~8 мин ── 3 шагов
Output, это значение, которое Terraform показывает после apply и сохраняет
в state. Используется чтобы передать что-то наружу: пользователю в
терминал, скрипту через terraform output -raw, или другому Terraform-
проекту через remote state.
В этом уроке создадим бакет, вернём его ARN наружу через output, и научимся
читать его в shell через terraform output -raw. См. tf-output.
интерактивный sandbox
Поднимется пара контейнеров: terraform 1.9 и localstack 3.8 в одной сети. В браузере откроется терминал, можно сразу terraform init. Каждый шаг проверяется автоматически. TTL 45 минут, без регистрации.
stack ── terraform · localstack · 1 GB RAM · самоуничтожается через 45 мин простоя
В ~/tf-out уже есть provider.tf. Создай файл main.tf:
resource "aws_s3_bucket" "demo" { bucket = "linuxlab-out-${random_id.suffix.hex}" tags = {Owner = "student"
}
}
resource "random_id" "suffix" {byte_length = 4
}
После init и apply бакет создастся в LocalStack.
Запусти всё одной цепочкой:
cd /home/student/tf-out
terraform init -input=false
terraform apply -auto-approve -input=false
Если что-то падает: открой `terraform apply` без auto-approve и прочитай вывод.
✓ Бакет создан. Теперь добавим output.
Добавь в директорию файл outputs.tf:
output "bucket_arn" {value = aws_s3_bucket.demo.arn
description = "ARN созданного S3-бакета: нужен для cross-account IAM."
}
output "bucket_name" {value = aws_s3_bucket.demo.bucket
}
aws_s3_bucket.demo.arn, ссылка на атрибут arn ресурса
aws_s3_bucket с именем demo. Этот атрибут вычисляется на стороне
облака и появляется в state после apply. См. tf-references.
После добавления output'ов нужно ещё раз сделать apply, он обновит state и покажет значения:
terraform apply -auto-approve
В конце вывода должна появиться секция Outputs: с двумя значениями.
Файл может называться как угодно, конвенция: `outputs.tf`.
✓ Output записан в state, видно через `terraform output`.
OpenTofu держит CLI и state совместимыми с Terraform по командам
этого шага: миграция обычно проходит через mv .terraform .terraform.bak; tofu init -upgrade. Но при первом переходе
сделай backup state и прогон на feature-branch - расхождения
концентрируются в новых фичах (variables в backend,
state-encryption, OCI registry-backed модули). См.
tf-opentofu-parity для полной матрицы.
В скриптах часто нужно достать значение output в переменную shell.
Для этого есть terraform output -raw имя_output:
BUCKET_ARN=$(terraform output -raw bucket_arn)
echo "ARN: $BUCKET_ARN"
BUCKET_NAME=$(terraform output -raw bucket_name)
echo "Name: $BUCKET_NAME"
Флаг -raw убирает JSON-обвязку и кавычки, удобно для подстановки.
Без -raw вывод был бы "arn:aws:s3:::..." с кавычками.
Эта команда. Это основной способ скриптов получить значения из развёрнутой инфры. Никаких ходить в AWS API через CLI. Terraform уже всё знает.
Если `terraform output bucket_arn` ругается «no outputs found», значит apply не прошёл, повтори предыдущий шаг.
✓ Output читается из CLI. Готово к интеграции с другими скриптами.
Если output помечен sensitive = true, в выводе terraform apply
он маскируется как (sensitive value). Но terraform output имя
напечатает его как есть, это правильно для скриптов, которым
нужно реальное значение. Имейте в виду: в state-файле sensitive
значения лежат открытым текстом, защита только от логов.
Ты добавил output "bucket_arn", увидел его в выводе apply, и прочитал
через terraform output -raw. Это тот же механизм, через который CI/CD
pipeline получает значения из развёрнутой инфры.
команды
terraform outputвсе output в человеческом форматеterraform output -raw bucket_arnодно значение без кавычек, для bashterraform output -jsonвсе output в JSON, для парсингаконцепции