Terraform - Concatonate / Join变量(动态插值)

时间:2017-07-24 10:59:50

标签: terraform

是否可以在terraform中连接/连接变量?我很难找到正确语法的参考。

我想做这样的事情:

variable "env" {
  default = "production"
}

variable "vpc_name" {
  default = "cloudy"
}

resource "aws_subnet" "${var.env}_${var.vpc_name}_pub1" {  
  vpc_id = "${aws_vpc.${var.vpc_name}.id}"  
  cidr_block = "10.0.1.0/24"  
  availability_zone = "us-east-1a"  
}

哪会有效实现这样的目标:

resource "aws_subnet" "production_cloudy_pub1" {  
  vpc_id = "${aws_vpc.cloudy.id}"  
  cidr_block = "10.0.1.0/24"  
  availability_zone = "us-east-1a"  
}

1 个答案:

答案 0 :(得分:2)

正如评论所提到的,你不能在Terraform中插入类似的变量,或者将默认变量等变量用于另一个变量,你可以使用数据源实现你所声明的目标。

在示例中,您可以执行以下操作:

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数据来源。