首页 文章

terraform通过标签值引用新资源

提问于
浏览
1

努力想要理解这一点,下面是我的真实世界的例子,但我想一般的问题是:

如何在模板中创建一组对象,并根据名称标签之类的内容引用ID作为特定对象,以便在另一个资源中使用?

现实世界的例子:

所以我基于作为列表变量提供的子网名称列表动态创建一堆子网

variable "subnet_names" {
description = "subnet list"
default = ["subnet1","subnet2","dmz-a","dmz-b"]
}


resource "aws_subnet" "subnets" {
count = "${length(var.subnet_names)}"  
vpc_id = "${aws_vpc.vpc.id}"
cidr_block = "${cidrsubnet(var.vpc_cidr, 6, count.index)}"
map_public_ip_on_launch = "false"
availability_zone ="${element(slice(data.aws_availability_zones.available.names, 0, 2), count.index)} "
tags = "${merge(var.common_tags, map("Name", "${var.domain_short_name}-${var.subnet_names[count.index]}"))}"
}

这工作正常,但我想说,只将NAT网关连接到某些子网,例如让我们说dmz,但我无法弄清楚如何为上面创建的特定子网引用subnet_id ...我认为必须有一个 Build 新子网 Map {subnet_ID:tags.name}的方法,并通过查找tags.name选择一个,这将是corp-dmz-a作为示例

resource "aws_nat_gateway" "nat" {
allocation_id = "${aws_eip.nat_gw.id}"
subnet_id = ???????????????????????????
tags = "${merge(var.common_tags, map("Name", "${var.vpc_name_prefix}${var.domain_short_name}${var.region_short_name}-NAT" ))}"
depends_on = ["aws_internet_gateway.igw","aws_subnet.subnets"]
}

关于如何处理这个问题的任何建议都会受到赞赏,我一直在试验几种不同的方法,但我认为我缺少一些基本的理解,也许甚至有更简单的插值和其他功能,我错过了

1 回答

  • 1

    管理提出似乎有效的解决方案,似乎也是一个非常方便的技术分享,所以我自己在这里回答

    //define data pull for subnets with a depends on the resource for creating the subnets so there will be subnets present before data is calculated
    data "aws_subnet" "dmz_for_nat" {
    depends_on = ["aws_subnet.subnets"]
    filter {
    name   = "tag:Name"
    values = ["${var.domain_short_name}-DMZ-B"]
    }
    }
    
    //Then reference that data for the subnet ID
    resource "aws_nat_gateway" "nat" {
    allocation_id = "${aws_eip.nat_gw.id}"
    subnet_id = "${data.aws_subnet.dmz_for_nat.id}"
    tags = "${merge(var.common_tags, map("Name", "${var.vpc_name_prefix}${var.domain_short_name}${var.region_short_name}-NAT" ))}"
    depends_on = ["aws_internet_gateway.igw","aws_subnet.subnets"]
    }
    

相关问题