根据另一个资源

时间:2017-07-31 00:08:01

标签: amazon-web-services terraform

我有一个相当简单的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,所以terraform不知道length(aws_route53_zone.public-zone.name_servers)是什么,因此插入{ {1}}失败了,我搞砸了。

然而,对我来说,Terraform会如此不灵活似乎令人惊讶;肯定能够创建像这样的可变数量的资源将是肉和土豆的东西。硬编码长度或创建单独的资源,似乎只是......限制。

那么,我错过了什么?当我事先不知道我需要多少资源时,如何创建大量资源?

2 个答案:

答案 0 :(得分:1)

我明白了你的意思,这也令我感到惊讶。即使我将i was unexpected at this time. 添加到资源depends_on,也很无奈。

通过此问题可以做的是将其拆分为两个堆栈,并确保在cloudflare记录之前创建路径53记录。

堆栈#1

cloudflare_record

堆栈#2

resource "aws_route53_zone" "public-zone" {
  name = "${terraform.env}.example.com"
}

output "name_servers" {
  value = "${aws_route53_zone.public-zone.name_servers}"
}

答案 1 :(得分:1)

目前无法计算的数量是terraform https://github.com/hashicorp/terraform/issues/12570

中的未解决问题

您可以将名称服务器移动到变量数组,然后在一个terraform脚本中获取其长度。