Как защитить State File от удаления в Terraform

Ответ

Для защиты Terraform State File от случайного или злонамеренного удаления я использую комбинацию подходов:

  1. Удаленный бэкенд с блокировкой Хранение state локально — антипаттерн. Я настраиваю удаленный бэкенд (например, AWS S3) с обязательным использованием блокировок (через DynamoDB). Это предотвращает параллельное выполнение terraform apply и гарантирует целостность.

    terraform {
      backend "s3" {
        bucket         = "company-terraform-state-prod"
        key            = "network/terraform.tfstate"
        region         = "eu-west-1"
        dynamodb_table = "terraform-state-locks"
        encrypt        = true
      }
    }
  2. Включение версионирования и политик жизненного цикла на бакете S3 Это позволяет восстановить state из предыдущей версии, если он был ошибочно перезаписан. Я также настраиваю правило жизненного цикла, запрещающее удаление (DenyDelete), или требую MFA-удаление.

  3. Строгий контроль доступа через IAM Право на запись в бакет state и таблицу блокировок получает только CI/CD-пайплайн (например, Jenkins, GitLab Runner). Разработчики имеют доступ только на чтение. Это реализуется через IAM-роли и политики.

  4. Резервное копирование в отдельный регион/аккаунт Для критичных сред я настраиваю асинхронную репликацию бакета S3 в другой регион или даже в отдельный, изолированный аккаунт AWS, используемый исключительно для бэкапов.

  5. Использование Terraform Cloud/Enterprise В корпоративной среде эти платформы предоставляют встроенную защиту state, включая шифрование, детализированный аудит доступа и управление версиями через интерфейс.

Ответ 18+ 🔞

А, ну это же классика, блядь! Защита стейт-файла — это как охранять свою последнюю бутылку пива на общей кухне в общаге. Один глаз закроешь — уже какой-то пидарас шерстяной под шумок прикончил и делает вид, что нихуя не было. Так что слушай сюда, как это делается по-взрослому, чтобы не было потом волнения ебать.

Первое и главное — хранение стейта локально на своей машине — это пизда рулю, полный распиздяйский подход. Это как оставить ключи от квартиры под ковриком и надеяться, что их никто не найдёт. Нет, чувак, надо тащить эту штуку на удалённый бэкенд. Я, например, в S3 его закидываю, но не просто так, а с блокировкой через DynamoDB. Это чтобы два идиота одновременно не начали terraform apply делать и не наворотили такого, что потом месяц расхлёбывать. Вот смотри, как это выглядит в коде — тут всё чётко:

terraform {
  backend "s3" {
    bucket         = "company-terraform-state-prod"
    key            = "network/terraform.tfstate"
    region         = "eu-west-1"
    dynamodb_table = "terraform-state-locks"
    encrypt        = true
  }
}

Второй момент — версионирование в самом бакете S3 включать надо обязательно. Это твоя страховка от кривых рук. Залил хуйню в стейт, всё сломалось? Спокойно, ёпта, откатываешься на предыдущую версию файла, как будто ничего и не было. А ещё можно политику жизненного цикла настроить, чтобы удаление вообще запретить или потребовать MFA. Без этого — доверия ебать ноль, кто угодно может по ошибке или назло всё похерить.

Третье — доступы раздавать как последнему мудаку не надо. Право писать в этот священный бакет и таблицу блокировок получает только твой CI/CD-пайплайн, тот же Jenkins или GitLab Runner. Остальные, даже самые опытные инженеры, — только читать. Реализуется это через IAM, конечно. Иначе найдётся умник, который «немного поправит стейт руками», и будет вам хиросима и нигерсраки.

Четвёртое, для особо параноидальных (и это правильно) — бэкап в другой регион или аж в отдельный аккаунт. Стейт продакшена — это как семейные драгоценности. Один бакет в Ирландии, а его реплика — где-нибудь в Канаде, в аккаунте, куда доступ только у трёх человек с ключами от сейфа. Если основной аккаунт накрылся медным тазом, у тебя всегда есть шанс восстановиться.

Ну и пятое, для больших контор — Terraform Cloud/Enterprise. Это когда тебе надоело всё это ебать-колотить самому, и ты платишь деньги, чтобы за тебя это делали. Там из коробки и шифрование, и аудит кто-когда-что творил со стейтом, и управление версиями через веб-морду. Удобно, но стоит, ясное дело, овердохуища.

Короче, суть в том, чтобы относиться к стейт-файлу не как к временному лог-файлу, а как к единственному источнику правды о твоей инфраструктуре. Потерял его — и ты нихуя не помнишь, что и как у тебя там поднято. А восстанавливать всё по памяти — это, я тебе скажу, то ещё удовольствие, хуй с горы.