我正在创建一个 vpc,然后创建子网、路由表和其他 vpc 组件,在许多资源中需要提供 vpc id,在下面的示例的 aws_subnet 资源中,我必须提供 vpc_id = "${aws_vpc.测试_vpc。ID}”
# Create vpc
resource "aws_vpc" "test_vpc" {
cidr_block = "${var.vpc_cidr}"
tags {
Name = "test_vpc"
}
}
# Create public subnets
resource "aws_subnet" "public" {
vpc_id = "${aws_vpc.test_vpc.id}"
...
...
tags {
Name = "subnet_1"
}
}
如果要更改 vpc 资源名称,我必须在所有地方查找并替换 vpc_id,有没有更好的方法?我尝试在变量中使用变量,但没有效果。
# Create vpc
resource "aws_vpc" "${var.vpc_name}" {
cidr_block = "${var.vpc_cidr}"
tags {
Name = "${var.vpc_name}"
}
}
# Create public subnets
resource "aws_subnet" "public" {
vpc_id = "${aws_vpc.${var.vpc_name}.id}"
...
...
tags {
Name = "subnet_1"
}
}
答案1
Terraform 不支持这种“动态插值”;预计在特定模块内图形是定义明确的,因为模块中的所有内容都在同一范围内,因此事物之间的关系不应该不断变化。
您并没有真正提到您在这里试图解决什么现实问题,但看起来您正在尝试推广子网创建,以便您可以将相同的配置用于不同 VPC 中的多个子网。在这种情况下,建议的模式是创建一个单独的模块对于子网部分,然后将 VPC ID 作为模块变量传入。子网模块可能如下所示:
variable "vpc_id" {
}
variable "name" {
}
resource "aws_subnet" "public" {
vpc_id = "${var.vpc_id}"
...
...
tags {
Name = "${var.name}"
}
}
定义此模块后,您可以从另一个模块中多次实例化它:
resource "aws_vpc" "test_vpc" {
cidr_block = "${var.test_vpc_cidr}"
tags {
Name = "test_vpc"
}
}
resource "aws_vpc" "production_vpc" {
cidr_block = "${var.production_vpc_cidr}"
tags {
Name = "production_vpc"
}
}
module "test_subnet" {
source = "./subnet" # specify where the subnet module can be found
name = "test_subnet_1"
vpc_id = "${aws_vpc.test_vpc.id}"
}
module "production_subnet" {
source = "./subnet" # specify where the subnet module can be found
name = "production_subnet_1"
vpc_id = "${aws_vpc.production_vpc.id}"
}
此处子模块仅包含一个子网,因为这是您在示例中给出的。如果您有其他依赖于 VPC 的资源,则可以将它们全部组合到单个模块中,然后您就可以实现仅在一个位置更改 VPC 的目标:您只需在调用模块中更改模块参数的值,模块内变量的所有插值都将自动更新以进行下一次运行。
答案2
插值是现已推出. 以下文档:
resource "aws_instance" "web" {
subnet = "${var.env == "production" ? var.prod_subnet : var.dev_subnet}"
}