#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