Terraform от HashiCorp стал де-факто стандартом для описания инфраструктуры как кода (IaC). Но написать работающую конфигурацию — это только половина дела. Чтобы код был безопасным, эффективным и не превратился в не поддерживаемый «спагетти-код» через полгода, нужно следовать продвинутым практикам. Собрали советы от экспертов, которые годами управляют тысячами ресурсов с помощью Terraform.
Совет 1: Принцип модульности и переиспользования. Не пишите моно-файл `main.tf` на тысячу строк. Дробите конфигурацию на логические модули. Хороший модуль — это черный ящик с четкими input (`variables.tf`) и output (`outputs.tf`). Например, модуль `network` создает VPC, подсети, NAT-шлюзы. Модуль `k8s-cluster` использует выходные данные модуля `network` (ID подсетей) для развертывания кластера. Используйте публичные Terraform Registry для проверенных модулей (например, модули от AWS или community) и создавайте свой внутренний registry для компании-специфичных компонентов.
Пример модуля для безопасной security group:
```
# modules/security-group/main.tf
resource "aws_security_group" "this" {
name = var.name
description = var.description
vpc_id = var.vpc_id
dynamic "ingress" {
for_each = var.ingress_rules
content {
from_port = ingress.value.from_port
to_port = ingress.value.to_port
protocol = ingress.value.protocol
cidr_blocks = ingress.value.cidr_blocks
}
}
tags = var.tags
}
# modules/security-group/variables.tf
variable "ingress_rules" {
type = list(object({
from_port = number
to_port = number
protocol = string
cidr_blocks = list(string)
}))
default = []
}
```
Совет 2: Управление состоянием (state) — это святое. Никогда не храните `terraform.tfstate` локально или в git. Используйте удаленный бэкенд с блокировкой (locking), например, S3 + DynamoDB для AWS или Azure Storage Account для Azure. Это предотвратит конфликты при одновременной работе нескольких инженеров. Для изоляции сред (dev, staging, prod) используйте разные файлы состояния (workspaces или отдельные конфигурации бэкенда). Регулярно делайте бэкапы состояния.
Совет 3: Динамические конструкции и циклы вместо копипасты. Используйте `for_each` и `count` для создания множества похожих ресурсов. Это делает код сухим (DRY) и управляемым.
Пример создания множества облачных хранилищ (buckets):
```
locals {
buckets = {
logs = "myapp-logs-${var.environment}"
data = "myapp-data-${var.environment}"
backup = "myapp-backup-${var.environment}"
}
}
resource "aws_s3_bucket" "this" {
for_each = local.buckets
bucket = each.value
acl = "private"
server_side_encryption_configuration {
rule {
apply_server_side_encryption_by_default {
sse_algorithm = "AES256"
}
}
}
tags = {
Name = each.key
}
}
```
Совет 4: Безопасность через политики и статический анализ. Никогда не хардкодите секреты в `.tf` файлах. Используйте переменные, которые можно注入 через environment variables или системы управления секретами (HashiCorp Vault, AWS Secrets Manager). Интегрируйте в CI/CD пайплайн инструменты статического анализа кода, такие как `terraform validate`, `tflint`, и `checkov` или `tfsec` для поиска проблем безопасности (открытые порты, публичные buckets).
Совет 5: Планирование и проверка перед применением. Всегда выполняйте `terraform plan` и внимательно изучайте вывод перед `terraform apply`. Используйте флаг `-out` для сохранения плана и его последующего безопасного применения. Для production-сред внедряйте mandatory code review для всех изменений Terraform кода и требуйте approval перед применением.
Совет 6: Использование workspaces и переменных окружения для изоляции. Workspaces Terraform позволяют использовать одну и ту же конфигурацию для разных сред, но с разными состояниями. Комбинируйте это с переменными типа `terraform.workspace` и условными выражениями.
Пример условного создания ресурса только в prod:
```
resource "aws_instance" "monitoring" {
count = terraform.workspace == "prod" ? 1 : 0
ami = data.aws_ami.ubuntu.id
instance_type = "t3.large"
# ... другие параметры
}
```
Совет 7: Документация через `README.md` и описания. Каждый модуль должен иметь понятный README с примерами использования. Внутри кода активно используйте аргумент `description` в переменных и ресурсах. Это поможет коллегам и вашему «будущему я» понять назначение блока.
Следуя этим советам, вы превратите свои Terraform-конфигурации из набора скриптов в надежную, документированную и легко управляемую систему, которая масштабируется вместе с ростом вашей инфраструктуры.
Terraform Pro: советы экспертов по написанию чистого, безопасного и поддерживаемого кода инфраструктуры
Сборник экспертных советов по написанию профессионального кода на Terraform, охватывающий модульность, безопасность, управление состоянием и лучшие практики для поддержки сложной инфраструктуры.
99
1
Комментарии (8)