{"id":1166,"date":"2022-11-13T20:27:04","date_gmt":"2022-11-13T19:27:04","guid":{"rendered":"https:\/\/www.netexpertise.eu\/fr\/?p=1166"},"modified":"2022-11-13T20:27:06","modified_gmt":"2022-11-13T19:27:06","slug":"convertir-une-map-de-maps-en-map-unique","status":"publish","type":"post","link":"http:\/\/www.netexpertise.eu\/fr\/devops\/terraform\/convertir-une-map-de-maps-en-map-unique.html","title":{"rendered":"Convertir une Map de Maps en Map Unique"},"content":{"rendered":"\n<p>..Ou comment \u00e9viter le message d&rsquo;erreur <em>&lsquo;Call to function \u00ab\u00a0merge\u00a0\u00bb failed: arguments must be maps or objects, got \u00ab\u00a0tuple\u00a0\u00bb.&rsquo;<\/em>. L&rsquo;exemple avec une map de maps.<br><br><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img src=\"\/uploads\/maps-pages-papers-vintage-1854199-1024x682.jpg\" alt=\"\"\/><\/figure>\n\n\n\n<h2><br>Probl\u00e8me \u00e0 la Cr\u00e9ation d&rsquo;une Map<\/h2>\n\n\n\n<p>Voici une structure de donn\u00e9es typique \u00e0 2 niveaux avec des sous-groupes qui contiennent des utilisateurs, eux-m\u00eames appartenant \u00e0 des d\u00e9partements:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"vim\" class=\"language-vim\">locals {\n   groups = {\n      it = {\n         admin   = [\"it1\",\"it2\"]\n         editors = [\"it3\",\"it4\"]\n      },\n      accounts = {\n         editors = [\"account1\",\"account2\"]\n         viewers = [\"account3\",\"account4\"]\n      }\n   }\n}<\/code><\/pre>\n\n\n\n<p><br>La structure devra \u00eatre nivel\u00e9e (flatten) dans de nombreux cas pour cr\u00e9er des resources <a href=\"\/fr\/category\/devops\/terraform\">Terraform<\/a>.<br>Notre cible est une map de sous-groupes uniques departement_sous-group = [ \u00ab\u00a0user1\u00a0\u00bb, \u00ab\u00a0user2\u00a0\u00bb ]. Dans notre exemple:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"vim\" class=\"language-vim\">subgroups = {\n  \"accounts_editors\" = [\n    \"account1\",\n    \"account2\",\n  ]\n  \"accounts_viewers\" = [\n    \"account3\",\n    \"account4\",\n  ]\n  \"it_admin\" = [\n    \"it1\",\n    \"it2\",\n  ]\n  \"it_editors\" = [\n    \"it3\",\n    \"it4\",\n  ]\n}<\/code><\/pre>\n\n\n\n<p><br>C&rsquo;est assez simple d&rsquo;obtenir une liste de maps distinctes en nivelant les listes r\u00e9sultantes d&rsquo;une double boucle:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"vim\" class=\"language-vim\">subgroups = flatten([\n   for group,subgroups in local.groups : [\n      for subgroup, users in subgroups : {\n         \"${group}_${subgroup}\" = users\n      }\n   ]\n])\n# output:\nsubgroups = [\n  {\n    \"accounts_editors\" = [\n      \"account1\",\n      \"account2\",\n    ]\n  },\n  {\n    \"accounts_viewers\" = [\n      \"account3\",\n      \"account4\",\n    ]\n  },\n  {\n    \"it_admin\" = [\n      \"it1\",\n      \"it2\",\n    ]\n  },\n  {\n    \"it_editors\" = [\n      \"it3\",\n      \"it4\",\n    ]\n  },\n]<\/code><\/pre>\n\n\n\n<p>Tout ce qu&rsquo;il nous reste \u00e0 faire est de fusionner ces maps en une map unique, mais ce faisant, le message d&rsquo;erreur nous est retourn\u00e9:<br><em>&lsquo;Call to function \u00ab\u00a0merge\u00a0\u00bb failed: arguments must be maps or objects, got \u00ab\u00a0tuple\u00a0\u00bb.&rsquo;<\/em><br><br><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img src=\"\/uploads\/merge_got_tuple-1024x384.png\" alt=\"Call to function &quot;merge&quot; failed: arguments must be maps or objects, got &quot;tuple&quot;\"\/><figcaption><em>Call to function \u00ab\u00a0merge\u00a0\u00bb failed: arguments must be maps or objects, got \u00ab\u00a0tuple\u00a0\u00bb<\/em><\/figcaption><\/figure>\n\n\n\n<p><br>2 recours possibles: le moche et l&rsquo;\u00e9l\u00e9gant.<\/p>\n\n\n\n<h2><br>La Solution Moche : Une Autre Boucle Terraform<\/h2>\n\n\n\n<p><br>La 1re solution qui vient \u00e0 l&rsquo;esprit est de g\u00e9n\u00e9rer la nouvelle map via une autre boucle <a href=\"https:\/\/developer.hashicorp.com\/terraform\/language\/expressions\/for\" target=\"_blank\" rel=\"noreferrer noopener\">for<\/a>. Cela nous am\u00e8ne \u00e0 3 boucles, et ne semble pas tr\u00e8s logique alors qu&rsquo;un simple merge ferait le travail. Chaque map contient un \u00e9l\u00e9ment seulement, donc nous prenons les 1res cl\u00e9 et valeur.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"vim\" class=\"language-vim\">subgroups = { for subgroup in flatten([\n   for group,subgroups in local.groups : [\n      for subgroup, users in subgroups : {\n         \"${group}_${subgroup}\" = users\n      }\n   ]\n]) : keys(subgroup)[0] =&gt; values(subgroup)[0] }<\/code><\/pre>\n\n\n\n<h2><br>La Solution El\u00e9gante : la Fonction Expansion<\/h2>\n\n\n\n<p><br>C&rsquo;est beaucoup plus court que la solution pr\u00e9c\u00e9dente:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"vim\" class=\"language-vim\">subgroups = merge(flatten([\n   for group,subgroups in local.groups : [\n      for subgroup, users in subgroups : {\n         \"${group}_${subgroup}\" = users\n      }\n   ]\n])...)<\/code><\/pre>\n\n\n\n<p>Le r\u00e9sultat est exactement le m\u00eame mais qu&rsquo;est-ce qui a chang\u00e9? Juste les 3 points&#8230;<br>La fonction <a href=\"https:\/\/developer.hashicorp.com\/terraform\/language\/expressions\/function-calls#expanding-function-arguments\" target=\"_blank\" rel=\"noreferrer noopener\">Expansion<\/a> prend chaque \u00e9l\u00e9ment d&rsquo;une liste et led passe \u00e0 la fonction appelante.<br><\/p>\n\n\n\n<p><br><\/p>\n","protected":false},"excerpt":{"rendered":"<p>..Ou comment \u00e9viter le message d&rsquo;erreur &lsquo;Call to function \u00ab\u00a0merge\u00a0\u00bb failed: arguments must be maps or objects, got \u00ab\u00a0tuple\u00a0\u00bb.&rsquo;. L&rsquo;exemple avec une map de maps. Probl\u00e8me \u00e0 la Cr\u00e9ation d&rsquo;une Map Voici une structure de donn\u00e9es typique \u00e0 2 niveaux avec des sous-groupes qui contiennent des utilisateurs, eux-m\u00eames appartenant \u00e0 des d\u00e9partements: La structure devra [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_mi_skip_tracking":false},"categories":[440,468],"tags":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v19.13 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Netexpertise - Convertir une Map de Maps en Map Unique<\/title>\n<meta name=\"description\" content=\"Construire une map unique Terraform \u00e0 partir d&#039;une map multi-niveau avec des boucles for et la fonction merge + expansion\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"http:\/\/www.netexpertise.eu\/fr\/devops\/terraform\/convertir-une-map-de-maps-en-map-unique.html\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Netexpertise - Convertir une Map de Maps en Map Unique\" \/>\n<meta property=\"og:description\" content=\"Construire une map unique Terraform \u00e0 partir d&#039;une map multi-niveau avec des boucles for et la fonction merge + expansion\" \/>\n<meta property=\"og:url\" content=\"http:\/\/www.netexpertise.eu\/fr\/devops\/terraform\/convertir-une-map-de-maps-en-map-unique.html\" \/>\n<meta property=\"og:site_name\" content=\"Netexpertise\" \/>\n<meta property=\"article:published_time\" content=\"2022-11-13T19:27:04+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-11-13T19:27:06+00:00\" \/>\n<meta name=\"author\" content=\"dave\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@netexpertise\" \/>\n<meta name=\"twitter:site\" content=\"@netexpertise\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"http:\/\/www.netexpertise.eu\/fr\/devops\/terraform\/convertir-une-map-de-maps-en-map-unique.html\",\"url\":\"http:\/\/www.netexpertise.eu\/fr\/devops\/terraform\/convertir-une-map-de-maps-en-map-unique.html\",\"name\":\"Netexpertise - Convertir une Map de Maps en Map Unique\",\"isPartOf\":{\"@id\":\"https:\/\/www.netexpertise.eu\/fr\/#website\"},\"datePublished\":\"2022-11-13T19:27:04+00:00\",\"dateModified\":\"2022-11-13T19:27:06+00:00\",\"author\":{\"@id\":\"https:\/\/www.netexpertise.eu\/fr\/#\/schema\/person\/e398f0307e2b167f6b884c4953be2632\"},\"description\":\"Construire une map unique Terraform \u00e0 partir d'une map multi-niveau avec des boucles for et la fonction merge + expansion\",\"breadcrumb\":{\"@id\":\"http:\/\/www.netexpertise.eu\/fr\/devops\/terraform\/convertir-une-map-de-maps-en-map-unique.html#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"http:\/\/www.netexpertise.eu\/fr\/devops\/terraform\/convertir-une-map-de-maps-en-map-unique.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"http:\/\/www.netexpertise.eu\/fr\/devops\/terraform\/convertir-une-map-de-maps-en-map-unique.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/www.netexpertise.eu\/fr\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Convertir une Map de Maps en Map Unique\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.netexpertise.eu\/fr\/#website\",\"url\":\"https:\/\/www.netexpertise.eu\/fr\/\",\"name\":\"Netexpertise\",\"description\":\"Syst\u00e8mes \/ R\u00e9seaux \/ DevOps\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.netexpertise.eu\/fr\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.netexpertise.eu\/fr\/#\/schema\/person\/e398f0307e2b167f6b884c4953be2632\",\"name\":\"dave\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/www.netexpertise.eu\/fr\/#\/schema\/person\/image\/\",\"url\":\"http:\/\/1.gravatar.com\/avatar\/1129916e1f4955bd632f27f836f64e55?s=96&d=mm&r=g\",\"contentUrl\":\"http:\/\/1.gravatar.com\/avatar\/1129916e1f4955bd632f27f836f64e55?s=96&d=mm&r=g\",\"caption\":\"dave\"},\"sameAs\":[\"http:\/\/www.netexpertise.eu\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Netexpertise - Convertir une Map de Maps en Map Unique","description":"Construire une map unique Terraform \u00e0 partir d'une map multi-niveau avec des boucles for et la fonction merge + expansion","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"http:\/\/www.netexpertise.eu\/fr\/devops\/terraform\/convertir-une-map-de-maps-en-map-unique.html","og_locale":"fr_FR","og_type":"article","og_title":"Netexpertise - Convertir une Map de Maps en Map Unique","og_description":"Construire une map unique Terraform \u00e0 partir d'une map multi-niveau avec des boucles for et la fonction merge + expansion","og_url":"http:\/\/www.netexpertise.eu\/fr\/devops\/terraform\/convertir-une-map-de-maps-en-map-unique.html","og_site_name":"Netexpertise","article_published_time":"2022-11-13T19:27:04+00:00","article_modified_time":"2022-11-13T19:27:06+00:00","author":"dave","twitter_card":"summary_large_image","twitter_creator":"@netexpertise","twitter_site":"@netexpertise","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"http:\/\/www.netexpertise.eu\/fr\/devops\/terraform\/convertir-une-map-de-maps-en-map-unique.html","url":"http:\/\/www.netexpertise.eu\/fr\/devops\/terraform\/convertir-une-map-de-maps-en-map-unique.html","name":"Netexpertise - Convertir une Map de Maps en Map Unique","isPartOf":{"@id":"https:\/\/www.netexpertise.eu\/fr\/#website"},"datePublished":"2022-11-13T19:27:04+00:00","dateModified":"2022-11-13T19:27:06+00:00","author":{"@id":"https:\/\/www.netexpertise.eu\/fr\/#\/schema\/person\/e398f0307e2b167f6b884c4953be2632"},"description":"Construire une map unique Terraform \u00e0 partir d'une map multi-niveau avec des boucles for et la fonction merge + expansion","breadcrumb":{"@id":"http:\/\/www.netexpertise.eu\/fr\/devops\/terraform\/convertir-une-map-de-maps-en-map-unique.html#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["http:\/\/www.netexpertise.eu\/fr\/devops\/terraform\/convertir-une-map-de-maps-en-map-unique.html"]}]},{"@type":"BreadcrumbList","@id":"http:\/\/www.netexpertise.eu\/fr\/devops\/terraform\/convertir-une-map-de-maps-en-map-unique.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.netexpertise.eu\/fr"},{"@type":"ListItem","position":2,"name":"Convertir une Map de Maps en Map Unique"}]},{"@type":"WebSite","@id":"https:\/\/www.netexpertise.eu\/fr\/#website","url":"https:\/\/www.netexpertise.eu\/fr\/","name":"Netexpertise","description":"Syst\u00e8mes \/ R\u00e9seaux \/ DevOps","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.netexpertise.eu\/fr\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"fr-FR"},{"@type":"Person","@id":"https:\/\/www.netexpertise.eu\/fr\/#\/schema\/person\/e398f0307e2b167f6b884c4953be2632","name":"dave","image":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/www.netexpertise.eu\/fr\/#\/schema\/person\/image\/","url":"http:\/\/1.gravatar.com\/avatar\/1129916e1f4955bd632f27f836f64e55?s=96&d=mm&r=g","contentUrl":"http:\/\/1.gravatar.com\/avatar\/1129916e1f4955bd632f27f836f64e55?s=96&d=mm&r=g","caption":"dave"},"sameAs":["http:\/\/www.netexpertise.eu"]}]}},"_links":{"self":[{"href":"http:\/\/www.netexpertise.eu\/fr\/wp-json\/wp\/v2\/posts\/1166"}],"collection":[{"href":"http:\/\/www.netexpertise.eu\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.netexpertise.eu\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.netexpertise.eu\/fr\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/www.netexpertise.eu\/fr\/wp-json\/wp\/v2\/comments?post=1166"}],"version-history":[{"count":0,"href":"http:\/\/www.netexpertise.eu\/fr\/wp-json\/wp\/v2\/posts\/1166\/revisions"}],"wp:attachment":[{"href":"http:\/\/www.netexpertise.eu\/fr\/wp-json\/wp\/v2\/media?parent=1166"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.netexpertise.eu\/fr\/wp-json\/wp\/v2\/categories?post=1166"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.netexpertise.eu\/fr\/wp-json\/wp\/v2\/tags?post=1166"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}