似乎常见的做法是在资源上使用 count 来使用三元语句在Terraform中有条件地创建它。
我想基于 push_to_prod 变量有条件地更新AWS Route 53条目。这意味着如果我不打算投入生产,我不想删除该资源,我只想更新它,或者将CNAME值保持不变。
以前有人在Terraform中做过这样的事情吗?
答案 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.tfvars
和prod.tfvars
,其中aws_route53_record_type
定义为您想要的dev
和CNAME
产品。
问题在于您要尝试做的事情,“我只想更新它,或者保持CNAME值不变。”,这不是terraform的工作原理。 Terraform要么为您管理资源,要么不为您管理资源。如果正在管理它,它将根据您在.tf
文件中定义的配置来更新资源。如果它不管理资源,则不会修改它。听起来,您真正想要的是第二种解决方案,其中将两个不同的配置从.tfvars
文件传递到.tf
文件,然后根据不同的配置创建不同的资源。您可以将其与count
结合使用,以确定是否应该创建资源。