地形插值 使用地图查找功能将 var 转换为变量



我已经使用地形化导出了我当前的资源,并得到了一个包含所有安全组的巨大文件。

问题是,在每个安全组中,都有一些引用安全组ID的规则 - 这在我计划运行Terraform的新区域中不存在。 例如:

resource "aws_security_group" "my-group" {
name        = "my-group"
description = ""
vpc_id      = "${var.vpc["production"]}"
ingress {
from_port       = 80
to_port         = 80
protocol        = "tcp"
security_groups = ["sg-25bee542"] <-- this ID doesnt exists in the new region i'm planning to work on
self            = false
}

我创建了一个包含所有旧安全组的映射:

variable "security_groups" {
type    = "map"
default = {
"sg-acd22fdb" = "default"
"sg-52cd3025" = "my-group"
"sg-25bee542" = "my-group2"
...
}
}

现在,我正在尝试将硬编码sg-*id*解析为相应的安全组名称,并将其插入到变量中,以便第一个示例以这种方式工作:

resource "aws_security_group" "my-group" {
name        = "my-group"
description = ""
vpc_id      = "${var.vpc["production"]}"
ingress {
from_port       = 80
to_port         = 80
protocol        = "tcp"
security_groups = ["${aws_security_group.my-group2.id}"] <-- the 'my-group2' should be resolved from the map variable
self            = false
}

像这样:

resource "aws_security_group" "my-group" {
name        = "my-group"
description = ""
vpc_id      = "${var.vpc["production"]}"
ingress {
from_port       = 80
to_port         = 80
protocol        = "tcp"
security_groups = ["${aws_security_group.[lookup(security_groups,sg-25bee542]].id}"] <-- the 'my-group2' string should be resolved from the map variable by looking its sg ID
self            = false
}

我希望我在这个问题上说清楚了...有什么想法吗?

在 terraform 中访问地图变量的方式是这样的

${var.security_groups["sg-acd22fdb"]}

如果要获取sg_ID,可以相反的方式创建地图。

variable "security_groups" {
type    = "map"
default = {
"default = "sg-acd22fdb"
"my-group" = "sg-52cd3025"
"my-group2" = "sg-25bee542"
...
}
}

然后使用

${var.security_groups["my-group2"]}

按照建议,您需要反转地图。 您可以在原点(变量声明(处反转它,也可以使用transpose(map)函数。 类似的东西

${transpose(var.security_groups)["sg-acd22fdb"]}

可能有效

最新更新