创建AWS Route53 TXT记录的terraform语法是什么,该记录的映射为JSON作为有效负载?

时间:2017-05-17 07:58:34

标签: dns amazon-route53 terraform

我的目的是创建一个AWS Route53 TXT记录,其中包含一个地形图的JSON表示作为有效载荷。

我希望以下方法可以解决这个问题:

variable "payload" {
  type = "map"
  default = {
    foo = "bar"
    baz = "qux"
  }
}

resource "aws_route53_record" "TXT-json" {
  zone_id = "${module.domain.I-zone_id}"
  name = "test.${module.domain.I-fqdn}"
  type = "TXT"
  ttl = "${var.ttl}"
  records = "${list(jsonencode(var.payload))}"
}

terraform validateterraform plan就可以了。 terraform apply开心,但AWS报告错误:

* aws_route53_record.TXT-json: [ERR]: Error building changeset: InvalidChangeBatch: Invalid Resource Record: FATAL problem: InvalidCharacterString (Value should be enclosed in quotation marks) encountered with '"{"baz":"qux","foo":"bar"}"'
    status code: 400, request id: 062d4536-3ad3-11e7-af24-0fbcd067fb9e

Terraform版本

Terraform v0.9.4

HCL中的字符串处理非常困难。我在网上发现了很多关于这个问题的参考文献,但我似乎无法找到实际的解决方案。基于terraform#10048中提到的变通方法的解决方案不起作用。 "${list(substr(jsonencode(var.payload), 1, -1))}"删除起始大括号{,而不是第一个引号。这似乎是后来添加的。

添加引号(如AWS建议的错误消息)没有帮助;它只是添加了更多的引号,并且已经存在(AWS错误消息具有误导性)。

2 个答案:

答案 0 :(得分:0)

Terraform不会生成您收到的消息。这是Route53引发的验证错误。如果添加了例如,你会得到同样的错误。 {"a":2,"foo":"bar"}通过AWS控制台作为值。

另一方面,逃避JSON工作即。我能够通过AWS控制台将"{\"a\":2,\"foo\":\"bar\"}"添加为TXT值。

如果您对此感到满意,则可以执行双jsonencode,这意味着您可以jsonencode jsonencode生成的JSON字符串,例如:

variable "payload" {
  type = "map"
  default = {
    foo = "bar"
    baz = "qux"
  }
}

output "test" {
  value = "${jsonencode(jsonencode(var.payload))}"
}

解析为:

➜  ~ terraform apply

Apply complete! Resources: 0 added, 0 changed, 0 destroyed.

Outputs:

test = "{\"baz\":\"qux\",\"foo\":\"bar\"}"

(您当然必须使用aws_route53_record资源而不是output

答案 1 :(得分:0)

因此基本上可以正常工作:

resource "aws_route53_record" "record_txt" {

      zone_id = "${data.aws_route53_zone.primary.zone_id}"
      name = "${var.my_domain}"
      type = "TXT"
      ttl = "300"
      records = ["{\\\"my_value\\\", \\\"${var.my_value}\\\"}"]

}

不客气。