Состояние и планирование — Примеры

Пример 1 — Два применения против одного файла состояния

Состояние — это файл на машине одного инженера, и второй инженер запускает применение в то же время. Оба плана читают одно состояние и оба выполняются. Объясните, что позволяет отсутствующая блокировка и где должно лежать состояние, прежде чем любое из применений начнётся.

инженер A: apply -> читает локальное состояние, план: 2 на добавление
инженер B: apply -> читает локальное состояние, план: 2 на добавление
оба применили -> существует 4 ресурса, 2 из них дубликаты

Решение

backend "remote" {
  # настройки вашего собственного бэкенда; подставьте значения, которые использует ваша команда
}
состояние теперь лежит за бэкендом, зашифрованное и с контролем доступа
A захватывает блокировку; B получает отказ, пока блокировка не снята
одно применение выполняется; другое повторяется по свежему состоянию

Удалённое состояние с блокировкой — вот что не даёт двум применениям перемешаться, и только так не появляется пара дубликатов. Блокировка обязательна, как только применяет больше одного человека. Состояние к тому же хранит значения, возвращённые API провайдера, — среди них строки подключения — в открытом виде, поэтому его нельзя коммитить, а доступ к нему нужно ограничивать. Ошибка — считать локальный файл удобным, а не общим ресурсом с секретом внутри.

Пример 2 — Принятие уже существующего ресурса

База данных была создана вручную до появления конфигурации. Теперь написано объявление, совпадающее с её реальными настройками, но план хочет создать вторую копию. Сделайте план пустым, ничего не пересоздавая.

конфигурация:  database "main" { size = "small" }   # создана руками, те же настройки
реальность:    одна база, id db-7f31
план:          + database.main   (1 to add)

Решение

$ terraform import database.main db-7f31
Imported database.main

$ terraform plan
Plan: 0 to add, 0 to change, 0 to destroy.

  database.main совпадает с реальностью: id, size и retention равны.

Запись в состоянии фиксирует, к какому реальному объекту относится объявление, поэтому эта связь не даёт плану предложить дубликат. Импорт работает только потому, что объявление было написано по реальным настройкам; если импортировать первым, следующий план будет полон расхождений. Ошибка — импортировать окружение целиком: принимайте по одному ресурсу, подтверждайте пустой план и переходите к следующему. Учётные данные базы данных теперь лежат в состоянии в открытом виде, поэтому ему место в удалённом бэкенде с шифрованием и контролем доступа, а не в репозитории.