Bom pessoal, antes de nós de fato reestruturarmos o nosso projeto e criarmos os nossos próprios módulos, eu gostaria de passar simplesmente a definição do que são módulos em Terraform. E essa definição é muito simples. Um módulo em Terraform nada mais é do que o conjunto de arquivos de configuração e um único diretório. Então se você tem um diretório que tenha um ou mais arquivos .tf, você tem um módulo. Isso significa que o projeto com o qual nós estamos trabalhando aqui possui um módulo, que é o nosso módulo principal, o nosso módulo raiz. Então, quando nós temos um módulo onde nós executamos o Terraform Apply ou Terraform Plan, na verdade, nós estamos trabalhando dentro do módulo raiz. Esse diretório onde nós executamos os comandos do Terraform representa o módulo raiz. E a partir dessa aula nós teremos agora módulos filhos. Então nós iremos criar aqui um novo diretório, novos diretórios, onde nós teremos os nossos módulos filhos. Módulos filhos são esses módulos que são referenciados nos módulos raízes. Beleza? Então já temos aqui esse conceito, é um conceito bem simples, então significa que nós já trabalhamos com módulos, mas agora nós iremos de forma mais aprofundada, como por exemplo, passar valores, exportar valores e assim por diante. Vamos lá. Primeiro, eu gostaria de fazer uma organização mais básica, que será a seguinte, nós vamos criar um novo arquivo dentro da nossa pasta raiz mesmo, que será o arquivo providers, tá? Como o próprio nome sugere, nós teremos as informações dos nossos providers. Então, eu vou remover esse Terraform, esse bloco Terraform, e eu vou remover também a configuração do provider AWS. Beleza? Além disso, eu gostaria de adicionar aqui também required version dentro desse bloco terraform. E eu teria aqui uma version constraint, uma restrição para nós podermos executar aqui esse projeto simplesmente utilizando uma versão maior do que a versão 1.8.1. Esse tipo de restrição aqui, ela diz que nós podemos utilizar qualquer patch superior a este patch 1.8.1, porém se nós tivermos uma atualização de versão minor, se nós formos, por exemplo, para a versão 1.9, nós já não podemos utilizar mais, então tem que ser dentro dessa minor 1.8, beleza? Vamos salvar aqui então o nosso arquivo providers Vamos voltar até o nosso arquivo main Além disso, uma outra coisa também que nós costumamos fazer É colocar os outputs em um arquivo separado Isso aqui é válido para todos os módulos Então nós vamos ter aqui outputs.tf Onde nós vamos colocar os nossos outputs Beleza? Estão aqui definidos agora Vamos voltar até o arquivo main E perfeito, aqui no módulo Principal era só isso por enquanto que eu precisava Fazer, agora Eu vou criar um novo diretório que será o diretório Modules e aqui dentro nós teremos O nosso primeiro diretório que será O diretório Network Que representará o nosso primeiro módulo Nós teremos aqui dentro de Network um arquivo main.tf. Então outro padrão é esse, dentro dos módulos geralmente nós temos um arquivo main.tf e temos também aqui um arquivo variables, que inclusive nós podemos criar, variables.tf e um arquivo outputs.tf. Esse padrão aqui é bem comum, mas nada te impede de criar arquivos com outros nomes. É simplesmente por convenção e por ser algo mais sugestivo. Beleza, então agora o nosso primeiro passo é nós extrairmos os recursos relacionados à network. Nós vamos extrair daqui, por exemplo, a nossa VPC e a nossa subnet. Beleza? Temos aqui extraído. Agora nós precisamos também extrair o nosso Internet Gateway. Beleza? Movemos aqui o nosso Internet Gateway. Aqui nós vamos remover, ou melhor, eu vou simplesmente comentar este Elastic IP. Por enquanto, nós iremos ainda utilizar este Elastic IP, mas será um pouco mais adiante, por enquanto nós vamos comentar aqui a definição deste carinha, e nós precisamos também aqui no Output, também remover este Output, porque agora nós não temos mais este recurso, beleza? Voltando aqui, nós temos o nosso parâmetro vamos deixar aqui, temos agora a nossa Route Table com a sua associação, associando aqui a nossa subnet e nós vamos mover, vamos mover aqui para o nosso módulo de network. Voltando, temos agora o nosso security group, temos as suas duas regras que também serão removidas e farão parte agora deste módulo de network. Então agora nós temos aqui um módulo, que na verdade será o nosso maior módulo, o módulo de Network, agora de forma independente. Não temos mais a referência dele aqui no nosso módulo principal. Beleza? E agora nós precisamos de alguma forma de dizer aqui para o Terraform que ele precisa utilizar este módulo Network. E é muito simples nós fazermos isso. Basta nós definirmos aqui módulo. Aqui nós passamos um nome qualquer, um identificador qualquer para este módulo, que no nosso caso será network. Beleza? E nós precisamos dizer onde a definição deste módulo está. Qual que é o source deste módulo. No nosso caso, nós vamos colocar aqui .bar modules e network, mycluster, network. Beleza, dessa forma nós já temos a referência para o nosso módulo. Nós poderíamos também utilizar um módulo remoto, como por exemplo, um módulo disponível lá no registro do Terraform e assim por diante. Aqui no nosso caso, nós estamos utilizando o módulo local. Beleza? Só que agora nós temos um probleminha, tá? Porque aqui nós temos a nossa instância e a nossa instância tem uma dependência ou mais de uma dependência de recursos criados dentro deste módulo network. E quando nós criamos o módulo network, nós não temos acesso a esses recursos dessa forma direta aqui como nós fizemos. Nós precisamos no nosso módulo filho, expor esses recursos ou expor essas informações como outputs. Então nós precisamos aqui nesse primeiro momento do ID da subnet e do ID do nosso security group. Então nós vamos expor esses valores. Então nós vamos aqui até outputs, outputs dentro do módulo de network, nós teremos aqui output e nós vamos dar o nome de subnet id. E o nosso value será ws, vamos verificar se nós conseguimos encontrar aqui, subnet, exemplo subnet e vamos colocar id. Além disso, nós teremos um outro output que será o nosso, deixa eu verificar aqui qualquer outra dependência que eu já esqueci, o nosso security group, security group id, e o value será aws security group, exemplo, sg.id. E dessa forma, nós podemos referenciar esses outputs aqui dentro do nosso arquivo de configurações, tá? De forma bem simples. Utilizando o module.network, que é o nome do nosso módulo. E aqui nós já teremos acesso aos outputs. Primeiro nós precisamos da subnet ID. E agora também nós vamos utilizar o ID do nosso security group, tá? Security group ID. Nós já estamos expondo diretamente o ID, que é isso que nós precisamos. E, bom, aqui nós temos, na verdade, nós estamos criando aqui um parâmetro que referencia o nosso Elastic IP que nós comentamos. Então, nós precisamos comentar também a criação deste parâmetro, tá? Então, acaba que aqui no nosso módulo principal, por enquanto, nós temos somente uma instância. Mas logo logo nós já teremos aqui um módulo mais complexo para definir o nosso cluster. Então, já dando spoiler, nós iremos criar um cluster de máquinas virtuais. Por enquanto, nós temos somente uma. Agora nós precisamos verificar se isso está funcionando. Então, vamos aqui criar um novo terminal e aqui nós vamos executar terraform eplane para ver se nós não temos nenhum erro por enquanto. Beleza, temos aqui já as alterações que nós precisamos fazer, na verdade todos os recursos precisam ser criados, porque é claro que eu destruí a infraestrutura após finalizar a última aula, e aparentemente nós não temos nada de errado, é claro que nós podemos rodar aqui um Terraform Apply, sugiro que você faça isso, mas por enquanto eu não vou rodar porque nós precisamos trabalhar ainda nesses módulos, eu vou deixar pra nós fazermos isso na nossa próxima aula, tá? Eu espero que você esteja gostando, vejo você lá!