Olá pessoal, sejam muito bem-vindos a mais uma aula. E hoje nós falaremos sobre um meta-argumento do Terraform, que é o ForEach. Nós já utilizamos um meta-argumento anteriormente, que foi o Count, que nos permite criar várias instâncias de um mesmo recurso. E nós podemos fazer exatamente a mesma coisa, utilizando também ForEach. Só que a forma de nós declararmos é um pouquinho diferente. Nós vamos então navegar até o nosso exemplo, onde nós utilizamos o count, aqui no módulo de network, onde nós temos os recursos subnets. Essas subnets aqui é uma lista de recursos, já que nós temos uma subnet para cada cider block que nós informamos como parâmetro. Então vamos refatorar este recurso para nós agora utilizarmos o for each ao invés do count. Então, eu vou colocar aqui forEach e como argumento do forEach, nós podemos passar um set ou um map. Então, nós vamos colocar aqui uma função, que é a função toSet, onde nós podemos passar a nossa lista, que é a lista de CiderBlock, já que este carinha aqui nós declaramos como uma lista e não funciona como lista, que é a lista de CIDER blocks, já que este carinha aqui nós declaramos como uma lista e não funciona como lista, funciona somente com um set ou for each, então por isso que nós fazemos esse cache para o set. Beleza, nós temos então o nosso for each, que vai criar a mesma quantidade de recursos assim como nós tínhamos para o count, porém a forma de nós referenciarmos cada um desses blocos agora vai ser um pouquinho diferente. Antes nós achamos o count index, onde index é o valor em cada iteração de acordo com o que nós passamos aqui em count. Agora nós podemos referenciar o bloco diretamente da seguinte forma. Nós temos cider block, agora nós podemos utilizar essa keyword, que é a keyword EACH, possui os valores KEY e VALUE. Como nós estamos utilizando um SET, nós podemos utilizar qualquer um, porque ambos os valores, KEY e VALUE, terão o mesmo valor, terão o CIDER BLOCK. A diferença acontece quando nós temos um MAP, por exemplo. A diferença acontece quando nós temos um map, por exemplo. Então, eu poderia ter aqui também um for each, onde nós tivéssemos aqui um map. Então, vamos declarar aqui um map como exemplo. E eu teria aqui o block 1, onde o valor seria 10.0.0.0 barra 24. E eu tenho também um bloco 2, tá? Bloco 2. Aqui agora com uma outra máscara. Beleza. Quando nós fazemos assim, cada iteração do nosso for it, do nosso for it, terá, então, um desses que velhos, né? Um desses pares aqui. Na primeira iteração, o nosso itkey será igual a block1 e o itvalue será essa máscara. Já na segunda interação o nosso itkey terá esse bloco2 e o nosso value será essa outra máscara. Então nós podemos utilizar tanto com sets como com maps. Geralmente nós utilizamos mais com sets. Então eu vou manter aqui o exemplo desse two set. Agora nós temos um problema que é essa lógica que nós temos para distribuir a subnet através de todas as nossas asias. Nós não temos mais um Couch Index. Então essa lógica aqui agora vai ficar um pouco complicada. Como nós estamos fazendo um exemplo somente para nós entendermos como funciona o forEach, eu vou comentar, depois nós vamos descomentar e voltar para a nossa abordagem com o count. Aqui nós não temos o count index também, então nós podemos colocar, por exemplo, it, podemos deixar aqui o valor do próprio bloco no nome da nossa subnet. Beleza, alteramos então esta lista de recursos. A questão é que quando nós utilizamos for it, este subnet agora não será mais uma lista, ele será um map. Inclusive, se nós rodarmos terraform e plain, nós teremos um erro. Vamos aqui aguardar que este comando seja executado para nós identificarmos onde o erro está acontecendo. Precisamos esperar aqui que o state, ele seja atualizado, e beleza, temos aqui o nosso erro, tá? Nós temos um invalid index, nós estamos aqui na declaração do recurso AWS Route Table Association, nós estamos referenciando subnets através de count index, e nós não temos esse cara, tá? Porque agora subnets, ele é um objeto, ele é um map. Para nós utilizarmos, então, subnets, nós precisamos de referenciar a partir do CIDR block, tá? Então, cada um desses CIDR blocks aqui vai ser a chave para cada uma das subnets criadas. Então, vamos alterar o nosso route table association, vamos navegar aqui. Agora, nós não podemos mais utilizar esse count, porque nós precisamos exatamente do slider block. Vamos transformar de novo no set a nossa lista de slider blocks, e aqui, ao invés desse tipo de associação, nós podemos associar diretamente it e beleza temos então aqui a referência a cada uma das nossas subnets tá porém nós vamos ter um outro erro aqui no nosso output porque nós temos essa projeção nós consideramos que subnet é uma lista então nós projetamos todos os campos e depois selecionamos somente o id. Para que a gente tenha o mesmo resultado nós podemos utilizar a função values, que nos permite projetar simplesmente os valores de um map. Beleza? Aqui está. Agora nós podemos rodar o Terraform Plane e verificar se essas alterações atenderão a nossa necessidade. Se nós não teremos mais nenhum erro. Vamos aguardar aqui o refresh do state. Beleza, nenhum erro até agora. E perfeito, não temos nenhuma mensagem de erro. E aqui nós podemos ver a diferença na criação dos recursos. Agora o nosso subnet, ao invés dele ter um índice 0 e 1, nós temos a referência direta através do CIDER block então temos aqui o segundo CIDER block e temos também o primeiro CIDER block esse carinha aqui, nós podemos verificar que as subnetas anteriores referenciadas através de um índice numérico agora serão destruídas beleza? em alguns cenários isso pode ser útil, pode ser mais fácil de trabalhar dessa forma do que com o count, mas para o nosso cenário, onde nós temos aquela lógica para associação com as ases, faz muito mais sentido nós mantermos com o count, mas agora você já sabe também como utilizar o for it. Espero que você tenha gostado. Vejo você na nossa próxima aula.