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/lessons/tf-beginner-04-state

lesson ── terraform-beginner ── ~10 мин ── 4 шагов

State: что внутри файла terraform.tfstate

State, это файл, в котором Terraform запоминает, что он создал. Без state он не смог бы понять, какой бакет в облаке «его». В этом уроке ты создашь ресурс, посмотришь state своими глазами и научишься читать его через terraform state list и terraform show.

Подробное объяснение что такое state и почему он опасен, см. tf-state.

▶ интерактивный sandbox

Поднимется пара контейнеров: terraform 1.9 и localstack 3.8 в одной сети. В браузере откроется терминал, можно сразу terraform init. Каждый шаг проверяется автоматически. TTL 45 минут, без регистрации.

запустить sandbox →

stack ── terraform · localstack · 1 GB RAM · самоуничтожается через 45 мин простоя

Шаги

  1. 01

    Создай бакет: нам нужен ресурс в state

    В ~/tf-state уже лежит provider.tf. Создай main.tf:

    hcl
    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:

    bash
    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 записал туда созданный бакет.

  2. 02

    Посмотри список ресурсов в state

    Сам JSON-файл руками не читаем. Есть удобная команда:

    bash
    terraform state list

    Должно вывести:

    random_id.suffix
    aws_s3_bucket.demo

    Это адреса ресурсов, то, как ты ссылаешься на них в HCL и в других командах. Подробнее про адресацию, tf-references.

    подсказка

    Если вывод пустой: apply не прошёл. Вернись к шагу 1 и проверь.

    ✓ В state два ресурса: bucket и random_id. Дальше посмотрим атрибуты.

  3. 03

    Прочитай все атрибуты бакета

    Запусти:

    bash
    terraform state show aws_s3_bucket.demo

    Увидишь все атрибуты, те, что ты задал (bucket, tags), и те, что вычислило облако (arn, region, id). Это куда полнее, чем то, что было в HCL, провайдер заполняет десятки вычисляемых полей.

    Часть атрибутов ты увидишь как (sensitive value) если бы они были помечены чувствительными. У S3-бакета таких нет, почти всё открыто.

    подсказка

    Обрати внимание на `arn`: это глобальный идентификатор ресурса в AWS, он понадобится в следующих уроках.

    ✓ Видно arn, region, id и другие атрибуты: всё, что Terraform знает.

    То же самое на OpenTofu

    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 для полной матрицы.

    • → OpenTofu parity
  4. 04

    Прочитай state машинно: через jq

    В скриптах удобнее работать с JSON, чем парсить текст:

    bash
    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 совпало с ожиданием.

    Что ещё внутри state: serial и lineage

    Помимо resources в state есть служебные поля:

    • serial, счётчик. Каждый apply увеличивает на 1. Это защита от случайной подмены файла старой версией.
    • lineage, уникальный UUID этого state-файла, генерится один раз при init. Если ты случайно скопируешь state из другого проекта, lineage не совпадёт, Terraform откажется работать. Сам файл руками НЕ редактируй. Terraform проверяет инварианты. Все операции, через terraform state команды.
    • → Terraform state

Что ты узнал

Ты создал бакет, увидел запись о нём в state, прочитал атрибуты через CLI. Понял разницу между атрибутом, который Terraform знает сразу (bucket), и тем, что вычисляется облаком после создания (arn).

команды

  • terraform state listадреса всех ресурсов в state
  • terraform state show <address>все атрибуты конкретного ресурса
  • terraform show -json | jq '.values.root_module.resources'весь state машинно-читаемо

концепции

  • · State: это JSON-снапшот «что Terraform думает о реальности»
  • · Атрибуты делятся на заданные пользователем и вычисленные облаком
  • · Без state Terraform не знал бы, какие ресурсы трогать

← предыдущий

Large-scale state, разбиение монолита

следующий →

Troubleshooting Garden: Checkov fail в pipeline

Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки