There are easier ways to do this but in one case I had only a string with a comma delimited list of values to use as an input to terraform. I was pretty sure jsonencode and/or jsondecode could handle it but it did not. This is what I ended up doing.
bash script variable used for some other function but also needed in my code. I was after the allowed_cidrs list and has to be formatted like this:
sites1=192.168.1.10/32,sites2=192.168.1.11/32,sites3=192.168.1.13/32,sites4=192.168.1.14/32
in bash I packed the variable like this:
variables="{\"region\":\"${region}\",\"tenancy_id\":\"${tenancy_id}\",\"ip_1\": \"${ip_1}\",\"ip_2\": \"${ip_2}\",\"allowed_cidrs\": \"sites1=192.168.1.10/32,sites2=192.168.1.11/32,sites3=${ip_3},sites4=${ip_4}\"}"
terraform variables
variable "allowed_cidrs" {}
locals {
pairs = split(",", var.allowed_cidrs)
allowed_cidrs = {
for pair in local.pairs :
split("=", pair)[0] => split("=", pair)[1]
}
transformed_list = [
for key, value in local.allowed_cidrs : {
description = key
cidr_block = value
}
]
}
output "allowed_cidrs" {
#value = local.allowed_cidrs
#value = [for key, value in local.allowed_cidrs : "${key}: ${value}"]
value = local.transformed_list
}
terraform dynamic block
dynamic "ingress_security_rules" {
for_each = local.transformed_list
content {
description = format("%s to mysql via NLB", ingress_security_rules.value.description)
source = ingress_security_rules.value.cidr_block
protocol = local.tcp_protocol_number
tcp_options {
max = local.mysql_port_number_3306
min = local.mysql_port_number_3306
}
}
}