使用变量中定义的键对局部地图进行 Terraform 插值
Terraform interpolation of locals map with key defined in a variable
局部地图的 Terraform 插值,键在变量中定义
Objective:
在变量中定义预设大小标签,资源配置使用本地映射中的预设值。
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"))
这呈现部分正确,但作为带有转义字符的字符串而不是资源 "\"local.large.volume_gb\""
如果您想要基于密钥的访问,您应该使 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
访问它
感谢@Luk2302 的回答,我也在看这个。我无法发表评论,所以我创建了另一个答案。
对于我的情况,我从 json 文件中读取了一个列表,然后依赖于环境,它将获得正确的值。
power.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
局部地图的 Terraform 插值,键在变量中定义
Objective: 在变量中定义预设大小标签,资源配置使用本地映射中的预设值。
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"))
这呈现部分正确,但作为带有转义字符的字符串而不是资源"\"local.large.volume_gb\""
如果您想要基于密钥的访问,您应该使 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
感谢@Luk2302 的回答,我也在看这个。我无法发表评论,所以我创建了另一个答案。 对于我的情况,我从 json 文件中读取了一个列表,然后依赖于环境,它将获得正确的值。
power.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