在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)。
答案 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上面提到的数据源