I'm looking for a solution for this template to get the correct JSON file.
As you may see in the sections, aws:RequestTag/***
lacks commas at the end. If I use the comma in the template, then I will have an unnecessary comma at the end of the last string.
I wonder the ${jsonencode()}
should help, but I'm still not realizing how it's using with %{ for key in key_tag ~}
together.
I would be appreciated for any help.
Terraform:
resource "local_file" "enforcetags" {
content = templatefile("${path.module}/enforcetags.tpl",
{
key_tag = ["development_prod", "production_prod", "rnd_prod"]
}
)
filename = "./enforce_tags.json"
}
Template:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "ec2:*",
"Resource": "*",
"Condition": {
"ForAllValues:StringEquals": {
"aws:TagKeys": ${jsonencode([for key in key_tag : "${key}"])}
},
"StringEqualsIfExists": {
%{ for key in key_tag ~}
"aws:RequestTag/${key}": ${jsonencode([for key in key_tag : "${key}"])}
%{ endfor ~}
}
}
}
]
}
Output:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "ec2:*",
"Resource": "*",
"Condition": {
"ForAllValues:StringEquals": {
"aws:TagKeys": ["development_prod","production_prod","rnd_prod"]
},
"StringEqualsIfExists": {
"aws:RequestTag/development_prod": ["development_prod","production_prod","rnd_prod"]
"aws:RequestTag/production_prod": ["development_prod","production_prod","rnd_prod"]
"aws:RequestTag/rnd_prod": ["development_prod","production_prod","rnd_prod"]
}
}
}
]
}
CodePudding user response:
To have a comma at the end, except the last string it should be:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "ec2:*",
"Resource": "*",
"Condition": {
"ForAllValues:StringEquals": {
"aws:TagKeys": ${jsonencode([for key in key_tag : "${key}"])}
},
"StringEqualsIfExists": ${jsonencode(
{for key in key_tag: "aws:RequestTag/${key}" => key_tag})}
}
}
]
}