【问题标题】:Terraform Interpolation Into a var with map lookupTerraform Interpolation into a var with map lookup
【发布时间】:2026-01-13 01:15:01
【问题描述】:

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

问题是,在每个安全组中都有一些引用安全组 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 这样做?
  • 这将是最后的选择,要替换所有这些安全组还有很多工作。

标签: terraform


【解决方案1】:

在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"]}

【讨论】:

  • 我正在寻找名称,因此 var.security_group['sg-X'] 是正确的,但我想将该名称插入到资源引用中:aws_security_group.NAME.id NAME 在哪里解析通过提供 id 从地图变量中
【解决方案2】:

按照建议,您需要反转地图。您可以在原点反转它(变量声明)或使用transpose(map) 函数。 像

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

可能有用

【讨论】: