ETA: Обсуждение вопросов github terraform, 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}"
}
Опять же, если я заключу в скобки правую часть последнего присвоения ["${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"]
}
}





У меня была такая же проблема, она должна быть решена в v0.12: https://github.com/hashicorp/terraform/issues/18923#issuecomment-434901762
Если вы хотите передать список в качестве параметра модуля, вот небольшой прием. Я просто отправляю строку, а затем анализирую ее до списка (пример с модулем AWS Backup):
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)}"]
}
Кажется, это известная проблема: github.com/hashicorp/terraform/issues/13103 @@! $ !!% ## $$ !!!