Назад | Перейти на главную страницу

Terraform - Объединение конфигураций инфраструктуры и приложений

У меня есть 2 скрипта для Terraform:

  1. Используется для запуска серверов инфраструктуры (VPC, Группы безопасности, MySQL, Redis, Cassandra).

  2. Используется для запуска приложения (автоматическое масштабирование групп, балансировщики нагрузки, записи DNS).

Мой вопрос в том, как лучше всего управлять этими файлами конфигурации. Я хочу, чтобы оба приложения находились в одном AWS VPC (который будет создан из инфраструктуры .tf файл)

РЕДАКТИРОВАТЬ: Чтобы прояснить мою точку зрения, у меня есть следующие настройки относительно Terraform:

Я хочу иметь все *.tf конфигурацию, которая будет развернута в том же AWS VPC в 2 этапа: сначала файлы .tf, а затем приложение .tf.

Такая многоуровневая конфигурация возможна с Terraform, но для нее требуется промежуточное хранилище для хранения информации из первой конфигурации (инфраструктуры, в вашем случае), чтобы ее можно было получить при применении второй конфигурации (приложения).

Самый простой способ сделать это - использовать встроенный в Terraform механизм «удаленного состояния» в качестве промежуточного хранилища. Для этого сначала нужно настроить удаленный сервер (при условии, что Terraform 0.9 или новее) в конфигурации инфраструктуры. Например, используя Amazon S3 для хранения:

terraform {
  backend "s3" {
    bucket = "example-state-bucket"
    key    = "infrastructure.tfstate"
    region = "us-east-1"
  }
}

Каждый раз, когда конфигурация серверной части изменяется, необходимо запускать terraform init для синхронизации состояния с новым местоположением.

Любая информация, которую вы хотите предоставить в конфигурации приложения, должна быть объявлена ​​как «выходная информация» конфигурации инфраструктуры:

output "aws_vpc_id" {
  value = "${aws_vpc.example.id}"
}

output "aws_subnet_a_id" {
  value = "${aws_subnet.a.id}"
}

output "aws_subnet_b_id" {
  value = "${aws_subnet.b.id}"
}

После добавления нового вывода запустите terraform apply чтобы гарантировать, что его значение вычислено и записано в состояние.

Наконец, мы готовы считать это значение из конфигурации приложения с помощью terraform_remote_state источник данных:

data "terraform_remote_state" "infrastructure" {
  backend = "s3"

  config {
    # Config values should match that of the infrastructure backend settings
    # as shown above.
    bucket = "example-state-bucket"
    key    = "infrastructure.tfstate"
    region = "us-east-1"
  }
}

# For example, to create an EC2 instance in one of the subnets
resource "aws_instance" "example" {
  # ...
  subnet_id = "${data.terraform_remote_state.infrastructure.aws_subnet_a_id}"
}

Более сложный пример этого шаблона, использующего Consul в качестве промежуточного хранилища данных, а не удаленное состояние Terraform, можно увидеть в моей серии статей о шаблон Terraform Environment + Application. Любое хранилище данных, в которое Terraform может записывать и читать, в принципе может использоваться для передачи данных из одной конфигурации в другую.