如何在Terraform中有条件地更新资源

时间:2019-01-24 05:11:45

标签: amazon-web-services terraform amazon-route53

似乎常见的做法是在资源上使用 count 来使用三元语句在Terraform中有条件地创建它。

我想基于 push_to_prod 变量有条件地更新AWS Route 53条目。这意味着如果我不打算投入生产,我不想删除该资源,我只想更新它,或者将CNAME值保持不变。

以前有人在Terraform中做过这样的事情吗?

2 个答案:

答案 0 :(得分:1)

目前,生命周期标签不支持插值语法。您可以阅读更多here。因为您可以使用“ Prevent Destroy”(防止破坏),所以这将使此操作更加困难。但是,在没有更多细节的情况下,我将尽最大努力猜测如何到达目的地。

我将使用Route53记录上的allow_overwrite属性,并根据您的标志进行设置。这样,如果您要推送产品,则可以将其设置为false。这应该触发创建一个新的。我还没有测试过。

还请注意,如果您不对Route53资源进行任何更改,它将触发Terraform中的所有更改被应用。因此,更新记录的任何部分都会触发部署。

您可能希望将其与一些生命周期事件结合起来,但是我没有足够的时间来研究该特定资源及其发生方式。

答案 1 :(得分:1)

我能想到的两个例子是:

type = "${var.push_to_prod == "true" ? "CNAME" : var.other_value}"-这将有一个固定的other_value,一旦由terraform管理资源,就无法让terraform“忽略”资源。

type = "${var.aws_route53_record_type}",您可以拥有dev.tfvarsprod.tfvars,其中aws_route53_record_type定义为您想要的devCNAME产品。

问题在于您要尝试做的事情,“我只想更新它,或者保持CNAME值不变。”,这不是terraform的工作原理。 Terraform要么为您管理资源,要么不为您管理资源。如果正在管理它,它将根据您在.tf文件中定义的配置来更新资源。如果它不管理资源,则不会修改它。听起来,您真正想要的是第二种解决方案,其中将两个不同的配置从.tfvars文件传递到.tf文件,然后根据不同的配置创建不同的资源。您可以将其与count结合使用,以确定是否应该创建资源。