{"id":7493,"date":"2019-10-29T08:46:24","date_gmt":"2019-10-29T08:46:24","guid":{"rendered":"https:\/\/www.devopsschool.com\/blog\/?p=7493"},"modified":"2023-08-17T02:48:44","modified_gmt":"2023-08-17T02:48:44","slug":"how-to-do-looping-iterations-in-terraform","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/how-to-do-looping-iterations-in-terraform\/","title":{"rendered":"Terraform Tutorials: How to do Loop \/ Iterate in Terraform?"},"content":{"rendered":"\n<p><strong>Resources<\/strong><br> Resources are the most important element in the Terraform language. Each resource block describes one or more infrastructure objects, such as virtual networks, compute instances, or higher-level components such as DNS records supported by providers.<\/p>\n\n\n\n<p><strong>Resources type<\/strong><br> Each resource is associated with a single resource type, which determines the kind of infrastructure object it manages and what arguments and other attributes the resource supports.<\/p>\n\n\n\n<p><strong>Provider<\/strong><br> Each resource type in turn belongs to a provider, which is a plugin for Terraform that offers a collection of resource types. A provider usually provides resources to manage a single cloud or on-premises infrastructure platform.<\/p>\n\n\n\n<p><strong>Resource Behavior by Meta-Arguments <\/strong><br> Resource Behavior by Meta-Arguments, which can be used with any resource type to change the behavior of resources:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>depends_on, for specifying hidden dependencies<\/li>\n\n\n\n<li>count, for creating multiple resource instances according to a count<\/li>\n\n\n\n<li>for_each, to create multiple instances according to a map, or set of strings<\/li>\n\n\n\n<li>provider, for selecting a non-default provider configuration<br> lifecycle, for lifecycle customizations<\/li>\n\n\n\n<li>provisioner and connection, for taking extra actions after resource creation<\/li>\n<\/ul>\n\n\n\n<p><strong>count: which allows Multiple Resource Instances By Count<\/strong><\/p>\n\n\n\n<p>Out of these, count: which allows Multiple Resource Instances By Count and this Meta-Arguments can be used to Multiply resources which can be used as an alternative to Looping and Interators in Terraform.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">\nresource <span class=\"hljs-string\">\"aws_instance\"<\/span> <span class=\"hljs-string\">\"example\"<\/span> {\n  ami = <span class=\"hljs-string\">\"ami-2d39803a\"<\/span>\n  instance_type = <span class=\"hljs-string\">\"t2.micro\"<\/span>\n}\n\n<span class=\"hljs-comment\">###### WRONG WAY ###### <\/span>\n<span class=\"hljs-keyword\">for<\/span> i = <span class=\"hljs-number\">0<\/span>; i &lt; <span class=\"hljs-number\">3<\/span>; i++ {\n  resource <span class=\"hljs-string\">\"aws_instance\"<\/span> <span class=\"hljs-string\">\"example\"<\/span> {\n    ami = <span class=\"hljs-string\">\"ami-2d39803a\"<\/span>\n    instance_type = <span class=\"hljs-string\">\"t2.micro\"<\/span>\n  }  \n}\n\n<span class=\"hljs-comment\">###### RIGHT WAY ###### <\/span>\nresource <span class=\"hljs-string\">\"aws_instance\"<\/span> <span class=\"hljs-string\">\"example\"<\/span> {\n  count = <span class=\"hljs-number\">3<\/span>\n  ami = <span class=\"hljs-string\">\"ami-2d39803a\"<\/span>\n  instance_type = <span class=\"hljs-string\">\"t2.micro\"<\/span>\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><strong>for_each: Multiple Resource Instances Defined By a Map, or Set of Strings.<\/strong><\/p>\n\n\n\n<p>If your resource instances are almost identical, count is appropriate. If some of their arguments need distinct values that can&#8217;t be directly derived from an integer, it&#8217;s safer to use for_each.<\/p>\n\n\n\n<p>Before for_each was available, it was common to derive count from the length of a list and use count.index to look up the original list value:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">\nvariable <span class=\"hljs-string\">\"subnet_ids\"<\/span> {\n  type = <span class=\"hljs-keyword\">list<\/span>(string)\n}\n\nresource <span class=\"hljs-string\">\"aws_instance\"<\/span> <span class=\"hljs-string\">\"server\"<\/span> {\n  <span class=\"hljs-comment\"># Create one instance for each subnet<\/span>\n  count = length(<span class=\"hljs-keyword\">var<\/span>.subnet_ids)\n\n  ami           = <span class=\"hljs-string\">\"ami-a1b2c3d4\"<\/span>\n  instance_type = <span class=\"hljs-string\">\"t2.micro\"<\/span>\n  subnet_id     = <span class=\"hljs-keyword\">var<\/span>.subnet_ids&#91;count.index]\n\n  tags {\n    Name = <span class=\"hljs-string\">\"Server ${count.index}\"<\/span>\n  }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>The for_each meta-argument accepts a map or a set of strings, and creates an instance for each item in that map or set. Each instance has a distinct infrastructure object associated with it (as described above in Resource Behavior), and each is separately created, updated, or destroyed when the configuration is applied.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">\nresource <span class=\"hljs-string\">\"azurerm_resource_group\"<\/span> <span class=\"hljs-string\">\"rg\"<\/span> {\n  for_each = {\n    a_group = <span class=\"hljs-string\">\"eastus\"<\/span>\n    another_group = <span class=\"hljs-string\">\"westus2\"<\/span>\n  }\n  name     = each.key\n  location = each.value\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<figure class=\"wp-block-embed is-type-wp-embed is-provider-devopsschool-com wp-block-embed-devopsschool-com\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"jiY8lmwGXe\"><a href=\"https:\/\/www.devopsschool.com\/blog\/terraform-looping-using-for-each-for-resources-with-example\/\">Terraform looping using for-each-for-resources with example<\/a><\/blockquote><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; clip: rect(1px, 1px, 1px, 1px);\" title=\"&#8220;Terraform looping using for-each-for-resources with example&#8221; &#8212; DevOpsSchool.com\" src=\"https:\/\/www.devopsschool.com\/blog\/terraform-looping-using-for-each-for-resources-with-example\/embed\/#?secret=jiY8lmwGXe\" data-secret=\"jiY8lmwGXe\" width=\"600\" height=\"338\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><\/figure>\n\n\n\n<figure class=\"wp-block-embed is-type-wp-embed is-provider-devopsschool-com wp-block-embed-devopsschool-com\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"A4On3o30Dd\"><a href=\"https:\/\/www.devopsschool.com\/blog\/terraform-looping-using-lists-and-maps-with-for-with-example\/\">Terraform looping using lists-and-maps-with-for with example<\/a><\/blockquote><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; clip: rect(1px, 1px, 1px, 1px);\" title=\"&#8220;Terraform looping using lists-and-maps-with-for with example&#8221; &#8212; DevOpsSchool.com\" src=\"https:\/\/www.devopsschool.com\/blog\/terraform-looping-using-lists-and-maps-with-for-with-example\/embed\/#?secret=A4On3o30Dd\" data-secret=\"A4On3o30Dd\" width=\"600\" height=\"338\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><\/figure>\n\n\n\n<script src=\"https:\/\/gist.github.com\/devops-school\/3715a89f332fba723ef9dff9f467baec.js\"><\/script>\n\n\n\n<script src=\"https:\/\/gist.github.com\/devops-school\/ad3f711549241765af4bdbfefd532df1.js\"><\/script>\n\n\n\n<p><strong>More reading can be done here<\/strong><\/p>\n\n\n\n<p><a href=\"https:\/\/www.terraform.io\/docs\/configuration\/resources.html#for_each-multiple-resource-instances-defined-by-a-map-or-set-of-strings\" target=\"_blank\" rel=\"noopener\">https:\/\/www.terraform.io\/docs\/configuration\/resources.html#for_each-multiple-resource-instances-defined-by-a-map-or-set-of-strings<\/a><\/p>\n\n\n<div class=\"epyt-gallery\" data-currpage=\"1\" id=\"epyt_gallery_57031\"><iframe loading=\"lazy\"  id=\"_ytid_21396\"  width=\"760\" height=\"427\"  data-origwidth=\"760\" data-origheight=\"427\" src=\"https:\/\/www.youtube.com\/embed\/?enablejsapi=1&#038;autoplay=0&#038;cc_load_policy=0&#038;cc_lang_pref=&#038;iv_load_policy=1&#038;loop=0&#038;rel=1&#038;fs=1&#038;playsinline=0&#038;autohide=2&#038;theme=dark&#038;color=red&#038;controls=1&#038;disablekb=0&#038;\" class=\"__youtube_prefs__  no-lazyload\" title=\"YouTube player\"  data-epytgalleryid=\"epyt_gallery_57031\"  allow=\"fullscreen; accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen data-no-lazy=\"1\" data-skipgform_ajax_framebjll=\"\"><\/iframe><div class=\"epyt-gallery-list\"><div>Sorry, there was a YouTube error.<\/div><\/div><\/div>","protected":false},"excerpt":{"rendered":"<p>Resources Resources are the most important element in the Terraform language. Each resource block describes one or more infrastructure objects, such as virtual networks, compute instances, or higher-level components such&#8230; <\/p>\n","protected":false},"author":1,"featured_media":7795,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[5129],"tags":[5449,5497,5496,5130],"class_list":["post-7493","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-terraform","tag-devopsschool","tag-iterations","tag-looping","tag-terraform"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/7493","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=7493"}],"version-history":[{"count":7,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/7493\/revisions"}],"predecessor-version":[{"id":38340,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/7493\/revisions\/38340"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media\/7795"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=7493"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=7493"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=7493"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}