有啥方法可以参考 terraform 中的旧计划吗?

Posted

技术标签:

【中文标题】有啥方法可以参考 terraform 中的旧计划吗?【英文标题】:Is there any way to reference to old plan in terraform?有什么方法可以参考 terraform 中的旧计划吗? 【发布时间】:2021-09-29 03:31:31 【问题描述】:

我正在尝试设置一个管道,以使用 terraform 在我的云端分发中自动创建一个新别名,但我所能做的就是替换已经存在的内容。我想为已经存在的内容附加一个新值。我尝试过这样的事情:

resource "aws_cloudfront_distribution" "web_distribution" 
    origin 
        domain_name = "$aws_s3_bucket.web.bucket_domain_name"
        origin_id   = "S3-$aws_s3_bucket.web.id"
    
    enabled = true
    is_ipv6_enabled = true
    aliases = "$compact(concat(list("$var.url_prefix.$var.zone"), list("$aws_cloudfront_distribution.web_distribution.aliases")))"

“$var.url_prefix.$var.zone”本质上是一个基于我的 gitlab 分支名称动态生成的 URL。 但我收到以下错误:

Error: aws_cloudfront_distribution.web_distribution: aws_cloudfront_distribution.web_distribution: self reference not allowed: "aws_cloudfront_distribution.web_distribution.aliases"

是否有任何解决方法可以做到这一点?

【问题讨论】:

【参考方案1】:

虽然技术上有一种方法可以使用Remote State 数据源来完成此操作(即从现有状态文件中读取 CloudFront 分配别名,然后为其附加一个新值,然后使用它作为 CloudFront 资源的输入值的扩展列表),这几乎可以肯定是一个非常糟糕的主意™。它会创建一个令人讨厌的循环,并且没有简单的方法来重置别名列表。

Terraform 是“基础设施即配置”,旨在拥有 Terraform 文件中指定的所有配置;配置不应依赖于相同 Terraform 源的先前输出。

我的意思是,完整的别名列表应该定义在某处;如果您按照我上面描述的方式进行操作,则列表不会在任何地方定义,而是在现有状态文件中,而这不是它的意图所在。它可以在 Terraform 配置中的文件中定义(TF 语言或 Terraform 加载的外部文件),也可以在远程位置(如 S3 文件、SSM 参数等),但它需要放置在可以轻松修改且不会在每次运行 Terraform 时更改的地方。

【讨论】:

这就是我担心的,谢谢乔丹的详细回答。

以上是关于有啥方法可以参考 terraform 中的旧计划吗?的主要内容,如果未能解决你的问题,请参考以下文章

有啥方法可以让 Terraform CLI 在 PWD 以外的目录中运行脚本?

jmeter有啥方法可以在参数内传递参数吗? [复制]

计划中的 lambda 有啥意义?

使用 terraform 和 arm 模板通过工作流部署逻辑应用程序的最佳方法?

Terraform 上的“无效的旧提供程序地址”错误

我们可以更改子模块“.terraform/modules”中的某些内容吗?