Ответ
В моих проектах я никогда не храню реальные кредо в репозитории, даже в директории template. Вместо этого я использую подход с шаблонами и внешним управлением секретами.
Мой стандартный подход:
-
Шаблонизация с
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 -
Использование 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" } } -
Интеграция с 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"] } -
Для локальной разработки использую
.envфайлы, добавленные в.gitignore:# .gitignore *.env terraform.tfvars # terraform.tfvars.example (шаблон) db_password = "CHANGE_ME"
Ключевой принцип: секреты поступают в Terraform через защищенные каналы (переменные окружения CI/CD, Vault, AWS Secrets Manager), а не хранятся в репозитории.