Então pessoal, continuando o assunto da aula anterior, nós vamos criar o nosso Load Balancer. Então nós teremos aqui um novo recurso, o Resource, e o tipo do recurso será um AWS LB de Load Balancer. O nome desse recurso pode ser AWS ALB. ALB porque é um Application Load Balancer. Nós temos também o Network Load Balancer, mas para o nosso exemplo nós vamos utilizar o Application. Então nós começamos aqui especificando o nome para esse load balancer e nós vamos utilizar o mesmo padrão onde nós colocamos o prefixo e depois eu vou colocar app-lb. Além disso, nós vamos dizer que esse load balancer não é interno, então nós queremos expor esse load balancer através da internet para que os nossos usuários, os nossos clientes acessem aqui a nossa aplicação e nós vamos também dizer que o tipo desse load balancer, como eu já mencionei, é do tipo application e não do tipo network. Além disso, nós vamos também associar com security groups, então além de fazer a associação com as nossas instâncias, nós podemos também associar security groups com os nossos load balancers, onde nós especificamos quais as portas que podem ser acessadas e por quais IPs. Aqui no nosso exemplo eu vou colocar os mesmos security groups que nós estamos utilizando para o nosso cluster, mas na vida real com certeza você vai ter aqui algo completamente diferente, você vai ter security groups para as suas instâncias, onde você vai por exemplo, expor a porta 80, mas você não vai expor a porta 80 para todo mundo, você vai expor a porta 80 somente para o load balancer, por exemplo. Já aqui no load balancer, você vai ter outro security group, onde de fato você vai expor, aí dependendo da situação, a porta 80 para todo mundo, assim como nós vamos ter aqui no nosso exemplo. Mas para simplificar, estou criando somente um único Security Group e associando tanto a Load Balancer como as instâncias diretamente. Mas não é nenhuma recomendação que você faça isso em produção, claro. Nós precisamos também especificar a subnet, onde nós teremos esse load balancer, e nós vamos dizer aqui o seguinte, eu vou colocar um enable deletion protection igual a false, para permitir a exclusão depois, já que nós estamos criando somente o load balancer para teste, e já deixo aqui já avisado que este recurso é um recurso caro, tá? Então, se você deixar aí esse load balancer por muito tempo rodando aí na sua conta, com certeza você terá uma surpresa negativa ao final do mês, então eu recomendo que você crie rapidamente, teste, verifique que está funcionando e logo em seguida já exclua para não ter o risco de você esquecer de destruir sua infraestrutura. Beleza? Vamos colocar aqui tags também, nós vamos colocar a tag name. Então, temos aqui já o nosso load balancer, porém nós precisamos, para fazer isso funcionar, precisamos de um target group. Então, o load balancer vai distribuir o tráfego para um target group, para um grupo específico de máquinas. Assim como nós temos o nosso auto-scaling group, agora nós teremos um grupo de máquinas, um cluster que será o target do nosso load balancer. Então vamos lá, nós vamos então especificar aqui este novo resource, o tipo dele é AWS LB target group e nós vamos colocar aqui app.tg. slb target group e nós vamos colocar aqui app.tg. Inclusive, deixa eu já alterar também aqui o nosso, aqui do nosso recurso para app underline lb, tá? Para seguir esse padrão. Nós vamos colocar um nome também para o nosso target group, então app.tg e aqui nós vamos colocar a porta através da qual nós vamos nos comunicar com o nosso target group, que é a porta através da qual nós vamos nos comunicar com o nosso target group, que é a porta 80, a comunicação será feita através da porta 80, já que nós estamos trabalhando com uma aplicação web, não estamos trabalhando aqui com HTTPS, mas com HTTP. Por isso, o protocolo, claro, é HTTP e nós vamos colocar aqui HTTP. Além disso, nós precisamos também de especificar a VPC ID, mas nós não temos a VPC ID aqui nas nossas variáveis, portanto nós precisamos de criar uma variável VPC ID que será do tipo string. Depois nós passamos aqui essa VPC ID, mas por enquanto vamos manter dessa forma e vamos só referenciar ela aqui, VPC ID. Deixa eu só formatar. E agora nós precisamos também passar parâmetros de health check para que o load balancer saiba quando uma instância está saudável ou não e para que ele direcione simplesmente os requests para as instâncias saudáveis. Então eu vou pegar todo o trecho aqui de health check e nós não vamos perder muito tempo. Eu já falei um pouquinho de health check e nós não vamos perder muito tempo, eu já falei um pouquinho sobre health check, eu recomendo que você dê uma pesquisada para você entender melhor um pouco como funciona, mas não tem muito segredo, ele vai verificar no path raiz, então nós poderíamos colocar aqui qualquer path para ele fazer essa verificação, então se você está rodando por exemplo uma web API, você pode colocar ali um path exclusivo para health check, onde a sua API vai retornar 200 se estiver tudo ok ou vai retornar falha caso alguma coisa estiver fora do ar e você pode referenciar aqui no path além disso, o matcher é 200 para representar que será considerado saudável uma máquina que retornar 200 quando houver essa consulta no pef no nosso caso raiz perfeito então temos aqui agora o nosso chefe ok e por fim nós vamos especificar as tags tá então nós temos aqui já a nossa tag name especificada e agora nós precisamos de listener tá então nós geralmente temos um listener para cada uma das portas que nós queremos expor. Nós queremos expor, no nosso caso, simplesmente a porta 80, mas, no mundo real, geralmente nós expomos também a porta 443, que é a porta para HTTPS, a porta para comunicação segura. Para o nosso exemplo, novamente, utilizaremos somente a porta 80. Vamos lá, o recurso aqui é o AWS LB Listener e nós chamaremos esse recurso de App LB Listener. Nós vamos apontar para o nosso load balancer que acabamos de criar, nós vamos colocar aqui novamente a porta e o protocolo, tá? Beleza, e nós vamos colocar aqui qual que é a ação default. Então, essa ação default aqui diz o que nós vamos fazer quando esse listener receber alguma solicitação na porta 80 através do protocolo HTTP e nesse caso ele vai simplesmente encaminhar para o nosso target group. Agora, uma dúvida que pode surgir é a seguinte. Bom, nós temos aqui o nosso target group, mas nós não estamos falando quantas instâncias farão parte desse target group, quais serão essas instâncias e nada do tipo. É porque nós faremos a associação desse target group com o nosso auto-scaling group. Então, nós podemos ir aqui no nosso auto-scaling group, deixa eu encontrar aqui, auto-scaling policy, auto-scaling group e nós podemos utilizar aqui o Target Group ARN, ARNs, os ARNs dos nossos Target Groups, e nós podemos simplesmente referenciar aqui o Target Group. E agora o que acontece é que nós vamos... esses dois grupos estão relacionados, tá? Então sempre que uma nova instância for adicionada ao nosso Auto Scaling Group, essa instância também será adicionada ao Target Group do Load Balancer. E a mesma coisa quando uma instância for removida, também será removida lá do Target Group do Load Balancer. Então, simples assim. Foi bem simples nós relacionarmos as duas coisas. E eu acho que é isso, as alterações que nós precisamos fazer aqui, tá? Vamos voltar aqui no nosso main, evidentemente nós vamos ter um erro aqui no nosso módulo raiz, porque nós precisamos passar agora a VPC para dentro deste módulo de cluster, mas para isso nós precisamos expor a VPC aqui nos outputs do nosso módulo de network, então vamos dar um output aqui, Vpcid, beleza? E aqui o value será ws vpc, vpc que é o nome do nosso recurso, e vamos colocar id. Beleza? Agora nós já temos disponível aqui dentro. Então, vpcid é igual a Module Network VPC ID. E eu acho que agora nós temos aqui já a nossa infraestrutura com load balancer e tudo mais funcionando. Mas é claro que nós precisamos testar isso. Então, nós vamos rodar aqui Terraform. Plan, só para validar se tudo está ok está dando um refresh aqui no state beleza temos aqui uma atribuição incorreta assim, deixa eu verificar aqui na nossa associação entre target group e auto scaling group é é claro nós precisamos do ARN preciso colocar aqui o ARN beleza terraform plan vamos aguardar aqui que seja dado refresh no state novamente e vamos torcer para que tudo funcione aparentemente tudo está ok e agora chegou a hora de nós darmos aqui um Apply. Então, auto-approve e agora até esse Load Balancer ficar de pé, ficar disponível, demora um pouquinho, então novamente eu vou pausar a gravação da aula e quando finalizar eu volto para mostrar aqui para vocês o que aconteceu. Todos os recursos foram criados com sucesso, como nós podemos observar aqui no log do Terraform Apply. E agora nós vamos navegar até o console da AWS, nós temos aqui as nossas instâncias, aparentemente tudo certo, tudo ok. Se nós descemos um pouquinho, nós teremos acesso ao nosso Load Balancer. Nós podemos observar aqui que o Load Balancer foi criado, o estado está como ativo, e o nosso Target Group aqui também foi criado, tá? Esse Target Group é específico para o Load Balancer, e temos aqui um Target Health. Nós podemos observar que é este nó específico, ou não, né? Vamos dar aqui um refresh novamente. Aparentemente está desatualizada aqui essa tela, deixa eu abrir aqui novamente e verificar se nós temos targets. Temos os dois targets aqui, estão health, então provavelmente aqui é um teste que eu estava fazendo anteriormente, mas nós temos as duas instâncias aqui dentro. Nós temos também o nosso auto-scaling group, ok? Se nós abrirmos aqui, nós veremos a associação aqui com o nosso Load Balancer. Então, temos aqui Load Balancing e temos Load Balancer Target Group. Beleza? Nós podemos observar as atividades aqui. Temos três atividades. Então, nós temos aqui a inicialização das nossas duas instâncias e temos a atualização dos nossos Target Groups lá do Load Balancer. Então, o Auto Scaling Group também atualiza o target group, como eu já havia explicado anteriormente. Agora nós vamos testar. Então, vamos aqui abrir load balancer. Eu vou abrir aqui full cycle app lb. Nós temos aqui a associação de um IPv4. Temos aqui o nosso listener, tá? E uma coisa que eu esqueci de mencionar é que nós podemos associar um Elastic IP ao nosso load balancer, tá? Então, se nós tivéssemos aqui ainda o Elastic IP, eu poderia descomentar aquele recurso e fazer associação com esse load balancer. Mas nós podemos utilizar também aqui o DNS, é só para você saber que isso é possível caso você queira que o seu load balancer esteja sempre associado ao mesmo IP. Então, eu vou pegar aqui o DNS e agora eu vou acessar o HTTP, tem que ser um protocolo HTTP, e vou acessar aqui o nosso load balancer e aqui nós podemos verificar que já está havendo o roteamento, nós estamos recebendo a informação de uma das nossas instâncias, a instância 34, 219, 242, 192. O interessante é que se eu der um refresh, nós temos ainda, vamos dar aqui um refresh novamente, e agora sim, agora eu já posso visualizar aqui o IP de uma outra instância, então se eu continuar dando refresh aqui, a cada momento eu vou ter o tráfego sendo direcionado para uma máquina diferente, tá? Então, à medida que eu vou dando refresh, cada vez o tráfego está sendo distribuído para uma máquina diferente, porque é utilizado aqui o algoritmo de RouteRob, então é intercalado, tá? Cada uma das máquinas vai receber uma requisição e dessa forma nós já temos aqui já a nossa aplicação funcionando, já temos um sistema distribuído e a ideia não era ensinar sobre AWS, mas acaba que simplesmente com esses exemplos já deu para você entender vários serviços que a AWS oferece, inclusive todos esses conceitos que eu passei, todos esses recursos que eu criei, você precisa conhecê-los caso você queira tirar uma certificação AWS, e eu acho que simplesmente com essas aulas aqui já deu para você conhecer recursos suficientes para criar uma aplicação web, por exemplo, ou algum worker que seja funcional, uma aplicação distribuída e também já dê até algumas dicas de rede e de segurança. Eu espero, então, que você tenha gostado e vejo você na nossa próxima aula.