首页 > 解决方案 > Terraform 模块 - 计数 = 0 时的输出错误

问题描述

我对 Terraform 比较陌生 - 我有一个如下的模块设置,如果在运行 terraform 计划时模块计数为“0”,我遇到的问题是输出。由于我使用了 element(concat 解决方法,但我遇到问题的输出是 DCPWUn,因此输出 PW 工作正常,我收到以下错误:

Error: Error refreshing state: 1 error(s) occurred:
* module.PrimaryDC.output.DCPWUn: At column 21, line 1: rsadecrypt: argument 1 should be type string, got type list in:
${element(concat("${rsadecrypt(aws_spot_instance_request.PrimaryDC.*.password_data,file("${var.PATH_TO_PRIVATE_KEY}"))}", list("")), 0)}

代码:

resource "aws_spot_instance_request" "PrimaryDC" {
  wait_for_fulfillment = true

  provisioner "local-exec" {
    command = "aws ec2 create-tags --resources ${self.spot_instance_id} --tags Key=Name,Value=${var.ServerName}0${count.index +01}"
  }

  ami                    = "ami-629a7405"
  spot_price             = "0.01"
  instance_type          = "t2.micro"
  count                  = "${var.count}"
  key_name               = "${var.KeyPair}"
  subnet_id              = "${var.Subnet}"
  vpc_security_group_ids = ["${var.SecurityGroup}"]
  get_password_data      = "true"

  user_data = <<EOF
  <powershell>
  Rename-computer -NewName "${var.ServerName}0${count.index +01}"
  </powershell> 
  EOF

  tags {
    Name = "${var.ServerName}0${count.index +01}"
  }
}

output "PW" {
 value = "${element(concat("${aws_spot_instance_request.PrimaryDC.*.password_data}", list("")), 0)}"
}

output "DCPWUn" {
 value = "${element(concat("${rsadecrypt(aws_spot_instance_request.PrimaryDC.*.password_data,file("${var.PATH_TO_PRIVATE_KEY}"))}", list("")), 0)}"
}

标签: terraform

解决方案


正如错误所说, rsadecrypt 有一个类型为列表的参数,而不是应有的字符串。如果要确保参数是字符串,则需要反转函数调用嵌套以确保 rsadecrypt 获取字符串:

output "DCPWUn" {
    value = "${rsadecrypt(element(concat(aws_spot_instance_request.PrimaryDC.*.password_data, list("")), 0),file("${var.PATH_TO_PRIVATE_KEY}"))}"

}


推荐阅读