有啥方法可以参考 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 以外的目录中运行脚本?