Как использовать значения идентификатора 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.

Другие вопросы по тегам