基于另一个变量的参考变量

时间:2018-07-30 17:52:41

标签: terraform kops

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)。

2 个答案:

答案 0 :(得分:0)

执行此操作的正常方法是使用data sources查找您要引用的内容。

VPC data source允许您基于许多不同的事物进行过滤,但是典型的是使用Name标签:

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

然后您可以通过以下方式引用此VPC:

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

答案 1 :(得分:-1)

这两种情况是

(i)如果它们都是vpc和安全组处于同一运行中 我们可以在没有任何数据源的情况下直接引用安全组中的vpc ID

resource "aws_security_group" "db" {
  ...
  vpc_id = "${aws_vpc.my-vpc-tf-id.id}"
  ...
}

(ii)如果它们以不同的方式运行(使用相同的远程状态文件或导入配置) 使用ydaetskcoR上面提到的数据源