正如评论提到你不能像Terraform那样内插变量或者像默认变量那样使用另一个变量,你可以使用数据源实现你陈述的目标ES。
在这个例子情况下,你可以这样做以下:
variable "env" {
default = "production"
}
variable "vpc_name" {
default = "cloudy"
}
data "aws_vpc" "selected" {
tags {
Name = "${var.vpc_name}"
}
}
resource "aws_subnet" "pub1" {
vpc_id = "${data.aws_vpc.selected.id}"
cidr_block = "10.0.1.0/24"
availability_zone = "us-east-1a"
}
这会自动创建在“阴天” VPC子网。
这也使得不仅仅是VPC ID拉动更多的信息反馈,所以你可以做这样的事情,而不是:
variable "env" {
default = "production"
}
variable "vpc_name" {
default = "cloudy"
}
data "aws_vpc" "selected" {
tags {
Name = "${var.vpc_name}"
}
}
resource "aws_subnet" "public" {
vpc_id = "${data.aws_vpc.selected.id}"
cidr_block = "${cidrsubnet(data.aws_vpc.selected.cidr_block, 8, 1)}"
availability_zone = "us-east-1a"
}
的cidrsubnet
function计算从一个给定的范围CIDR子网。在这种情况下,如果您的VPC是10.0.0.0/16
,则返回10.0.1.0/24
。
上面的例子解决了你的主要问题,但它不允许动态命名的Terraform资源。在你的小例子似乎没有成为一个需要它,但如果你想要的东西,然后,动态,你也可以用一些结合这就像一个计数的资源:
variable "env" {
default = "production"
}
variable "vpc_name" {
default = "cloudy"
}
data "aws_vpc" "selected" {
tags {
Name = "${var.vpc_name}"
}
}
data "aws_availability_zones" "all" {}
resource "aws_subnet" "public" {
count = "${length(data.aws_availability_zones.all.names)}"
vpc_id = "${data.aws_vpc.selected.id}"
cidr_block = "${cidrsubnet(data.aws_vpc.selected.cidr_block, 8, count.index)}"
availability_zone = "${data.aws_availability_zones.all.names[count.index]}"
}
这现在动态地创建子网VPC的区域中的每个可用区域。显然你可以把这个很好,我建议你阅读data sources以及所有的AWS specific数据源。
我不认为Terraform支持这种动态插值,因为它需要知道如何处理所有依赖项之前的完整图。你可能会详细说明你想要做什么,因为可能有更好的方法来处理它? – Fermin
TF不支持像Fermin这样的资源名称中的替换 –
这可能就是为什么我找不出一种方法来实现它。 –