I’m using Auth0 to configure my ECS tasks in AWS.
I have files containing things like:
container_definitions = <<DEFINITION
[
{
"name": "${var.workspace}-${var.taskName}",
"command": [
"${var.command}"
],
...
I’d love to extract my JSON into an actual .json file so that I can benefit from validation and formatting in my IDE, but if I do that, I lose the ability to inject values through variable interpolation.
Is there a way to achieve the former without losing the latter?
Hi @dancrumb,
As long as you are only using ${ ... }
sequences inside quoted strings as you showed in your example, a template like that factored out into a separate file should still be valid JSON that your editor could understand.
Given that, you could replace your container_definitions
expression with a call to the templatefile
function:
container_definitions = templatefile("${path.module}/container_definitions.json", {
workspace = var.workspace
taskName = var.taskName
command = var.command
})
Inside the container_definitions.json
file you’d refer to these arguments using e.g. ${ workspace }
instead of ${ var.workspace }
because an external template is evaluated in a different scope built from that second argument to templatefile
.
Another option would be to write the container definitions directly in the Terraform language syntax and have Terraform convert the result to JSON using jsonencode
. This would then let you use the Terraform language validation and highlighting in your editor, as opposed to the JSON highlighting:
container_definitions = jsonencode([
{
"name": "${var.workspace}-${var.taskName}",
"command": [
var.command,
],
}
])
A key advantage of this approach is that you can freely use values of any type inside the literal object, without worrying about separately encoding/escaping each value. The var.command
reference in the above doesn’t need to be interpolated into a string because jsonencode
can already see that it’s a string, so it’ll automatically produce a valid JSON quoted string containing whatever is in var.command
, handling automatically any necessary escaping of quotes and backslashes.
1 Like