AWS Secrets Manager
Тема дорожной карты · Terraform
AWS Secrets Manager с Terraform — это паттерн интеграции для хранения, ротации и получения чувствительных значений — паролей баз данных, API-ключей, OAuth-токенов — в AWS Secrets Manager и их ссылки в HCL-конфигурациях без встраивания открытых секретов в tfvars-файлы или состояние. Ресурсы aws_secretsmanager_secret и aws_secretsmanager_secret_version провайдера AWS позволяют создавать секреты через terraform apply, тогда как источник данных aws_secretsmanager_secret_version получает значения секретов во время планирования, чтобы другие ресурсы могли их безопасно использовать. Пометка полученного значения как sensitive = true предотвращает вывод Terraform в terraform plan или CI-логах. Использование AWS Secrets Manager с Terraform — лучшая практика для production, позволяющая хранить учётные данные вне файла terraform.tfstate и обеспечивающая автоматическую ротацию без повторного запуска terraform apply.
Как это работает
AWS Secrets Manager — как секреты попадают в Terraform без попадания в git или plaintext-state. Варианты: env vars (TF_VAR_db_password), data-источники (data "aws_secretsmanager_secret_version" "db"), провайдер Vault, SOPS-зашифрованные *.tfvars, cloud-managed secrets (Yandex Lockbox, AWS Secrets Manager). State-файлы содержат resolved значения — шифруйте backend bucket + ограничивайте доступ. sensitive = true для переменных — для редакции в plan-выводе.
Когда применять
Никогда не коммитьте секреты в *.tf или *.tfvars в git. В CI — env vars; в production — secrets manager. Шифруйте state at rest (S3 SSE, Yandex Object Storage encryption) и ограничивайте, кто может его читать. Для team dev — SOPS-шифрованные tfvars + age/PGP-ключи. Периодический аудит terraform state pull | grep -i secret.
Типичные ошибки
Ловушки AWS Secrets Manager: output "password" { value = ... } без sensitive = true (печатается в CI-логах); секреты в tags или name ресурсов (state их содержит); ротация секрета руками, потом Terraform перезаписывает на следующий apply; расчёт, что "state-файл приватный" без проверки прав на backend. Read state — это audit-дыра.