According to DNS-SD, detailed information about a service must be provided
in 1 TXT record, as key=value
pairs. Different key=value
pairs must be
in separate DNS strings within the same TXT record.
Terraform expects a list of records. Each record is a Terraform string, and becomes a TXT record. All the DNS strings for 1 DNS Record must be crammed into 1 Terraform string.
Starting from a Terraform map var.details
, this can be done like this:
resource "aws_route53_record" "txt_record" {
zone_id = "…"
name = "…"
type = "TXT"
ttl = "…"
records = ["${join("\"\"", formatlist("%s=%s", keys(var.details), values(var.details)))}"]
}
formatlist
combines the list of keys
of the map with the list of values
of the map into
key=value
pairs using the pattern $s=%s
. The result is a list of strings, each of which
is a key=value
pair.
Submitting this like this to records
results in a separate TXT record per key=value
pair,
which is not what we want.
To transform this list of strings into 1 Terraform string, we need to join
the list.
To make AWS Route53 understand that the parts are separate DNS strings,
each part needs to be enclosed in quotes "…"
.
In several steps, by Terraform and AWS, quotes "
are added in front and at the back of this
joined string. What is missing are the quotes between the key=value
pairs. We can add these
by using them as a weird join pattern. However, for Terraform to leave them alone when it passes
them to AWS, we need to quote them. The separator pattern thus becomes \"\"
.
In the Route53 Web UI, we can add several strings on several lines. Each separate line becomes
a separate TXT record. It is thus important to have all our key=value
pairs on the same line
in the TEXTAREA.
To have the AWS Route53 Web UI create separate DNS strings for each key=value
pair, we need to
enclose each key=value
pair in double quotes: "key=value"
, concatenate them (without spaces
or other separators) and keep all of them on one line:
"apiVersion=v6""at=2017-09-12T16:54:00Z""implVersion=v6""path=/latest""submitted=2017-09-12T23:00:02Z""txtvers=1"
None of the above works in the Dyn.com Web UI. It seems like it is impossible to create a multi-string TXT record in Dyn.com.
A support question was posted.