【问题标题】:Reference variable based on another variable基于另一个变量的引用变量
【发布时间】:2019-01-07 00:59:46
【问题描述】:

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)的情况下实现这一目标。

【问题讨论】:

  • 生成具有可变资源名称的文件不是使用 terraform 的预期方式。 terraform 中的名称应该是合乎逻辑且固定的。不幸的是,由于您使用了 kops,您必须遵守这一点。在这种情况下,sed 解决方法似乎是最好的。也许用 kops 打开一个问题并在那里描述你的问题?
  • Markus 的评论是正确的,根据github.com/hashicorp/terraform/issues/18456。不幸的是,那里描述的解决方法似乎并不适用。

标签: terraform kops


【解决方案1】:

执行此操作的正常方法是使用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}"
  ...
}

【讨论】:

  • 如果VPC要在同一次运行中创建,这可能会导致问题,因为数据源不依赖于VPC,因此信息为being fetched upon state refresh。此时,VPC 尚不可用。
【解决方案2】:

这两种情况是

(i) 如果它们都是 vpc 和安全组,则在同一运行中 我们可以直接引用安全组中的vpc id,无需任何数据源

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

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

【讨论】:

  • 正如 Oliver 所说,资源不是命名为my-vpc-tf-id,而是一些变量名(例如vpc-47384-33234)。该名称存储在一个名为 my_var 的变量中。
  • 我在这里想说的是,如果它是单次运行,我们不需要将它存储在任何变量中。
猜你喜欢
  • 1970-01-01
  • 2023-01-20
  • 2019-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-14
  • 2022-11-23
  • 1970-01-01
相关资源
最近更新 更多