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

Is there any way to reference to old plan in terraform?

我正在尝试设置一个管道,使用 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"

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

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

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

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

时更改的地方