在 Terraform 中找不到处理变量

Handling variable not found in Terraform

我在 Terraform 中有两个 Launch Config 创建资源:一个用于现货定价,一个用于保留定价 - 根据 "use_spot_pricing" 布尔变量选择使用哪个。我需要 return 来自使用的任何资源的启动配置 ID。问题是条件爆炸说找不到未创建的资源的启动配置 ID。

我的代码如下:

resource "aws_launch_configuration" "launch_config_reserved_pricing" {
  //  If use_spot_pricing is true (which translates to 1), this resource is not created (i.e. count = 0).
  count                = "${1 - var.use_spot_pricing}"
  name_prefix          = "${var.resource_name_prefix}${var.envSuffix}-"
  image_id             = "${var.generic_ami_id}"
  instance_type        = "${var.instance_type}"
  key_name             = "${var.key_name}"
  security_groups      = ["${var.vpc_security_group_ids}"]
  iam_instance_profile = "${var.iam_instance_profile}"
  user_data            = "${data.template_file.lc_user_data.rendered}"
}

resource "aws_launch_configuration" "launch_config_spot_pricing" {
  //  If use_spot_pricing is true (which translates to 1), this resource is created once.  Otherwise the previous one is.
  count                = "${var.use_spot_pricing}"
  name_prefix          = "${var.resource_name_prefix}${var.envSuffix}-"
  image_id             = "${var.generic_ami_id}"
  instance_type        = "${var.instance_type}"
  key_name             = "${var.key_name}"
  security_groups      = ["${var.vpc_security_group_ids}"]
  iam_instance_profile = "${var.iam_instance_profile}"
  user_data            = "${data.template_file.lc_user_data.rendered}"
  spot_price           = "${var.spot_price}"
}

output "launch_config_id" {
  value = "${ var.use_spot_pricing == true ? aws_launch_configuration.launch_config_spot_pricing.id : aws_launch_configuration.launch_config_reserved_pricing.id }"
}

这会导致错误(第一个是使用现货定价资源,第二个是使用储备定价资源):

* module.create_launch_configs.module.parser.output.launch_config_id: Resource 'aws_launch_configuration.launch_config_reserved_pricing' not found for variable 'aws_launch_configuration.launch_config_reserved_pricing.id'
* module.create_launch_configs.module.filter.output.launch_config_id: Resource 'aws_launch_configuration.launch_config_spot_pricing' not found for variable 'aws_launch_configuration.launch_config_spot_pricing.id'

此解决方法失败:

output "launch_config_id" {
  value = "${coalesce(aws_launch_configuration.launch_config_spot_pricing.id , aws_launch_configuration.launch_config_reserved_pricing.id ) }"
}

这个解决方法也失败了:

output "launch_config_id" {
  value = "${coalesce( join( "" , aws_launch_configuration.launch_config_spot_pricing.id ) , join( "" , aws_launch_configuration.launch_config_reserved_pricing.id ) ) }"
}

还尝试使用 1 而不是 true,运气不好:

output "launch_config_id" {
  value = "${ var.use_spot_pricing == 1 ? aws_launch_configuration.launch_config_spot_pricing.id : aws_launch_configuration.launch_config_reserved_pricing.id }"
}

万一 Hashicorp 的任何人正在阅读,如果值 not selected 未定义,条件不应失败。不需要检查,只检查通过的条件的值。

虽然在这种特殊情况下 Terraform 不会快捷方式并且不会评估条件的假面可能很烦人,但您不需要它,因为您可以将现货价格默认为空字符串,然后如果不提供您获得按需实例启动配置。

因此,您不必做您当前正在做的事情,而是可以做:

variable "spot_price" {
  default = ""
}

resource "aws_launch_configuration" "launch_config" {
  name_prefix          = "${var.resource_name_prefix}${var.envSuffix}-"
  image_id             = "${var.generic_ami_id}"
  instance_type        = "${var.instance_type}"
  key_name             = "${var.key_name}"
  security_groups      = ["${var.vpc_security_group_ids}"]
  iam_instance_profile = "${var.iam_instance_profile}"
  user_data            = "${data.template_file.lc_user_data.rendered}"
  spot_price           = "${var.spot_price}"
}

output "launch_config_id" {
  value = "${aws_launch_configuration.launch_config.id}"
}