terraform: прохождение списка через модули, получение «Ошибка: ... должен быть список» - PullRequest
0 голосов
/ 31 августа 2018

ETA: найдено обсуждение проблем Terraform Github, https://github.com/hashicorp/terraform/issues/13103. Известный и очень ... "особенный" ... выпуск.


После прохождения списка через два других модуля (от top.tf до autoscaling_group до launch_configuration), оба из которых определяют переменную как type = "list", я получаю следующую жалобу от terraform plan:

"Error: module.autoscaling_group.aws_launch_configuration.this: 
security_groups: should be a list"

Кажется, он распознает параметр как тип списка (если я удалю спецификацию типа из объявления переменной, он будет жаловаться). Но единственный способ заставить эту ошибку замолчать - заключить окончательное использование в скобки списка. Это кажется нелогичным (и я не видел, что происходит с apply, когда я это делаю) - что происходит?


Последовательность:

  • top.tf звонки security_group.
  • top.tf также вызывает autoscaling, передавая список с выходной группой безопасности id.
  • autoscaling вызывает launch_configuration, передавая параметр через.

Вот макет, содержимое .tf файлов ниже.

.
├── autoscaling_group
│   └── main.tf
├── launch_configuration
│   └── main.tf
├── security_group
│   └── main.tf
└── top.tf

Исходящий вызов в top.tf:

module "autoscaling_group" {
  source = "launch_configuration"
  security_groups = ["${module.security_group.id}"]
  }

Оскорбительное использование в launch_configuration/main.tf:

resource "aws_launch_configuration" "this" {
  name_prefix = "foobar"
  image_id = "this_is_fake"
  instance_type = "ts.small"
  security_groups = "${var.security_groups}"
  }
  • Если я добавлю скобки: ["${var.security_groups}"] Я не получу ошибку.
  • Если я удаляю type = "list" из блока определения переменной в launch_configuration/main.tf, terraform plan жалуется: module.autoscaling_group.var.security_groups: variable security_groups in module autoscaling_group should be type string, got list

Содержание top.tf:

provider "aws" {
  region = "us-east-1"
  }

module "security_group" {
  source = "security_group"
  }

module "autoscaling_group" {
  source = "launch_configuration"
  security_groups = ["${module.security_group.id}"]
  }

Содержание autoscaling_group/main.tf:

variable "security_groups" {
  type = "list"
  description = "The security groups to attach to launched instances."
  }

module "launch_configuration" {
  source = "launch_configuration"
  security_groups = "${var.security_groups}"
  }

resource "aws_autoscaling_group" "service_autoscaling_group" {

  name_prefix = "foobar"

  min_size = 1
  max_size = 1
  health_check_type = "EC2"
  launch_configuration = "${module.launch_configuration.name}"
  vpc_zone_identifier = ["this_is_fake"]
  }

Содержание launch_configuration/main.tf:

variable "security_groups" {
  type = "list"
  description = "The security groups to attach to launched instances."
  }

output "name" {
  value = "${aws_launch_configuration.this.name}"
  }

resource "aws_launch_configuration" "this" {
  name_prefix = "foobar"
  image_id = "this_is_fake"
  instance_type = "ts.small"
  security_groups = "${var.security_groups}"
  }

Опять же, если я оберну скобки вокруг RHS последнего назначения ["${var.security_groups}"], я не увижу ошибку от terraform plan. Но terraform распознает переменную как список (так как она жалуется на то, что она является типом списка, если я уберу type = "list" из объявления). Так почему он жалуется, что ожидает список здесь?

Содержание security_group/main.tf:

output "id" {
  value = "${aws_security_group.this.id}"
  description = "The security group ID."
  }

resource "aws_security_group" "this" {

  name_prefix = "foobar"
  vpc_id      = "this_is_fake"
  description = "foobar"

  egress {
    from_port       = 0
    to_port         = 0
    protocol        = "-1"
    cidr_blocks     = ["0.0.0.0/0"]
    }
  }

1 Ответ

0 голосов
/ 23 апреля 2019

У меня была такая же проблема, она должна быть решена в v0.12: https://github.com/hashicorp/terraform/issues/18923#issuecomment-434901762

Если вы хотите передать список в качестве параметра модуля, то здесь есть небольшой взлом. Я просто отправляю строку и затем анализирую ее в списке (пример с модулем резервного копирования AWS):

terraform.tf

module "your_module" {
  source = "./module_path"

  list_as_string = "${var.element_1};${var.element_1}"
}

. / Module_path / variables.tf

variable "list_as_string" {
  description = "List in string"
}

. / Module_path / main.tf

resource "resource" "exemple" {
  real_list = ["${split(";", var.list_as_string)}"]
}
...