Terraform: инфраструктура на уровне кода | страница 80



    dynamodb_table = "terraform-up-and-running-locks"

    encrypt        = true

  }

}

Выполните команды terraforminit и terraformapply, чтобы создать базу данных. Нужно учитывать, что на инициализацию даже небольшой базы данных в Amazon RDS может уйти около десяти минут, поэтому будьте терпеливы.

Итак, вы создали базу данных. Но как передать ее адрес и порт вашему кластеру веб-серверов? Для начала нужно добавить две выходные переменные в файл stage/data-stores/mysql/outputs.tf:

output "address" {

  value       = aws_db_instance.example.address

  description = "Connect to the database at this endpoint"

}

output "port" {

  value       = aws_db_instance.example.port

  description = "The port the database is listening on"

}

Выполните terraformapply еще раз, и в терминале должны появиться ваши выходные переменные:

$ terraform apply

(...)

Apply complete! Resources: 0 added, 0 changed, 0 destroyed.

Outputs:

address = tf-2016111123.cowu6mts6srx.us-east-2.rds.amazonaws.com

port = 3306

Теперь они хранятся и в состоянии Terraform для базы данных, которое находится в вашем бакете S3 в файле stage/data-stores/mysql/terraform.tfstate. Чтобы код вашего кластера веб-серверов прочитал содержимое этого файла состояния, добавьте в файл stage/services/webserver-cluster/main.tf источник данных terraform_remote_state:

data "terraform_remote_state" "db" {

  backend = "s3"

  config = {

    bucket = "(YOUR_BUCKET_NAME)"

    key    = "stage/data-stores/mysql/terraform.tfstate"

    region = "us-east-2"

  }

}

Благодаря этому источнику данных код кластера веб-серверов считывает файл состояния из тех же бакета S3 и папки, где свое состояние хранит база данных (рис. 3.11).

Рис. 3.11. База данных записывает свое состояние в бакет S3 (вверху), а кластер веб-серверов считывает его из того же бакета (внизу)

Важно понимать, что, как и все источники данных в Terraform, terraform_remote_state возвращает только доступную для чтения информацию. У вас нет никакой возможности поменять это состояние в коде кластера веб-серверов, поэтому то, что вы извлекаете состояние базы данных, не подвергает ее никакому риску.

Все выходные переменные БД хранятся в файле состояния, и вы можете считывать их из источника данных terraform_remote_state, используя ссылку на атрибут следующего вида:

data.terraform_remote_state..outputs.

Например, вот как можно обновить пользовательские данные веб-серверов кластера, чтобы они извлекали из источника terraform_remote_state адрес и порт базы данных и возвращали их в виде HTTP-ответа: