Как использовать значения идентификатора VPC и идентификатора подсетей, которые были созданы из одного плана Terraform, в другой план Terraform
Я создал VPC, подсети и группы безопасности в одном плане Terraform (назовем это Plan A
). Он выполнен хорошо, и состояние сохраняется в удаленном бэкэнде S3.
Теперь у меня есть новый план Terraform (давайте назовем это Plan B
) где мне нужно запустить экземпляр EC2. Для этого мне нужно получить VPC, идентификаторы подсети из Plan A
Терраформ выходной.
Есть ли рекомендуемый способ сделать это?
1 ответ
Если вы создали свой Plan A
vpc
а также subnet
с уникальным тегом (например: Name) вы можете легко получить их, используя следующий пример:
data "aws_vpc" "selected" {
filter {
name = "tag:Name"
values = ["my_vpc_name"]
}
}
data "aws_subnet" "selected" {
filter {
name = "tag:Name"
values = ["my_subnet_name"]
}
}
resource "aws_security_group" "sg" {
vpc_id = data.aws_vpc.selected.id
...
}
resource "aws_instance" "instance" {
vpc_security_group_ids = [ aws_security_group.sg.id ]
subnet_id = data.aws_subnet.selected.id
...
}
Примечание. Старые ресурсы легко изменить, включив в них тег имени (или любой другой).
Есть два основных способа передачи результатов в Terraform.
Первый и самый старый способ заключается в использовании функции удаленного состояния для извлечения выходных данных в другом файле состояния.
Второй, более новый, подход заключается в использовании источников данных вашего провайдера, которые предоставляют вашему провайдеру только для чтения запрос на получение информации о ресурсе.
С этим вы бы использовали aws_vpc
а также aws_subnet_ids
источники данных для получения информации о соответствующих идентификаторах подсети.
Пример может выглядеть примерно так, как указано в aws_subnet_ids
документы:
variable "vpc" {}
variable "ami" {}
data "aws_vpc" "selected" {
tags {
Name = "${var.vpc}"
}
}
data "aws_subnet_ids" "private" {
vpc_id = "${data.aws_vpc.selected.id}"
tags {
Tier = "Private"
}
}
resource "aws_instance" "app" {
count = "3"
ami = "${var.ami}"
instance_type = "t2.micro"
subnet_id = "${element(data.aws_subnet_ids.private.ids, count.index)}"
}
Это поместит один экземпляр EC2 в каждую из ваших 3 подсетей, помеченных Tier
знак равно Private
в ВПК с Name
значение тега, предоставленное vpc
переменная.
Очевидно, что вы можете продвинуть это дальше, используя aws_ami
источник данных для получения идентификатора AMI, который вы хотите использовать, основываясь на некоторых критериях фильтрации. Это также помогает удалить некоторые из более магических переменных, которые могут быть в вашем коде Terraform.