Стендап Сьогодні 📢 Канал в Telegram @stendap_sogodni

🤖🚫 Контент вільний від AI. Цей пост на 100% написаний людиною, як і все на моєму блозі. Насолоджуйтесь!

27.07.2023

Terraform, його шари та редагування стану

Давно вже хочу написати про це статтю; кожного разу, як доводиться хірургічно виправляти стан. От сьогодні я створив неправильний aws_ecs_task_definition, а потім затупив та видалив його вручну, після чого Terraform навідсіч відмовився працювати. Коли багато працюєш з Terraform, варто мати таку ментальну модель того, як код декларацій Terraform перетворюється на зміни в реальному оточенні.

В центрі цього процесу знаходиться стан Terraform. Стан — це каталог всіх ресурсів, про які Terraform вже знає. З боку коду, ресурсом є кожна декларація resource, а з боку реального світу, до нього привʼязана та сутність, якою Terraform керує. Обовʼязково у кожній сутності є ідентифікатор, який зазвичай зазначається в кінці документації про ресурс. Це важливо тому, що сама сутність нічого про Terraform не знає — саме тому Terraform можна застосувати до будь-якої предметної галузі.

Але також саме тому важливо не створювати та не видаляти ресурси з Terraform власноруч. Взагалі, краще не міняти, але зі змінами Terraform впорається, а от коли розходяться уявлення про існування ресурсів — ручних виправлень не уникнути. Для того є команди state rm та import. Причому імпортувати можна будь-що, тільки треба буде вручну визначити ідентифікатор. Але на хмарному сервісі з імпортуванням складно, бо треба оголосити локально всі наявні змінні, що дратує. Є третя команда - taint - яка просить Terraform видалити ресурс та створити наново. Це інколи єдиний спосіб виправити помилки. (Але в моєму випадку за сьогодні допомогло видалення зі стану командою state rm.)

А поки набір реальних сутностей в стані не змінюється, все інше поміняти набагато легше. Вся структура коду служить тому, щоб побудувати список ресурсів — тому створення нових локальних змінних для рефакторингу взагалі ніяк не вплине на стан. Якщо ж ресурси перейменувати або перемістити в модуль, однак залишити за ними привʼязку до світу, то з сучасним Terraform це робиться на рівні конфігурації — блоком moved. Раніше треба було вживати команду state mv, що робило перейменування окремою процедурою. Блок moved застосовується водночас з рештою конфігурації, що розвʼязує руки для рефакторингу в будь-який зручний момент.