Гайды

Terraform: основы и провайдеры AWS и GCP

init, plan и apply, state и remote backend, модули, импорт и дрейф, секреты вне .tf.

~10 мин чтения

Terraform: основы и провайдеры AWS и GCP

Terraform описывает инфраструктуру как HCL-код: providers (AWS, GCP, Azure…), resources, state, plan/apply. Этот гайд — базовый цикл и отличия облаков на уровне концепций; k8s часто ставят отдельным модулем или через GKE/EKS ресурсы. Обзоры сервисов: AWS: EC2, S3, RDS, VPC, GCP: GKE и Cloud Run, Azure: основы.


1. Инициализация

bash
terraform init
terraform fmt -recursive
terraform validate
terraform plan -out=tfplan
terraform apply tfplan

State — по умолчанию локальный terraform.tfstate; в команде — remote backend (S3 + DynamoDB lock, GCS + state lock).


2. Минимальный AWS пример

hcl
terraform {
  required_providers {
    aws = { source = "hashicorp/aws", version = "~> 5.0" }
  }
}

provider "aws" {
  region = var.region
}

resource "aws_s3_bucket" "logs" {
  bucket = var.bucket_name
}

Учётные данные — env, IAM role (OIDC с GitHub Actions), не long-lived keys в репозитории.


3. GCP ориентир

Provider google, проект через project, аутентификация GOOGLE_APPLICATION_CREDENTIALS или workload identity. Ресурсы: google_compute_network, google_container_cluster (GKE).


4. Переменные и модули

variables.tf, outputs.tf, modules/vpc — переиспользование. Пинning версий провайдеров обязателен.

Terragrunt (обёртка) помогает DRY для нескольких окружений с общими remote_state и provider блоками; альтернатива — Terraform Cloud/Enterprise workspaces или отдельные каталоги с копированием минимума. tflint и terraform-docs в CI улучшают читаемость и ловят опечатки в типах переменных.


5. Импорт и дрейф

Существующие ресурсы — terraform import. Расхождение state и облака — terraform plan покажет drift; иногда нужен refresh.


6. lifecycle и безопасные изменения

prevent_destroy для критичных ресурсов, create_before_destroy при смене ресурсов с downtime, replace_triggered_by в 1.2+ для явных пересозданий. moved блоки документируют рефакторинг без destroy/create.


7. for_each и динамика

Предпочитайте for_each map/set вместо count где возможно — стабильные адреса в state при удалении элемента из середины списка. dynamic blocks для вложенных ACL/правил без копипасты.


8. Чек-лист

  • Remote state + блокировка.
  • Workspaces или отдельные каталоги per env — политика команды.
  • Политики как код (OPA/Sentinel/Terraform Cloud policy).
  • Секреты не в .tf; SSM/Secret Manager + data source.
  • terraform plan в CI на каждый PR с read-only credentials.
  • Документировать required_version Terraform в блоке terraform {}.

Дальше: Ansible · тег Terraform