У меня есть 2 скрипта для Terraform:
Используется для запуска серверов инфраструктуры (VPC, Группы безопасности, MySQL, Redis, Cassandra).
Используется для запуска приложения (автоматическое масштабирование групп, балансировщики нагрузки, записи 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 может записывать и читать, в принципе может использоваться для передачи данных из одной конфигурации в другую.