Как работать с кредо (credentials), находящимися в директории template?

«Как работать с кредо (credentials), находящимися в директории template?» — вопрос из категории Terraform, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В моих проектах я никогда не храню реальные кредо в репозитории, даже в директории template. Вместо этого я использую подход с шаблонами и внешним управлением секретами.

Мой стандартный подход:

  1. Шаблонизация с envsubst:

    # template/credentials.tpl.tf
    variable "db_password" {
     type = string
     default = "${DB_PASSWORD}"
    }
    
    # В CI/CD или локально перед terraform apply
    export DB_PASSWORD=$(vault read -field=password secret/db/prod)
    envsubst < template/credentials.tpl.tf > variables.tf
  2. Использование Terraform Backend с поддержкой шифрования (например, AWS S3 + KMS):

    # backend.tf
    terraform {
     backend "s3" {
       bucket = "my-terraform-state"
       key    = "prod/terraform.tfstate"
       region = "us-east-1"
       encrypt = true
       kms_key_id = "alias/terraform-state-key"
     }
    }
  3. Интеграция с HashiCorp Vault для динамических секретов:

    data "vault_generic_secret" "db_creds" {
     path = "database/creds/my-role"
    }
    
    resource "aws_db_instance" "default" {
     password = data.vault_generic_secret.db_creds.data["password"]
    }
  4. Для локальной разработки использую .env файлы, добавленные в .gitignore:

    # .gitignore
    *.env
    terraform.tfvars
    
    # terraform.tfvars.example (шаблон)
    db_password = "CHANGE_ME"

Ключевой принцип: секреты поступают в Terraform через защищенные каналы (переменные окружения CI/CD, Vault, AWS Secrets Manager), а не хранятся в репозитории.