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"]
}
}