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!