{"id":506,"date":"2022-09-30T09:24:34","date_gmt":"2022-09-30T14:24:34","guid":{"rendered":"https:\/\/cloudlearning365.com\/?p=506"},"modified":"2022-10-14T09:32:53","modified_gmt":"2022-10-14T14:32:53","slug":"terraform-note-to-self","status":"publish","type":"post","link":"https:\/\/cloudlearning365.com\/?p=506","title":{"rendered":"Terraform &#8211; Note to Self"},"content":{"rendered":"\n<h4 class=\"wp-block-heading\">Get list of all possible combination, from multiple lists<\/h4>\n\n\n\n<!--more-->\n\n\n\n<pre class=\"wp-block-code\"><code>&gt; setproduct(&#91;\"a\",\"b\",\"c\"],&#91;\"x\",\"y\"])\n\ntolist(&#91;\n  &#91;\n    \"a\",\n    \"x\",\n  ],\n  &#91;\n    \"a\",\n    \"y\",\n  ],\n  &#91;\n    \"b\",\n    \"x\",\n  ],\n  &#91;\n    \"b\",\n    \"y\",\n  ],\n  &#91;\n    \"c\",\n    \"x\",\n  ],\n  &#91;\n    \"c\",\n    \"y\",\n  ],\n])<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">Find the index of a list, where it&#8217;s sub attribute contains certain value<\/h4>\n\n\n\n<p><\/p>\n\n\n\n<p>Sometimes, you really wish terraform have something like jq&#8230;<\/p>\n\n\n\n<p>PS: Suggestions<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>use <a href=\"https:\/\/www.terraform.io\/language\/resources\/provisioners\/local-exec\">local-exec<\/a> then call jq<\/li><li>there&#8217;s a <a href=\"https:\/\/github.com\/massdriver-cloud\/terraform-provider-jq\">terraform provider jq<\/a><\/li><\/ul>\n\n\n\n<p>Example following Azure VPN Gateway BGP Settings is a list.<\/p>\n\n\n\n<p>Need to retrieve the ASN number where the tunnel IP address is matching known public IP.<\/p>\n\n\n\n<p>Hence need to get the index of the list, where the tunnel IP address is matching known public IP<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt; azurerm_virtual_network_gateway.this.bgp_settings\ntolist(&#91;\n  {\n    \"asn\" = 65010\n    \"peer_weight\" = 0\n    \"peering_addresses\" = tolist(&#91;\n      {\n        \"apipa_addresses\" = tolist(&#91;])\n        \"default_addresses\" = tolist(&#91;\n          \"10.0.10.4\",\n        ])\n        \"ip_configuration_name\" = \"vnetGatewayConfig1\"\n        \"tunnel_ip_addresses\" = tolist(&#91;\n          \"20.163.152.123\",\n        ])\n      },\n      {\n        \"apipa_addresses\" = tolist(&#91;])\n        \"default_addresses\" = tolist(&#91;\n          \"10.0.10.5\",\n        ])\n        \"ip_configuration_name\" = \"vnetGatewayConfig2\"\n        \"tunnel_ip_addresses\" = tolist(&#91;\n          \"20.163.152.137\",\n        ])\n      },\n    ])\n  },\n])<\/code><\/pre>\n\n\n\n<p>Reference idea<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>locals {\n  objList = &#91;\n    { name = \"Chris\" },\n    { name = \"Dan\" }\n  ]\n\n  # splat expression index lookup\n  myObjIndexSplat = index(local.objList.*.name, \"Dan\")\n\n  # for expression index lookup\n  myObjIndexFor = index(&#91;for v in local.objList : v.name], \"Dan\")\n}<\/code><\/pre>\n\n\n\n<p>Actual code breakdown:<\/p>\n\n\n\n<p>Getting the list of tunnel IP address<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt; &#91;for v in azurerm_virtual_network_gateway.this.bgp_settings: flatten(v.peering_addresses&#91;*].tunnel_ip_addresses)]\n&#91;\n  &#91;\n    \"20.163.152.123\",\n    \"20.163.152.137\",\n  ],\n]<\/code><\/pre>\n\n\n\n<p>Check if the list contains certain public IP<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt; &#91;for v in azurerm_virtual_network_gateway.this.bgp_settings: contains(flatten(v.peering_addresses&#91;*].tunnel_ip_addresses),\"20.163.152.123\")]\n&#91;\n  true,\n]<\/code><\/pre>\n\n\n\n<p>Getting the index <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt; index(&#91;for v in azurerm_virtual_network_gateway.this.bgp_settings: contains(flatten(v.peering_addresses&#91;*].tunnel_ip_addresses),\"20.163.152.123\")],true)\n0<\/code><\/pre>\n\n\n\n<p>Getting the ASN number<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt; azurerm_virtual_network_gateway.this.bgp_settings&#91;index(&#91;for v in azurerm_virtual_network_gateway.this.bgp_settings: contains(flatten(v.peering_addresses&#91;*].tunnel_ip_addresses),\"20.163.152.123\")],true)].asn\n65010<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Get list of all possible combination, from multiple lists<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[8],"tags":[],"class_list":["post-506","post","type-post","status-publish","format-standard","hentry","category-terraform"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/cloudlearning365.com\/index.php?rest_route=\/wp\/v2\/posts\/506","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cloudlearning365.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cloudlearning365.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cloudlearning365.com\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/cloudlearning365.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=506"}],"version-history":[{"count":4,"href":"https:\/\/cloudlearning365.com\/index.php?rest_route=\/wp\/v2\/posts\/506\/revisions"}],"predecessor-version":[{"id":684,"href":"https:\/\/cloudlearning365.com\/index.php?rest_route=\/wp\/v2\/posts\/506\/revisions\/684"}],"wp:attachment":[{"href":"https:\/\/cloudlearning365.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=506"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cloudlearning365.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=506"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cloudlearning365.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=506"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}