Terraform - 连接/连接变量(动态插值)

标签 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"  
}

最佳答案

正如评论中提到的,您不能像在 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数据源。

关于Terraform - 连接/连接变量(动态插值),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45278862/

相关文章:

amazon-web-services - Terraform 无法承担启用 MFA 的角色

terraform - 运行 terraform apply 时出现键错误

gitlab - 使用 gitlab 管理多个 terraform 状态文件

Terraform Cloud 无法识别 Github Actions 中的 TF_VAR 环境变量

terraform - 使用模块时不显示输出

azure - 使用 Terraform 在 Azure 中部署和配置 Postgres 服务器

amazon-web-services - terraform 计划 'string required' dynamodb_table_item

.net-core - 使用 dotnet core 2.0 和 Terraform 管理 AWS Lambda 函数

mysql - 使用 Terraform 为 RDS 创建 Route53 条目

amazon-web-services - 访问子模块的输出变量时Terraform "Unsupported attribute"错误