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

Terraform 基于另一个变量的参考变量,terraform,kops,Terraform,Kops,在由生成的file1.tf中,我有这样一个资源: resource "aws_vpc" "my-vpc-tf-id" { ... } 资源ID由kops动态生成,并添加到terraform.tfvars中,以便在.tf文件中的其他位置使用: 现在,我想引用file2.tf中的VPC资源,但不硬编码其名称: resource "aws_security_group" "db" { ... vpc_id = "${aws_vpc.${var.my_var}.id}" ...

在由生成的file1.tf中,我有这样一个资源:

resource "aws_vpc" "my-vpc-tf-id" {
...
}
资源ID由kops动态生成,并添加到terraform.tfvars中,以便在.tf文件中的其他位置使用:

现在,我想引用file2.tf中的VPC资源,但不硬编码其名称:

resource "aws_security_group" "db" {
  ...
  vpc_id      = "${aws_vpc.${var.my_var}.id}"
  ...
}
但是Terraform抱怨说${var.my_var}是不允许的。因此,我在file2.tf中定义了这一点:


我使用sed将占位符替换为值。这很有效,但会使某些其他任务复杂化,因此我想知道是否有其他方法可以实现这一点,而无需使用sed或硬编码my_var值,即Terraform的HCL

通常的方法是使用查找您要引用的内容

允许您根据许多不同的内容进行筛选,但典型的是使用名称标签:

然后,您可以使用以下内容引用此专有网络:

resource "aws_security_group" "db" {
  ...
  vpc_id = "${data.aws_vpc.selected.id}"
  ...
}
这两个案例是

i如果vpc和安全组同时运行 我们可以直接在安全组中引用vpc id,无需任何数据源

resource "aws_security_group" "db" {
  ...
  vpc_id = "${aws_vpc.my-vpc-tf-id.id}"
  ...
}
ii如果它们使用相同的远程状态文件或导入配置以不同方式运行
使用ydaetskcoR上述数据源

如果要在同一次运行期间创建VPC,这可能会导致问题,因为数据源不依赖于VPC,因此信息不可靠。此时,VPC还不可用。使用terraform的目的不是生成具有可变资源名称的文件。terraform中的名称应该是逻辑的和固定的。不幸的是,由于使用kops,您必须遵守这一点。在这种情况下,sed解决方案似乎是最好的。也许可以向kops提出一个问题,并在那里描述您的问题?根据,Markus的评论是正确的。不幸的是,这里描述的解决方法似乎不适用。正如Oliver所说,资源没有命名为my vpc tf id,而是一些变量名,例如vpc-47384-33234。该名称存储在一个名为my_var的变量中。我想说的是,如果它是单次运行的,我们不需要将其存储在任何变量中。
data "aws_vpc" "selected" {
  tags {
    Name = "${var.vpc}"
  }
}
resource "aws_security_group" "db" {
  ...
  vpc_id = "${data.aws_vpc.selected.id}"
  ...
}
resource "aws_security_group" "db" {
  ...
  vpc_id = "${aws_vpc.my-vpc-tf-id.id}"
  ...
}