我的目的是创建一个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 validate
和terraform 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错误消息具有误导性)。
答案 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}\\\"}"]
}
不客气。