Terraform: инфраструктура на уровне кода | страница 79
variable "db_password" {
description = "The password for the database"
type = string
}
Обратите внимание на то, что у нее нет параметра default. Это сделано намеренно. Вы не должны хранить свой пароль к базе данных или любую чувствительную информацию в открытом виде. Вместо этого значение следует брать из переменной среды.
Напоминаю, что каждой входной переменной, определенной в конфигурации Terraform (как foo), можно предоставить значение, которое берется из переменной среды (вроде TF_VAR_foo). Для входной переменной db_password нужно установить переменную среды TF_VAR_db_password. Вот как это делается в системах Linux/Unix/OS X:
$ export TF_VAR_db_password="(YOUR_DB_PASSWORD)"
$ terraform apply
(...)
Стоит отметить, что пробел перед командой export указан не случайно. Он нужен, чтобы ваши конфиденциальные данные не были сохранены на диск в истории bash40. Но есть лучший способ предотвратить случайную запись конфиденциальных данных на диск в открытом виде: хранить их в секретном хранилище, совместимом с командной строкой, таком как pass (https://www.passwordstore.org/), и безопасно считывать их оттуда в переменные среды с помощью дочерней командной оболочки:
$ export TF_VAR_db_password=$(pass database-password)
$ terraform apply
(...)
Конфиденциальные данные всегда хранятся в состоянии Terraform
Считывание конфиденциальных данных из секретного хранилища или переменных среды — хороший способ предотвратить их хранение в открытом виде внутри вашего кода. Но помните: вне зависимости от того, как вы их читаете, если они передаются в качестве аргумента в ресурс, такой как aws_db_instance, они автоматически сохраняются в состоянии Terraform в виде обычного текста.
Это известное слабое место Terraform, у которого нет эффективных решений. Поэтому будьте максимально бдительны с тем, как вы храните файлы состояния (например, всегда включайте шифрование) и кто имеет к ним доступ (скажем, ограничивайте доступ к своему бакету S3 с помощью привилегий IAM)!
Вслед за конфигурацией пароля нужно сделать так, чтобы модуль хранил свое состояние в бакете S3, который вы создали ранее в файле stage/data-stores/mysql/terraform.tfstate:
terraform {
backend "s3" {
# Поменяйте это на имя своего бакета!
bucket = "terraform-up-and-running-state"
key = "stage/data-stores/mysql/terraform.tfstate"
region = "us-east-2"
# Замените это именем своей таблицы DynamoDB!