Terraform вывод из 2 строк в список - PullRequest
0 голосов
/ 19 января 2020

В terraform у меня есть 2 выхода данных:

data "aws_instances" "daas_resolver_ip_1" {
  instance_tags = {
    Name = "${var.env_type}.${var.environment}.ns1.${var.aws_region}.a."
  }
}

data "aws_instances" "daas_resolver_ip_2" {
  instance_tags = {
    Name = "${var.env_type}.${var.environment}.ns2.${var.aws_region}.b."
  }
}

Я хочу получить private_ip из каждого из них, объединить их в список и использовать следующим образом:

  dhcp_options_domain_name_servers  = ["${data.aws_instances.daas_resolver_ip_1.private_ip}", "${data.aws_instances.daas_resolver_ip_1.private_ip}"]

Как мне этого добиться? На данный момент это ошибка, которую я получаю:

Error: module.pmc_environment.module.pmc_vpc.aws_vpc_dhcp_options.vpc: domain_name_servers: should be a list

1 Ответ

0 голосов
/ 21 января 2020

Я считаю, что то, с чем вы здесь столкнулись, является общим ограничением для Terraform 0.11. Если это новая конфигурация, то, начиная с Terraform 0.12, следует полностью избежать этой проблемы, поскольку это ограничение было устранено в основной версии Terraform 0.12.

Основная проблема заключается в том, что значения private_ip по крайней мере одного эти ресурсы неизвестны при планировании (они будут выбраны удаленной системой во время применения), но тогда проверка типа Terraform 0.11 завершится неудачно, потому что она не может доказать, что эти неизвестные значения в конечном итоге создадут список строк, поскольку dhcp_options_domain_name_servers требует .


Terraform 0.12 решает эту проблему путем отслеживания информации о типе для неизвестных значений и распространения типов через выражения, чтобы, например, в этом случае он мог знать, что результатом является список из двух строк, но сами строки не являются известно еще. С точки зрения Terraform 0.11, это просто неизвестное значение без какой-либо информации о типе, и поэтому оно не считается списком, вызывающим это сообщение об ошибке.


A обходной путь для Terraform 0.11 - использовать аргумент -target, чтобы попросить Terraform сначала выполнить операции, необходимые для изучения значений private_ip, а затем снова запустить Terraform как обычно, как только эти значения станут известны:

terraform apply -target=module.pmc_environment.module.pmc_vpc.data.aws_instances.daas_resolver_ip_1 -target=module.pmc_environment.module.pmc_vpc.data.aws_instances.daas_resolver_ip_2
terraform apply

Первый terraform apply с установленным -target должен иметь дело с двумя ресурсами данных, а затем последующий terraform apply без аргументов должен иметь возможность увидеть, какие два IP-адреса.

Это будет работать только в том случае, если все значения, влияющие на конфигурации ресурсов данных, останутся стабильными после начального этапа создания. Вам нужно будет повторить этот двухэтапный процесс для последующих изменений, если какой-либо из var.env_type, var.environment или var.aws_region станет неизвестным в результате других запланированных действий.

...