Код-ревью 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, финальные снапшоты, бэкапы).
Что должен найти ревьюер
- Ошибкастрока 2Локальный state: нет общего доступа, блокировки и версионирования, state потеряется вместе с ноутбуком. Нужен удалённый backend с блокировкой.
- Безопасностьстрока 6Ключи облака в коде: утекут в git. Использовать переменные окружения, профиль или роль, в CI короткоживущие учётки через OIDC.
- Ошибкастрока 1Нет
required_providersс версией: новая мажорная версия провайдера может сломать apply. Фиксировать версию и коммитить.terraform.lock.hcl. - Ошибкастрока 10
countпо изменяемому списку: удаление имени из середины сдвинет индексы и пересоздаст соседние машины. Лучшеfor_each. - Безопасностьстрока 19SSH открыт всему интернету. Ограничить адресами бастиона или VPN, а лучше доступ через SSM или бастион без публичного 22.
- Безопасностьстрока 26Пароль базы в коде и в git; к тому же он окажется в state. Генерировать и хранить в менеджере секретов.
- Ошибкастрока 27
skip_final_snapshot = trueдля прод-базы: при удалении или пересоздании не останется снапшота. Плюс нетprevent_destroy.
Разбор
Типичный «первый Terraform»: всё работает, но небезопасно и хрупко. Чек-лист для прода: удалённый state с блокировкой и шифрованием, зафиксированные версии, никаких секретов в коде, for_each для коллекций, минимальные правила сети и защита данных (prevent_destroy, финальные снапшоты, бэкапы).
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.