【问题标题】: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"

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

【问题讨论】:

    标签: terraform gitlab-ci amazon-cloudfront terraform-provider-aws


    【解决方案1】:

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

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

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

    【讨论】:

    • 这就是我担心的,谢谢乔丹的详细回答。
    猜你喜欢
    • 1970-01-01
    • 2015-12-18
    • 2019-12-23
    • 1970-01-01
    • 2013-06-05
    • 1970-01-01
    • 2022-01-24
    • 2023-01-13
    • 2021-02-09
    相关资源
    最近更新 更多