EngX Code Review: начни писать код еще лучше и построй эффективный процесс код-ревью.

Файл состояния в Terraform: что нужно знать?

Автор статьи — EPAM Systems Engineer Даниэль Уэрта.

Systems Engineer Daniel Huerta


Если вы недавно начали использовать Terraform как инструмент для описания инфраструктуры как кода (англ. Infrastructure as Code, IaC), возможно, вы задавались вопросом, как именно TF узнает, какие ресурсы нужно создать, удалить или изменить при выполнении вашего кода.

Здесь нет никакой магии: за это отвечает файл состояния.

Как работает файл состояния?

Каждый раз, когда вы разворачиваете инфраструктуру с помощью terraform apply, создается файл с именем terraform.tfstate. В этом файле содержится вся информация о ресурсах, управляемых TF и в данный момент развернутых в вашем облаке.

Вы можете перемещаться по файлу, чтобы увидеть ключ с именем ресурсов. Это массив, в котором перечислены все элементы, созданные с помощью файла конфигурации (после выполнения terraform apply).

Если вы, например, создаете экземпляр EC2 в AWS, ваш файл tfstate будет выглядеть так:

Файл tfstate с экземпляром EC2 в AWS

Но для чего именно нужен файл состояния, когда Terraform выбирает действия для выполнения?

Чтобы лучше понять механизм работы, стоит разобраться в том, что такое текущее и желаемое состояние.

Текущее состояние

Файл terraform.tfstate отвечает за сохранение текущего состояния инфраструктуры, включая всю информацию о ресурсах, в настоящее время развернутых в вашем облаке (после выполнения команды terraform apply).

Желаемое состояние

Весь код в файле main.tf или в любом конфигурационном файле с расширением ".tf" соответствует желаемому состоянию. Здесь вы указываете ресурсы, которые предположительно будут созданы в облаке, где и происходит то самое волшебство.

Terraform сравнивает оба состояния — текущее и желаемое. Если они отличаются, TF внесет необходимые изменения, чтобы текущее состояние соответствовало желаемому. Terraform показывает результат сравнения при выполнении команды terraform plan в терминале.

Пример использования команды terraform plan

Предположим, вы уже создали экземпляр EC2 "t2.micro" с помощью Terraform, и файл состояния выглядит следующим образом:

Файл состояния с экземпляром t2.micro в Terraform

Это и есть текущее состояние.

Теперь вы хотите изменить тип экземпляра с "t2.micro" на "t2.nano", поэтому желаемое состояние (файл конфигурации Terraform) должно быть изменено примерно так:

Желаемое состояния в Terraform при смене экземпляра с t2.micro на t2.nano

Затем выполните команду terraform plan, и вывод будет следующим:

Вывод команды terraform plan при смене экземпляра с t2.micro на t2.nano

Как видите, вывод команды terraform plan — это результат сравнения файла состояния с желаемым состоянием.

Как обновить состояние

Но что, если вы изменяете ресурс напрямую в интерфейсе облака без использования terraform apply — например, в AWS Console? Допустим, вы изменили тип экземпляра EC2 с "t2.micro" на "t2.large". Как будет изменен локальный файл terraform.tfstate, чтобы соответствовать этим удаленным изменениям?

У Terraform есть решение. Нужно просто выполнить команду terraform refresh, и конфигурация, которая в настоящее время выполняется в облачном провайдере, обновится в локальном файле terraform.tfstate.

Однако имейте в виду, что если ваш файл конфигурации TF не включает изменение, полученное с помощью terraform refresh, ваш экземпляр EC2 снова будет установлен как "t2.micro" при следующем выполнении terraform apply.

Заключение

Файл состояния — это основная концепция рабочего процесса Terraform. Четкое понимание того, как этот файл работает и используется в процессе развертывания, поможет вам диагностировать неполадки в сложных сценариях и разобраться в неожиданных результатах.

Если вы собираетесь пройти сертификацию Terraform Associate, убедитесь в том, что вы точно разобрались с данной концепцией.

Мнения, выраженные в статьях на сайте, принадлежат исключительно авторам и могут не совпадать с мнением редакции или участников Anywhere Club.
Материалы по теме
Следи за новостями на любимых платформах