variables内部的terraformvariables

我正在创build一个vpc,然后是子网,路由表和其他vpc组件,在许多资源中需要提供vpc id,在下面例子的aws_subnet资源中,我必须提供vpc_id =“$ {aws_vpc.test_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资源名称的情况下,我必须在所有地方find并replacevpc_id,有没有更好的方法呢? 我尝试使用variables内部variables,但它不工作。

 # 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" } } 

Terraform不支持​​这种“dynamic插值”。 预期在一个特定的模块中,图是精确定义的,因为模块中的所有东西都在相同的范围内,因此事物之间的关系不应该不断变化。

你没有真正提到你在这里试图解决的真实世界的问题,但是看起来你试图推广子网的创build,所以你可以在不同的VPC中为多个子网使用相同的configuration。 在这种情况下,build议的模式是为子网部分创build一个单独的模块 ,然后将VPC ID作为模块variables传递。 以下是子网模块的外观:

 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的目标:只需更改VPC中模块参数的值即可调用模块,模块内的所有variables插值将自动更新,以便下次运行。