我正试图建立一个管道,用terraform在我的cloudfront分布中自动创建一个新的别名,但我所能做的就是替换已经存在的别名。我想给已经存在的内容添加一个新值。我试过这样的东西:
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"
有什么解决办法吗?
虽然技术上有使用远程状态数据源来实现这一点的方法(即从现有状态文件中读取CloudFront分发别名,然后向其附加一个新值,然后使用该扩展列表作为CloudFront资源的输入值(,但几乎可以肯定这是一个非常糟糕的主意™.这将创建一个令人讨厌的循环,并且没有简单的方法来重置别名列表。
Terraform是";作为配置的基础设施";并且旨在具有Terraform文件中指定的所有配置;配置不应该依赖于相同Terraform源的先前输出。
我的观点是,别名的完整列表应该在的某个地方定义;如果你按照我上面描述的方式来做,列表不会在任何地方定义,而是在现有的状态文件中,这是它不打算在的地方。它可以在Terraform配置中的文件中定义(可以是TF语言,也可以是Terraform加载的外部文件(,也可以在远程位置(比如S3文件、SSM参数等(,但它需要在一个可以轻松修改的地方,并且每次运行Terraform时都不会更改。