is there a way to concat tuple in terraform? - terraform

variable "query_param" {
type = list(string)
default = [
"hello",
"one",
"two"
]
}
locals {
common_tags = flatten([
for i in var.query_param: {
"method.request.querystring.${i}" = false
}
])
}
output name {
value = local.common_tags
description = "description"
}
I have this code to iterate the variable(list) to locals (map). I got the below output which is not desired.
name = [
{
"method.request.querystring.hello" = false
},
{
"method.request.querystring.one" = false
},
{
"method.request.querystring.two" = false
},
]
The desired output is getting all the values in a single array. As shown below.
name = [
{
"method.request.querystring.hello" = false,
"method.request.querystring.one" = false,
"method.request.querystring.two" = false
}
]
Is there any way to achieve this?

I think you would want something like this:
locals {
common_tags = {
for i in var.query_param :
"method.request.querystring.${i}" => false
}
}
The output of the code above will be as follows:
name = {
"method.request.querystring.hello" = false
"method.request.querystring.one" = false
"method.request.querystring.two" = false
}
Please note, the name itself is not an array in this case. If you want it to be, you can do the following:
locals {
common_tags = [{
for i in var.query_param :
"method.request.querystring.${i}" => false
}]
}
The output will be:
name = [
{
"method.request.querystring.hello" = false
"method.request.querystring.one" = false
"method.request.querystring.two" = false
}
]

Related

Terraform: Nested for expression with no duplicity

I am newbie to Terraform, apologies in advance in case inappropriate logic is used.
There is nested map, want to create new map using existing one.
terraform.tfvars
vpcs_info= {
"devops" = {
main = {
cidr = "10.14.0.0/16"
region = "ap-south-1"
peering = {
creator = {
devops = "poc",
uat = "main"
}
}
},
poc = {
cidr = "10.9.0.0/16"
region = "ap-south-1"
peering = {
creator = {
dev = "main"
}
}
}
}
}
locas.tf
locals {
vpcs_info = {
for vpc, properties in var.vpcs_info.devops:
vpc => {for dst_env, dst_vpc in properties.peering.creator : vpc => {"name": "${dst_env}-${dst_vpc}-vpc", "id": "${timestamp()}" }...}
}
}
Actual output:
{
"main" = {
"main" = [
{
"id" = "2023-02-05T21:23:24Z"
"name" = "devops-poc-vpc"
},
{
"id" = "2023-02-05T21:23:24Z"
"name" = "uat-main-vpc"
},
]
}
"poc" = {
"poc" = [
{
"id" = "2023-02-05T21:23:24Z"
"name" = "dev-main-vpc"
},
]
}
}
If we observe, in the output there is duplicity in KEYS. Need to get below desired output using for expression:
Desired output:
{
"main" = {
{
"id" = "2023-02-05T21:23:24Z"
"name" = "devops-poc-vpc"
},
{
"id" = "2023-02-05T21:23:24Z"
"name" = "uat-main-vpc"
}
}
"poc" = {
{
"id" = "2023-02-05T21:23:24Z"
"name" = "dev-main-vpc"
}
}
}
Note: "id" is sensitive information in actual requirement, to avoid security challenges, "${timestamp()}" is being used here.
You can do that with merge:
vpcs_info = merge([
for vpc, properties in var.vpcs_info.devops: {
for dst_env, dst_vpc in properties.peering.creator:
vpc => {
"name" = "${dst_env}-${dst_vpc}-vpc"
"id" = "${timestamp()}"
}...
}
]...)

Extract Maps from List in Terraform

I have a list of complex maps, like so (I've simplified the maps, but really they're made up more maps):
[
{
"hooha" = {
"foo" = { "something" = "this" }
}
},
{
"woot" = {
"bar" = { "other_things" = "that" }
}
},
]
I need to feed this into jsonencode(), but first have it look like this:
{
"hooha" = {
"foo" = { "something" = "this" }
},
"woot" = {
"bar" = { "other_things" = "that" }
}
}
So from a list of maps, to a map of the maps.
This seemed trivial, but for the life of me, I can't figure it out!
You can use the function merge with a combination of with ... operator.
locals {
my_list = [
{
"hooha" = {
"foo" = { "something" = "this" }
},
"www" = {
"aa" = {"x" = "y"}
}
},
{
"woot" = {
"bar" = { "other_things" = "that" }
}
},
]
}
output "prepare" {
value = merge(local.my_list...)
}
The output will be something like this:
prepare = {
"hooha" = {
"foo" = {
"something" = "this"
}
}
"woot" = {
"bar" = {
"other_things" = "that"
}
}
"www" = {
"aa" = {
"x" = "y"
}
}
}

How to Recreate Terraform map with duplicate keys?

I'm getting terraform Local variable output as below. I want to reconstruct it to use in deferent argument. I have tried it many way , Still no luck, Appreciate community support on this.
snap_id_list = [
{
"3" = {
"/x01" = "snap-01397a07b574e781f"
}
},
{
"2" = {
"/x04" = "snap-035d6c4165d34041a"
}
},
{
"1" = {
"/x04" = "snap-07bc61be86cb0b3a2"
}
},
{
"3" = {
"/x04" = "snap-0aa3a4d1cbd87531b"
}
},
{
"1" = {
"/x01" = "snap-0e501f7d2798eeb70"
}
},
{
"2" = {
"/x01" = "snap-0fe2fe503e433fdbd"
}
},
]
I want to recreate it as below using common keys.
snap_id_list = [
{
"3" = {
"/x01" = "snap-01397a07b574e781f"
"/x04" = "snap-0aa3a4d1cbd87531b"
},
{
"2" = {
"/x04" = "snap-035d6c4165d34041a"
"/x01" = "snap-0fe2fe503e433fdbd"
},
{
"1" = {
"/x04" = "snap-07bc61be86cb0b3a2"
"/x01" = "snap-0e501f7d2798eeb70"
}
},
]

Terraform - Create a map of objects

This is doing my head in a little bit. So I want to create a map of objects like so:
{
"nic_1" = {
"interface_id" = "blah"
"ip_configuration_name" = "blah"
},
"nic_2" = {
"interface_id" = "blah"
"ip_configuration_name" = "blah"
},
}
The source for this data comes from the below list:
ni-resource = [
{
"id" = "blah"
"ip_configuration" = [
{
"name" = "blah"
},
]
"name" = "nic_1"
},
{
"id" = "blah"
"ip_configuration" = [
{
"name" = "blah"
},
]
"name" = "nic_2"
},
]
So in other words the ni-resource->id needs to map to interface_id and ni-resource->ip_configuration->name needs to map to ip_configuration_name.
I am trying to create a local as below which is not working:
locals {
ni_list = { for ni in ni-resource :
ni["name"] => {
interface_id = ni["id"]
ip_configuration = ni["ip_configuration"][0]["name"]
}
}
}
The error I am getting is as follows:
Error: Invalid object key
The key expression produced an invalid result: string required.
Here is the full ni-resource output:
ni-resource = [
{
"applied_dns_servers" = []
"dns_servers" = []
"enable_accelerated_networking" = false
"enable_ip_forwarding" = false
"id" = "blah"
"internal_dns_name_label" = ""
"internal_domain_name_suffix" = "blah"
"ip_configuration" = [
{
"name" = "blah"
"primary" = true
"private_ip_address" = "dummy"
"private_ip_address_allocation" = "Dynamic"
"private_ip_address_version" = "IPv4"
"public_ip_address_id" = ""
"subnet_id" = "dummy"
},
]
"location" = "dummy"
"mac_address" = ""
"name" = "nic_1l"
"private_ip_address" = "dummy"
"private_ip_addresses" = [
"dummy",
]
"resource_group_name" = "dummy"
"virtual_machine_id" = ""
},
]

Converting a list(map(list(map(string)))) into a map(list(map(string))) with terraform

Hi there is there any neat way to convert a list(map(list(map(string)))) into a map(list(map(string))) with terraform .
Here's what my input structure looks like
`variable "data" {
type = list(map(list(map(string))))
default = [
{
secrets = [
{
secret-name = "secret1"
secret-label = "label1"
},
{
secret-name = "secret2"
secret-label = "label2"
}
],
config-maps = [
{
config-map-name = "conf1"
java-options = "-Xmx256m"
config-label = "develop"
}
]
},
{
secrets = [
{
secret-name = "secret3"
secret-label = "label3"
}
],
config-maps = [
{
config-map-name = "conf2"
java-options = "-Xmx256m"
config-label = "develop"
}
]
}
]
}`
and here's what i want it to look like
`data = {
secrets = [
{
secret-name = "secret1"
secret-label = "label1"
},
{
secret-name = "secret2"
secret-label = "label2"
},
{
secret-name = "secret3"
secret-label = "label3"
},
],
config-maps = [
{
config-map-name = "conf1"
java-options = "-Xmx256m"
config-label = "develop"
},
{
config-map-name = "conf2"
java-options = "-Xmx256m"
config-label = "develop"
}
]
}
Can you guys help me achieve this please ?
Ps : preferably in the locals part
Then, how about this?
locals {
values = flatten([
for d in var.data : [
for _, v in d : v
]
])
keys = flatten([
for d in var.data : [
for k, v in d : [
for _ in v : k
]
]
])
}
output data {
value = {
for k in distinct(local.keys) :
k => matchkeys(local.values, local.keys, [k])
}
}
I hope this will help.

Resources