Код-ревью Middle Terraform и IaC обновлено

Код-ревью: Terraform для прода

Вопрос

Команда описала продовую инфраструктуру. Найдите проблемы.

terraform {
  backend "local" {}
}
provider "aws" {
  region     = "eu-central-1"
  access_key = "AKIAEXAMPLEKEY"
  secret_key = "example-secret"
}
resource "aws_instance" "web" {
  count         = length(var.web_names)
  ami           = "ami-0abc1234"
  instance_type = "t3.micro"
}
resource "aws_security_group" "web" {
  ingress {
    from_port   = 22
    to_port     = 22
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }
}
resource "aws_db_instance" "main" {
  engine              = "postgres"
  instance_class      = "db.t3.medium"
  username            = "app"
  password            = "SuperSecret123"
  skip_final_snapshot = true
}

Коротко

Типичный «первый Terraform»: всё работает, но небезопасно и хрупко. Чек-лист для прода: удалённый state с блокировкой и шифрованием, зафиксированные версии, никаких секретов в коде, foreach для коллекций, минимальные правила сети и защита данных (preventdestroy, финальные снапшоты, бэкапы).

Что должен найти ревьюер

  1. Ошибкастрока 2
    Локальный state: нет общего доступа, блокировки и версионирования, state потеряется вместе с ноутбуком. Нужен удалённый backend с блокировкой.
  2. Безопасностьстрока 6
    Ключи облака в коде: утекут в git. Использовать переменные окружения, профиль или роль, в CI короткоживущие учётки через OIDC.
  3. Ошибкастрока 1
    Нет required_providers с версией: новая мажорная версия провайдера может сломать apply. Фиксировать версию и коммитить .terraform.lock.hcl.
  4. Ошибкастрока 10
    count по изменяемому списку: удаление имени из середины сдвинет индексы и пересоздаст соседние машины. Лучше for_each.
  5. Безопасностьстрока 19
    SSH открыт всему интернету. Ограничить адресами бастиона или VPN, а лучше доступ через SSM или бастион без публичного 22.
  6. Безопасностьстрока 26
    Пароль базы в коде и в git; к тому же он окажется в state. Генерировать и хранить в менеджере секретов.
  7. Ошибкастрока 27
    skip_final_snapshot = true для прод-базы: при удалении или пересоздании не останется снапшота. Плюс нет prevent_destroy.

Разбор

Типичный «первый Terraform»: всё работает, но небезопасно и хрупко. Чек-лист для прода: удалённый state с блокировкой и шифрованием, зафиксированные версии, никаких секретов в коде, for_each для коллекций, минимальные правила сети и защита данных (prevent_destroy, финальные снапшоты, бэкапы).

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.