Azure Terraform: azurerm_lb_rule должен быть списком типов, получена строка типа

Я пытаюсь создать правило azure lb, используя element, и вот сообщение об ошибке и код, перечисленные ниже.

Что мне следует изменить в моем файле main.tf или файле variables.tf, чтобы элемент заработал. Однако, когда я предоставляю порты напрямую (с комментариями), код выполняется без каких-либо проблем.

Произошла 1 ошибка (и):

  • azurerm_lb_rule.test: произошла 1 ошибка (и):

  • azurerm_lb_rule.test: в столбце 3, строка 1: элемент: аргумент 1 должен быть списком типов, полученная строка типа в:

$ {element (var.lb_port ["$ {element (keys (var.lb_port), count.index)}"], 2)}

main.tf

resource "azurerm_lb_rule" "test" {
  resource_group_name            = "${azurerm_resource_group.test.name}"
  loadbalancer_id                = "${azurerm_lb.lb.id}"
  name                           = "LBRule"
  protocol                       = "Tcp"
  #frontend_port                  = 3389
  #backend_port                   = 3389
 protocol                       = "${element(var.lb_port["${element(keys(var.lb_port), count.index)}"], 0)}"
 frontend_port                  = "${element(var.lb_port["${element(keys(var.lb_port), count.index)}"], 1)}"
 backend_port                   = "${element(var.lb_port["${element(keys(var.lb_port), count.index)}"], 2)}"
  frontend_ip_configuration_name = "${var.frontend_name}"
}

variables.tf

variable "lb_port" {
  description = "Protocols to be used for lb health probes and rules."
  default     = {"var1" = "tcp,3389,3389"}
}

person Karthik    schedule 18.09.2019    source источник
comment
попробовать привести его в список? ${tolist(element(var.lb_port["${element(keys(var.lb_port), count.index)}"], 2))}   -  person 4c74356b41    schedule 18.09.2019


Ответы (1)


В соответствии с вашими требованиями вы можете определить переменную lb_port как тип карты, а затем использовать lookup для получения значения отдельного элемента из карты по его ключу.

Например,

variable "lb_port" {
  description = "Protocols to be used for lb health probes and rules."
   default = {
    "protocol" = "TCP"
    "frontend_port" = "3389"
    "backend_port" = "3389"
  }
}
...

resource "azurerm_lb_rule" "test" {
  resource_group_name            = "${azurerm_resource_group.test.name}"
  loadbalancer_id                = "${azurerm_lb.lb.id}"
  name                = "LBRule"
  #protocol            = "Tcp"
  #frontend_port                  = 3389
  #backend_port                   = 3389
  protocol                       = "${lookup(var.lb_port, "protocol" )}"
  frontend_port                  = "${lookup(var.lb_port, "frontend_port" )}"
  backend_port                   = "${lookup(var.lb_port, "backend_port" )}"
  frontend_ip_configuration_name = "${var.frontend_name}"
  ...
}

Дополнительные примеры ссылок можно найти здесь.

person Nancy Xiong    schedule 18.09.2019