lesson ── terraform-beginner ── ~10 мин ── 4 шагов
State, это файл, в котором Terraform запоминает, что он создал. Без
state он не смог бы понять, какой бакет в облаке «его». В этом уроке
ты создашь ресурс, посмотришь state своими глазами и научишься читать
его через terraform state list и terraform show.
Подробное объяснение что такое state и почему он опасен, см. tf-state.
интерактивный sandbox
Поднимется пара контейнеров: terraform 1.9 и localstack 3.8 в одной сети. В браузере откроется терминал, можно сразу terraform init. Каждый шаг проверяется автоматически. TTL 45 минут, без регистрации.
stack ── terraform · localstack · 1 GB RAM · самоуничтожается через 45 мин простоя
В ~/tf-state уже лежит provider.tf. Создай main.tf:
resource "aws_s3_bucket" "demo" { bucket = "linuxlab-state-${random_id.suffix.hex}" tags = {Owner = "student"
Purpose = "learning-state"
}
}
resource "random_id" "suffix" {byte_length = 4
}
Запусти init и apply:
cd /home/student/tf-state
terraform init -input=false
terraform apply -auto-approve -input=false
Если apply жалуется на provider: проверь что `provider.tf` есть и LocalStack отвечает (`wait-for-localstack.sh` должен был дождаться).
✓ Файл `terraform.tfstate` создан. Terraform записал туда созданный бакет.
Сам JSON-файл руками не читаем. Есть удобная команда:
terraform state list
Должно вывести:
random_id.suffix
aws_s3_bucket.demo
Это адреса ресурсов, то, как ты ссылаешься на них в HCL и в других командах. Подробнее про адресацию, tf-references.
Если вывод пустой: apply не прошёл. Вернись к шагу 1 и проверь.
✓ В state два ресурса: bucket и random_id. Дальше посмотрим атрибуты.
Запусти:
terraform state show aws_s3_bucket.demo
Увидишь все атрибуты, те, что ты задал (bucket, tags), и
те, что вычислило облако (arn, region, id). Это куда полнее,
чем то, что было в HCL, провайдер заполняет десятки вычисляемых
полей.
Часть атрибутов ты увидишь как (sensitive value) если бы они
были помечены чувствительными. У S3-бакета таких нет, почти всё
открыто.
Обрати внимание на `arn`: это глобальный идентификатор ресурса в AWS, он понадобится в следующих уроках.
✓ Видно arn, region, id и другие атрибуты: всё, что Terraform знает.
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 для полной матрицы.
В скриптах удобнее работать с JSON, чем парсить текст:
terraform show -json | jq '.values.root_module.resources[] | select(.address == "aws_s3_bucket.demo") | .values.tags'
Эта же команда, основа verify-типа terraform_state_resource,
который проверяет шаги уроков в этом курсе. Сейчас она должна
вернуть JSON-объект с двумя ключами: Owner и Purpose.
Главное: вы только что прочитали state так же, как Terraform сам это делает на каждом plan. Никакой магии, обычный JSON.
Если jq ругается «invalid JSON»: значит, state ещё не создан или путь неверный.
✓ State прочитан, tags.Purpose совпало с ожиданием.
Помимо resources в state есть служебные поля:
serial, счётчик. Каждый apply увеличивает на 1. Это защита
от случайной подмены файла старой версией.lineage, уникальный UUID этого state-файла, генерится один
раз при init. Если ты случайно скопируешь state из другого
проекта, lineage не совпадёт, Terraform откажется работать.
Сам файл руками НЕ редактируй. Terraform проверяет инварианты.
Все операции, через terraform state команды.Ты создал бакет, увидел запись о нём в state, прочитал атрибуты через CLI. Понял разницу между атрибутом, который Terraform знает сразу (bucket), и тем, что вычисляется облаком после создания (arn).
команды
terraform state listадреса всех ресурсов в stateterraform state show <address>все атрибуты конкретного ресурсаterraform show -json | jq '.values.root_module.resources'весь state машинно-читаемоконцепции