Файл стану в Terraform: що потрібно знати?
Автор статті — EPAM Systems Engineer Даніель Уерта.
Якщо ви віднедавна почали використовувати Terraform в якості інструменту для опису інфраструктури як коду (англ. Infrastructure as Code, IaC), можливо, ви ставили собі запитання, як саме TF дізнається, які ресурси потрібно створити, видалити або змінити під час виконання вашого коду.
Тут немає жодної магії: за це відповідає файл стану.
Як працює файл стану?
Щоразу, коли ви розгортаєте інфраструктуру за допомогою terraform apply, створюється файл з ім’ям terraform.tfstate. У цьому файлі міститься вся інформація про ресурси, керовані TF і в даний момент розгорнуті у вашій хмарі.
Ви можете переміщатися файлом, щоб побачити ключ з ім’ям ресурсів. Це масив, у якому перелічені всі елементи, створені за допомогою файлу конфігурації (після виконання terraform apply).
Якщо ви, наприклад, створюєте екземпляр EC2 в AWS, ваш файл tfstate матиме такий вигляд:
Але для чого саме потрібен файл стану, коли Terraform вибирає дії для виконання?
Щоб краще зрозуміти механізм роботи, варто розібратися в тому, що таке поточний і бажаний стан.
Поточний стан
Файл terraform.tfstate відповідає за збереження поточного стану інфраструктури, зокрема всієї інформації про ресурси, в даний момент розгорнуті у вашій хмарі (після виконання команди terraform apply).
Бажаний стан
Весь код у файлі main.tf або в будь-якому конфігураційному файлі з розширенням ".tf" відповідає бажаному стану. Тут ви вказуєте ресурси, які, імовірно, будуть створені в хмарі, де й відбувається та сама магія.
Terraform порівнює два стани — поточний і бажаний. Якщо вони відрізняються, TF внесе необхідні зміни, щоб поточний стан відповідав бажаному. Terraform показує результат порівняння під час виконання команди terraform plan у терміналі.
Приклад використання команди terraform plan
Припустимо, ви вже створили екземпляр EC2"t2.micro" за допомогою Terraform, і файл стану має такий вигляд:
Це і є поточний стан.
Тепер ви хочете змінити тип екземпляра з "t2.micro" на "t2.nano", тому бажаний стан (файл конфігурації Terraform) має бути змінений приблизно так:
Потім виконайте команду terraform plan, і висновок буде таким:
Як бачите, виведення команди 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, переконайтеся в тому, що ви точно розібралися з цією концепцією.