Список подсетей Terraform AWS рассматривается как строка с одним значением для экземпляра ec2 - PullRequest
1 голос
/ 09 мая 2019

У меня есть код для создания VPC, с 2 частными подсетями, 2xec2 экземплярами в приватной и бастионной в публичной.

В коде ec2 используется output.tf модуля VPC subnet_ids. так как есть 2 частные подсети, то генерируются 2 subnet_ids. когда эти сгенерированные значения subnet_id передаются в экземпляры ec2 вместо одного subnet_id, они одновременно подают 2 значения subnet_ids как одно значение.

В результате terraform не смог найти это значение subnet_ids, создание завершилось неудачей.

ошибка: Идентификатор подсети 'подсеть-0 ***********, подсеть-0 *************' не существует

редактирование подсетей * vpc.tf

private_subnets     = "10.10.20.#/#,10.10.20.#/#"

instanceec2.tf

subnet_id           = "${module.vpc.private_subnets}"

ниже приведены модули:

vpc_main.tf

// Private subnet/s
resource "aws_subnet" "private" {
  vpc_id            = "${aws_vpc.vpc.id}"
  cidr_block        = "${element(split(",", var.private_subnets), count.index)}"
  availability_zone = "${element(split(",", var.azs), count.index)}"
  count             = "${length(split(",", var.private_subnets))}"

  tags {
    Name        = "${var.name}-private-${element(split(",", var.azs), count.index)}"
    Team        = "${var.team}"
    Environment = "${var.environment}"
    Service     = "${var.service}"
    Product     = "${var.product}"
    Owner       = "${var.owner}"
    Description = "${var.description}"
    managed_by  = "terraform"
  }
}

resource "aws_route_table" "private" {
  vpc_id = "${aws_vpc.vpc.id}"
  count  = "${length(split(",", var.private_subnets))}"

  tags {
    Name        = "${var.name}-private-${element(split(",", var.azs), count.index)}"
    Team        = "${var.team}"
    Environment = "${var.environment}"
    Service     = "${var.service}"
    Product     = "${var.product}"
    Owner       = "${var.owner}"
    Description = "${var.description}"
    managed_by  = "terraform"
  }
}

resource "aws_route_table_association" "private" {
  subnet_id      = "${element(aws_subnet.private.*.id, count.index)}"
  route_table_id = "${element(aws_route_table.private.*.id, count.index)}"
  count          = "${length(split(",", var.private_subnets))}"
}
``````


vpc_outputs.tf

```````

output "private_subnets" {
  value = "${join(",", aws_subnet.private.*.id)}"
}

Ожидаемое значение - только один идентификатор подсети в качестве значения:

Ошибка: укажите 2 идентификатора подсети как одно значение.

aws_instance.ec2-instance [0]: 1 произошла ошибка:

  • aws_instance.ec2-instance.0: Ошибка запуска экземпляра источника: InvalidSubnetID.NotFound: ИД подсети 'подсеть-0 **********, подсеть-0 ********* ** 'не существует

Ответы [ 2 ]

0 голосов
/ 09 мая 2019

вы присоединяете идентификаторы подсети в вашей выходной переменной:

output "private_subnets" {
  value = "${join(",", aws_subnet.private.*.id)}"
}

Когда вы получите доступ к этому выходному значению с вашего instanceec2.tf, вы получите только эту объединенную строку идентификаторов. Итак, вам снова нужно проскочить полученное значение, как вы делали ранее, и получить доступ к соответствующему индивидуальному идентификатору с помощью индекса подсчета ресурса ec2:

resource "aws_instance" "default" {
    count     = "${length(split(",", module.vpc.private_subnets))}"
    subnet_id = "${element(split(",", module.vpc.private_subnets), count.index)}"
    ....
}    

Это должно решить твою проблему.

Кроме того, вы также можете вывести идентификаторы подсети непосредственно в виде списка:

output "private_subnets" {
  description = "The IDs of the private subnets as list"
  value       = ["${aws_subnet.private.*.id}"]
}

и затем получить к ним доступ с помощью:

subnet_id = "${element(module.vpc.private_subnets, count.index)}"
0 голосов
/ 09 мая 2019

Поскольку вы «присоединились» к результату, вам придется разделить снова, если вам требуется только одно значение подсети.Что-то вроде:

element(split(",", var.private_subnets), 0) 
...