首页 > 解决方案 > 基于另一个变量的引用变量

问题描述

file1.tf(由kops生成)我有这样的资源:

resource "aws_vpc" "my-vpc-tf-id" {
...
}

资源 ID 由 kops 动态生成并添加到terraform.tfvars(因此可以在.tf文件中的其他位置使用):

my_var = "my-vpc-tf-id"

现在我想在file2.tf不对其名称进行硬编码的情况下引用 VPC 资源:

resource "aws_security_group" "db" {
  ...
  vpc_id      = "${aws_vpc.${var.my_var}.id}"
  ...
}

但 Terraform 抱怨这${var.my_var}是不允许的。因此,我将其定义为file2.tf

resource "aws_security_group" "db" {
  ...
  vpc_id      = "${aws_vpc.{{MY_VAR_VAL}}.id}"
  ...
}

我用sed值替换占位符。这很好用,但会使某些其他任务复杂化,所以我想知道是否有其他方法可以在不使用sed或硬编码my_var值的情况下实现这一点(只是 Terraform 的 HCL)。

标签: terraformkops

解决方案


执行此操作的常规方法是使用数据源查找您要引用的内容。

VPC 数据源允许您根据许多不同的事物进行过滤,但典型的一种是使用Name标签:

data "aws_vpc" "selected" {
  tags {
    Name = "${var.vpc}"
  }
}

然后你可以参考这个 VPC:

resource "aws_security_group" "db" {
  ...
  vpc_id = "${data.aws_vpc.selected.id}"
  ...
}

推荐阅读