Попытка использовать список выводов стеков в качестве вывода модуля - PullRequest
0 голосов
/ 07 февраля 2019

У меня есть модуль, который создает переменное количество стеков CloudFormation.Это работает просто отлично, но у меня возникают проблемы при попытке использовать вывод стека в качестве вывода в модуле.Стек создает подсеть, и я указываю созданный идентификатор подсети как вывод стека.Затем я хочу вернуть список всех идентификаторов подсети как часть вывода модуля.Вот как я думаю, что мой вывод должен выглядеть так:

output "subnets" {
  value = ["${aws_cloudformation_stack.subnets.*.outputs["Subnet"]}"]
}

Когда я это делаю, я получаю целочисленную ошибку разбора.Terraform, похоже, рассматривает результаты как список, а не как карту.Есть ли способ заставить это работать?

Редактировать: Вот где я объявляю стеки:

resource "aws_cloudformation_stack" "subnets" {
  count = "${local.num_zones}"

  name = "Subnet-${element(local.availability_zones, count.index)}"
  on_failure = "DELETE"
  template_body = "${file("${path.module}/templates/subnet.yaml")}"
  parameters {
    CIDR = "${cidrsubnet(var.cidr,ceil(log(local.num_zones * 2, 2)), count.index)}"
    AZ = "${element(local.availability_zones, count.index)}"
    VPC = "${aws_cloudformation_stack.vpc.outputs["VPCId"]}"
  }
}

Затем в файле subnet.yaml есть вывод стека, который имеет ключ Subnet и является идентификатором подсети, которая была создана..

Все стеки созданы успешно, но я не могу экспортировать все созданные идентификаторы подсетей из моего модуля terraform.Не уверен, почему terraform рассматривает * .outputs как список, а * * outputs ["Subnet"] как список.Я предполагаю, что * .outputs конвертируется в список карт, но мне нужен список определенного ключа (подсети) на карте.

У меня есть не список примеров, работающих для стека и использующихвывод из стека как вывод модуля terraform:

resource "aws_cloudformation_stack" "vpc" {
  name = "${var.name_prefix}-VPC"
  on_failure = "DELETE"
  template_body = "${file("${path.module}/templates/vpc.yaml")}"
  parameters {
    CIDR = "${var.cidr}"
  }
}

output "vpc" {
  value = "${aws_cloudformation_stack.vpc.outputs["VPCId"]}"
}

Мне удалось обойти эту проблему, объявив данные для поиска подсетей после создания.Это не идеально, но заставляет меня пройти мимо застревания.Дайте мне знать, если кто-нибудь знает, как сделать то, что я изначально пытался сделать.Вот что я придумал:

data "aws_subnet_ids" "subnets" {
  depends_on = ["aws_cloudformation_stack.subnets"]
  vpc_id = "${aws_cloudformation_stack.vpc.outputs["VPCId"]}"
}

output "subnets" {
  value = "${data.aws_subnet_ids.subnets.ids}"
}
...