我有一个相当简单的Terraform配置,它创建一个Route53区域,然后在Cloudflare中创建NS记录,以将子域委托给该区域 . 目前,它假设每个Route53区域总共有四个权威DNS服务器,并创建四个单独的 cloudflare_record
资源,但我想概括一下,部分原因是谁知道AWS是否会开始在第五个权威服务器中放置未来,但对于未来更复杂的东西也是如此(如AWS AZs,我知道区域之间的数量不同) .
到目前为止我想出的是:
resource "cloudflare_record" "public-zone-ns" {
domain = "example.com"
name = "${terraform.env}"
type = "NS"
ttl = "120"
count = "${length(aws_route53_zone.public-zone.name_servers)}"
value = "${lookup(aws_route53_zone.public-zone.name_servers, count.index)}"
}
resource "aws_route53_zone" "public-zone" {
name = "${terraform.env}.example.com"
}
但是,当我在此运行 terraform plan
时,我收到此错误:
Error running plan: 1 error(s) occurred:
* cloudflare_record.public-zone-ns: cloudflare_record.public-zone-ns: value of 'count' cannot be computed
我认为这意味着因为 aws_route53_zone
不知道 length(aws_route53_zone.public-zone.name_servers)
是什么,因此 cloudflare_record.public-zone-ns.count
的插值失败而且我搞砸了 .
然而,对我来说,Terraform如此不灵活似乎令人惊讶;肯定能够创建像这样的可变数量的资源将是肉和土 beans 的东西 . 硬编码长度,或创建单独的资源,似乎是......限制 .
那么,我错过了什么?如果我事先不知道我需要多少资源,怎么能创建一些资源呢?
2 回答
目前无法计算的数量是terraform中的一个未解决的问题https://github.com/hashicorp/terraform/issues/12570
您可以将名称服务器移动到变量数组,然后在一个terraform脚本中获取其长度 .
我明白了你的意思,这也令我感到惊讶 . 即使我将
depends_on
添加到资源cloudflare_record
,也很无奈 .你可以做的就是将它分成两个堆栈并确保在cloudflare记录之前创建路由53记录 .
堆栈#1
堆栈#2