Terraform:是否可以仅依赖资源列表中的一种资源?

时间:2019-07-08 15:11:20

标签: terraform

让我们说我正在创建一组AWS实例:

resource "aws_instance" "provision" {
  count = var.aws_azs
  ...
}

然后,在一个单独的null_resource中,将配置步骤与配置步骤分离:

resource "null_resource" "configure" {
  count = var.aws_azs
  depends_on = [aws_instance.provision[count.index]]
  ...
}

该依赖关系是非法的,因为depends_on需要静态引用。但是,如果我改为将其更改为depends_on = ["aws_instance.provision"],则任何实例受到污染时,所有配置资源都将受到污染。有没有办法只依赖一个资源列表中的一个实例?

1 个答案:

答案 0 :(得分:0)

depends_on元参数根本不与污染机制相互作用。它仅用于帮助Terraform选择合适的顺序来执行操作。

给出如下配置:

resource "null_resource" "configure" {
  count      = var.aws_azs

  depends_on = [aws_instance.provision]
}

这只是意味着,如果某个特定计划同时包含针对aws_instance.provision null_resource.configure实例的操作,则所有aws_instance.provision操作将在开始任何操作之前完成null_resource.configure个动作。绝不会导致计划任何其他更改。

如果您的目标是在替换相应的null_resource.configure实例时重新创建aws_instance.provision实例,则可以使用triggers来实现,例如:

resource "null_resource" "configure" {
  count      = length(aws_instance.provision)

  triggers = {
    instance_id = aws_instance.provision[count.index].id
  }
}

在这种情况下,决定者是aws_instance.provision[count.index].id value :只要该ID不变,就不会重新创建null_resource。由于id的{​​{1}}仅在重新创建时才更改,因此aws_instance除非重新创建特定的对应索引,否则不会重新运行。

null_resource.configure表达式中引用aws_instance.provision也会创建隐式依赖关系,因此Terraform还将确保在开始任何{{1 }},而无需另外指定triggers