Интерполяция терраформирования карты местных жителей с ключом, определенным в переменной

#terraform #terraform-provider-aws

Вопрос:

Интерполяция терраформирования карты местных жителей с ключом, определенным в переменной

Цель: Определение предустановленных меток размеров в переменной, предоставление ресурсов использует предустановленные значения из карты локальных объектов.

 
var "define_size" {
  description = "Select either small, medium, large"
  default = "large"
}


locals {

  small = {
    volume_gb = 1
    volume_count = 1
  }

  medium = {
    volume_gb = 20
    volume_count = 5
  }

  large = {
    volume_gb = 500
    volume_count = 10
  }

}


resource "aws_ebs_volume" "example" {
  availability_zone = var.availability_zone
  size              = ??????
}
 

Попытки:

  • size = local.$var.define_size.volume_gb . Очевидный неправильный синтаксис приводит к «Ошибке: Недопустимый символ». и «Ошибка: Недопустимое имя атрибута», ссылающееся на символ$.
  • size = local.${var.define_size}.volume_gb . Очевидный неправильный синтаксис приводит к «Ошибке: Недопустимый символ». и «Ошибка: Недопустимое имя атрибута», ссылающееся на символ$.
  • size = "${local[var.define_size].volume_gb}" . «Ошибка: Неверная ссылка. За ссылкой на тип ресурса должен следовать по крайней мере один доступ к атрибуту с указанием имени ресурса.»
  • size = tostring("local.${var.define_size}.volume_gb") это отображается правильно, но в виде строки, а не ссылки на ресурс "local.large.volume_gb"
  • format("%#v",tostring("local.${var.define_size}.volume_gb")) это отображается частично правильно, но в виде строки с escape-символами, а не ресурса ""local.large.volume_gb""

Ответ №1:

Если вам нужен доступ на основе ключей, вы должны сделать locals определение таким, чтобы оно работало с ключами, например map :

 locals {
  sizes = {
    small = {
      volume_gb = 1
      volume_count = 1
    }
    medium = {
      volume_gb = 20
      volume_count = 5
    }
    large = {
      volume_gb = 500
      volume_count = 10
    }
  }
}
 

а затем получите доступ к этому с помощью local.sizes[var.define_size].volume_gb

Комментарии:

1. Теперь это совершенно очевидно, не могу поверить, что я потратил время на другие попытки. Спасибо @luk2302

Ответ №2:

Спасибо @Luk2302 за ответ, я тоже искал это. Я не могу комментировать, поэтому я создаю другой ответ. В моем случае я читаю список из файла json, а затем, в зависимости от env, он получит правильное значение.

мощность.json

 [
  {
    "name": "a",
    "power": {
      "dev" : 1,
      "sit" : 2,
      "uat" : 3,
      "prod" : 4
    }
  }
]
 

В файле tf я использую, как показано ниже

 locals {
  power = jsondecode(file("power.json"))
}

resource "aws_example" "power" {
  count = length(local.power.*.name)
  power = local.power[count.index].power[var.env]
}
 

В зависимости от входного параметра var.env» мощность» будет иметь значение 1, 2, 3 или 4