Как использовать значения идентификатора VPC и идентификатора подсети, которые были созданы из одного плана Terraform, в другом плане Terraform

Я создал VPC, подсети и группы безопасности в одном плане Terraform (назовем это Plan A). Он работал хорошо, и состояние также сохраняется в удаленном сервере S3.

Теперь у меня есть новый план Terraform (назовем его Plan B), в котором мне нужно запустить экземпляр EC2. Для этого мне нужно получить идентификаторы VPC и подсети из вывода Plan A Terraform.

Есть рекомендуемый способ сделать это?


person Anjankumar H N    schedule 29.08.2018    source источник


Ответы (2)


В Terraform есть 2 основных способа передачи результатов.

Первый и самый старый способ - использовать функцию удаленного состояния для получения выходных данных в другом файле состояния.

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

При этом вы должны использовать aws_vpc и _ 2_ источников данных для получения информации о соответствующих идентификаторах подсети.

Пример может выглядеть примерно так, как указано в 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 в VPC со значением тега Name, предоставленным переменной vpc.

Очевидно, вы можете продвинуться дальше, используя aws_ami источник данных, чтобы также получите идентификатор AMI, который вы хотите использовать, на основе некоторых критериев фильтрации. Это также помогает удалить некоторые из магических переменных, которые в противном случае могли бы быть в вашем коде Terraform.

person ydaetskcoR    schedule 29.08.2018

Если вы создали свои 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
  ...
}

Примечание. Старые ресурсы легко изменить, включив в них тег имени (или любой другой).

person ofirule    schedule 09.06.2020
comment
это мне очень помогло! - person aaron; 23.03.2021