Bom pessoal, agora que nós já temos uma ideia de como funciona o Auto Scaling Group lá na AWS, nós vamos partir para a implementação. Dessa forma, nós vamos conhecer na prática como esse Auto Scaling Group funciona. Então, nós vamos acessar o arquivo de configurações principal do nosso módulo Cluster, que é o arquivo main.df, e nós vamos começar a trabalhar. Neste arquivo, nós especificamos aqui como as nossas instâncias devem ser criadas. Nós fazemos isso utilizando o resource do tipo AWS Instance e nós temos aqui a utilização do metadata ou do metaproperty count, onde nós especificamos a quantidade de instâncias. Quando nós trabalhamos com o Auto Scaling Group, nós precisamos especificar um template, porque esse Auto Scaling Group será responsável por, de forma automática, criar essas instâncias baseadas em alguma métrica e alguma Auto Scaling Policy. Então, o nosso primeiro passo é definir o nosso template, é dizer para o Auto Scaling Group como as instâncias devem ser criadas. E isso é muito simples, tá? O recurso que nós utilizamos para isso é o AWS Launch Template. Então, ao invés de nós especificarmos aqui um AWS Instance, nós especificamos o AWS Launch Template. Nós chamaremos aqui esse recurso de template. Agora nós vamos remover o count, que não faz mais sentido para nós. Nós temos aqui já um erro dizendo que essa propriedade não existe não é o AMI mas nós vamos utilizar aqui o image id para nós especificarmos a AMI a imagem nós iremos utilizar nós utilizamos essa propriedade image id beleza nós vamos utilizar aqui a mesma imagem o instance type continua o mesmo nós vamos utilizar aqui o t2 micro e agora nós não temos uma subnet id específica porque a ideia é que em um auto scaling group a gente possa criar máquinas, subir máquinas em diferentes subnets em diferentes subnets, em diferentes availability zones, então nós não especificamos essa subnet a equipe porém nós vamos utilizá-lo depois tá aqui nós temos a nossa bpc que eu tinha grupo beleza não temos erro aqui temos o nosso verdeira e as nossas tags então quando nós referenciarmos esplaux template lá no nosso alto estilo grupo nós iremos criar instâncias sempre com essas mesmas características, com essa mesma imagem, com essa mesma Instance Type, utilizando esses mesmos Security Groups, todas elas terão esse mesmo User Data e todas elas terão essa tag. Mas, na verdade, tem algumas alterações que a gente precisa fazer. Primeiro, já começando pelas tags. Aqui, quando nós utilizamos tags, na verdade, nós estamos aplicando essa tag ao recurso que está sendo criado. Então, nesse caso, estamos aplicando a tag ao próprio template, mas a nossa intenção não é fazer isso. A nossa intenção é aplicar essas tags às instâncias que estão sendo criadas pelo Auto Scaling Group. E para isso nós utilizamos Tag Specifications. Quando nós fazemos assim, Tag Specifications, de fato nós vamos aplicar essas tags às instâncias. Mas aqui nós precisamos fazer da seguinte forma. Deixa eu até dar um Ctrl Z aqui. Eu vou criar aqui Tag Specifications. Vou abrir esse bloco. Beleza. Deixa eu formatar aqui. E agora sim, temos tags. Agora nós não temos mais essa Count Index, mas na verdade nós não precisamos. Todas as nossas instâncias terão o mesmo nome, mas esse identificador aqui, esse sufixo, não é necessário para o nosso caso. Então vamos deixar assim. E agora nós vamos aplicar um filtro. não é necessário para o nosso caso. Então, vamos deixar assim. E agora nós vamos aplicar um filtro. Nós vamos colocar aqui resource type, porque nós queremos que seja aplicado simplesmente essas tags quando o nosso resource type for instanced. Então, nós vamos aplicar a todas as nossas instâncias. Beleza? Temos aqui tag specification. E agora nós precisamos fazer uma outra alteração Que é no próprio user data Nós podemos passar o user data Porém, essa propriedade aqui espera que a informação esteja encodada em base 64 Para isso, nós vamos utilizar então Uma função do próprio Terraform Que é o base64 encode Dessa forma aqui. E assim nós já não teremos nenhum problema, tá? O nosso projeto continuará funcionando exatamente da mesma forma. Por fim, nós precisamos fazer um ajuste de network, tá? Nós vamos especificar aqui network interfaces, por quê? Porque eu quero associar cada uma das instâncias criadas pelo nosso Auto Scaling Group com um public IP, com um IP público. Então, nós colocamos aqui true, beleza? E agora todas as instâncias criadas terão um IP público associado a ela. E por que eu estou fazendo dessa forma? Antes nós tínhamos um recurso específico para um IP. Nós tínhamos um IP estático que nós associávamos à nossa instância. Mas agora nós estamos criando várias instâncias. Nós não sabemos quantas instâncias nós teremos através do tempo. Então nós vamos utilizar mesmo um IP dinâmico associado a cada uma dessas instâncias. E isso não é um problema. Por quê? Porque mais pra frente nós iremos criar um load balancer que vai fazer a distribuição do tráfego para todas essas instâncias dentro desse auto-scaling group. E aí nós não precisamos nos preocupar em conhecer o IP address, o public IP address de cada uma dessas instâncias. Isso é por conta do próprio grupo de auto-scaling, tá? Mas nós veremos isso um pouco mais adiante. A questão é que nós já vamos associar um public IP a essas instâncias. E quando nós fazemos isso, quando nós especificamos network interfaces, nós teremos um probleminha relacionado a VPC Security Group. Porque quando nós fazemos isso, quando nós temos esse bloco, nós não podemos especificar essa propriedade aqui. Nós temos que especificar essa propriedade aqui nós temos que especificar security groups e precisamos aqui referenciar esse security groups aqui dentro, tá? Agora nós removemos aqui então, esse ajuste básico, beleza? Só para melhorar aqui nós vamos colocar um nome, tá? Nós vamos dar um nome para esse template que no nosso caso será simplesmente var prefix e nós vamos colocar aqui template, que no nosso caso será simplesmente var prefix, e nós vamos colocar aqui template, dessa forma. Então temos aqui o nosso nome, image id, tudo certinho. E agora nós de fato criaremos o nosso auto scaling group, então nós teremos aqui um outro resource, e o nosso resource será do tipo AWS Auto Scaling Group e nós chamaremos aqui de forma abreviada de ASG. Nós vamos dar um nome para esse recurso, então teremos aqui name, vamos especificar o nosso prefixo, var prefix, e aqui nós teremos ASG, simplesmente. Beleza? Vamos colocar aqui já o nosso desire capacity, que no nosso caso vai ser 2, o que significa que no momento em que nós criarmos o nosso AutoScreenGroup, nós já queremos que ele inicialize duas instâncias para nós. É isso que nós estamos dizendo aqui. Além disso, nós vamos especificar também o tamanho mínimo do nosso grupo, que no caso vai ser 1. Nós não podemos ter menos do que uma máquina virtual nesse grupo. Nós vamos especificar o max size, isso é importante para garantir que nós não teremos aí, por algum erro de configuração nas nossas políticas de auto-scaling, nós não escalarmos infinitamente, nós não criarmos muitas VMs e isso fugir do nosso controle. Então, nós podemos especificar o max size, que no nosso caso, para este exemplo, será 3. Além disso, nós teremos aqui algo interessante, que vai ser o VPC Zone Identifier. Então, nós vamos colocar aqui quais são as subnets, as subnets IDs, que nós teremos associadas a esse Auto Scaling Group. Então, a ideia é que esse Auto Scaling Group possa distribuir as máquinas virtuais através das nossas subnets. Dessa forma, a gente garante uma alta disponibilidade, porque cada subnet está em uma AZ diferente. Nós configuramos para que cada subnet seja criado em uma AZ diferente. Então, se nós tivermos um problema específico em um data center, nós ainda teremos as nossas máquinas virtuais rodando também em outras subnets que estão em outros data centers. E aqui nós podemos passar as nossas subnets. Nós vamos passar aqui var. Deixa eu verificar aqui qual é o nome da nossa variável. Temos aqui subnet id. O problema é que nós temos simplesmente uma subnet id aqui na nossa variável tá mas nós precisamos de uma lista então nós vamos colocar aqui lista e que nós temos subnet id e agora sim nós podemos referenciar subnet id beleza espero que tenha ficado claro essa parte está aqui novamente indica que nós queremos que as nossas VMs, que as nossas instâncias sejam distribuídas de forma igualitária entre todas essas subnets, IDs. Agora nós, por fim, precisamos dizer para esse Auto Scaling Group que ele precisa utilizar esse template aqui para criar essas novas instâncias. Então nós teremos aqui o nosso Launch Template. Teremos aqui o nosso launch template. Deixa eu pegar aqui o nome, porque o autocomplete não está me ajudando. Então, teremos aqui launch template, beleza? E aqui nós passamos o ID, e nós vamos passar aqui a AWS launch template, template ID, e vamos passar também a versão, tá? E nós temos aqui uma keyword especial que é a versão latest, porque nós podemos ter várias versões de um template, mas nós vamos utilizar aqui sempre a última versão. E beleza, dessa forma nós já especificamos o nosso auto-scanning group e o template que ele vai utilizar como base para criar todas as máquinas virtuais, todas as nossas instâncias. Agora vamos dar uma olhada aqui em variáveis, se está tudo certo, aqui nós já não precisamos mais desse tipo. Na verdade nós vamos deixar aqui, nós vamos depois criar novas variáveis, parametrizar isso, então por enquanto nós vamos deixar em InstanceCount, mas no momento nós não estamos utilizando, mas nós vamos deixar aqui porque nós vamos trabalhar com esse desired capacity, esse min-size, tudo isso será customizado. Aqui no nosso output, agora nós precisamos dar um jeito aqui nesse output, porque nós não temos mais essas instâncias, nós não temos acesso aos DNS, porque essas instâncias são criadas automaticamente e de acordo com as nossas regras. Então, nós não teremos acesso a esse output, nós não precisamos dele, nós vamos remover daqui. A questão é que nós temos aqui esse output sendo referenciado que nós vamos remover também. E agora nós temos aqui comentado o nosso Elastic IP, eu já expliquei então como nós vamos associar IPs públicos a essas máquinas virtuais. Nós estamos fazendo isso para que a gente consiga fazer um acesso via SSH. Nós precisamos desses IPs públicos, por isso que eu coloquei aqui esse Network Interfaces. Dessa forma, nós não precisamos mais desse Elastic IP. Então, eu vou remover esses dois recursos aqui, o Elastic IP e o nosso SSM Parameter, nosso Parameter Store, já que nós não temos mais necessidade desses recursos. Beleza, vamos dar uma olhada aqui em Outputs e aqui eu posso remover também o Output do nosso módulo raiz. Voltando no arquivo main.tf do módulo raiz, agora, claro, nós vamos ter um erro aqui, porque nós mudamos algumas coisas, né? O nosso source continua o mesmo, o prefixo o mesmo, porém, agora nós estamos falando de mais de uma subnet, e é por isso que nós não selecionaremos mais a primeira subnet, nós vamos escolher todas as subnets que nós estamos criando aqui no nosso projeto, tá? Então, se nós, no nosso arquivo de configurações, no nosso arquivo de variáveis, melhor dizendo, se nós colocarmos mais de um bloco, se nós criarmos mais de uma subnet, duas, três, quatro, cinco, nós iremos passar todas elas para o nosso cluster e todas essas subnets poderão ter máquinas virtuais, de acordo com a quantidade de máquinas que o nosso cluster terá, estará configurado para ter. Certo? O instance scout aqui nós não estamos utilizando, mas podemos deixar aqui. E agora o nosso security group ID, nós vamos manter esse único security group. Beleza, agora nós vamos verificar aqui se tudo está ok, tá? Vamos rodar terraform plan, terraform plan, já estava esquecendo, vamos esperar aqui que ele faça o planejamento, como eu destruí minha infraestrutura aqui, eu preciso criar todos os recursos, mas nós não tivemos nenhum erro até este momento, aqui nós podemos ver que o nosso Auto Scaling Group será criado com todas essas propriedades. Vocês podem observar aqui que existem vários atributos, mas nós setamos simplesmente aqueles mais importantes. Tem uma parte bem interessante de Health Check. Então, o nosso Auto Scaling Group também verifica se cada uma das instâncias está ok. Então, se acontecer algum problema com a instância, o serviço cair, alguma coisa estiver errada com uma das instâncias dentro daquele cluster, o nosso Auto Scaling Group vai identificar isso automaticamente, vai tirar aquela instância, vai derrubar aquela instância, tirar ela daquele grupo e vai subir uma nova instância. Então, temos também esse mecanismo de Health Check, e vai subir uma nova instância. Então, temos também esse mecanismo de health check, e nós podemos especificar o grace period, que é o tempo que nós vamos esperar as nossas máquinas se inicializarem antes de começar esse health check. Tem também uma outra propriedade muito importante, que é o cooldown, que eu acho que não está especificado aqui, mas que também nós podemos especificar. Enfim, nós temos muitos atributos, nós temos muitas formas de customizar esses Auto Scaling Groups, mas a ideia aqui, novamente, não é de tornar um expert nesses recursos da AWS, é simplesmente de mostrar o que nós podemos fazer com o Terraform, de dar alguns exemplos disso, mas eu sugiro que você dê uma conferida então aparentemente tudo está ok, eu vou rodar aqui agora o Terraform apply menos menos auto approve beleza e nós vamos verificar se isso vai funcionar a ideia é que a gente já tem o nosso auto scaling group, que nós tenhamos ali duas instâncias que que foi o nosso desired capacity, mas nós não iremos em nenhum momento fazer esse auto-scaling group, melhor dizendo, ele não fará o scale out nem o scale in ainda. Nós teremos ali sempre duas instâncias e nada vai acontecer, por quê? Porque nós não definimos as regras de escalabilidade então nosso grupo ele não sabe quando ele deve subir uma nova máquina ou quando ele deve dropar uma máquina nós não temos ainda essa informação nós estamos simplesmente criando o grupo com essas duas instâncias agora essas regras de escalabilidade nós criaremos nas próximas aulas aparentemente tudo aqui está ok, está dando certo, nós podemos navegar até o nosso console para nós vermos se os recursos já estão sendo criados. Nós vamos utilizar o serviço EC2, então toda essa parte também de auto-scaling está dentro do serviço EC2. Nós iremos então navegar até auto-scaling grupo aqui do lado esquerdo e que nós temos o nosso alto esquerdo grupo sendo criado tá nós podemos acessar aqui o site o sg temos o nosso deserto capaz de mínimo capacidade e máximo capacidade tudo ok com o nosso laudo em template com o nome que nós ficamos a última versão a network nós temos as nossas duas subnets, as subnets que foram criadas e, portanto, as as vezes associadas a essas subnets. Ainda não temos o load balancing, mas nós ainda teremos. Beleza, temos aqui o health check, como eu já expliquei. Perfeito. E é isso aí, aparentemente tudo está certo. Observando aqui a Actively, nós temos duas atividades, dois logs, dizendo que estão sendo iniciadas duas máquinas EC2, duas instâncias EC2. Por quê? Porque nós temos aqui uma solicitação para mudar o capacity de zero para dois. Então, quando o grupo foi criado, o capacity era 0, não tinha nenhuma máquina virtual, claro. Mas o nosso Desire de Capacity é 2 e por isso temos aqui esse Trigger que disparou essas duas atividades. Atividade para lançar uma máquina virtual e lançar a outra máquina virtual. Vamos voltar aqui no VS Code para verificar se terminou o provisionamento. Perfeito, terminou o provisionamento. Perfeito, terminou o provisionamento. Nós podemos aqui navegar até Instances, onde nós teremos acesso às nossas duas instâncias, que já estão rodando. Inclusive, nós podemos nos conectar a elas, porque agora nós temos um public IP address associado a esta instância. Então, vamos conectar aqui. Beleza beleza vamos dar um connect estamos inicializando a conexão e vamos aguardar aqui alguns segundos verificar se vai dar tudo certo perfeito agora nós podemos navegar até a pasta raiz onde nós temos opa na verdade eu jetei aqui errado vamos navegar cd onde nós temos aqui o nosso arquivo teste.txt, e nós vamos verificar se nós temos aqui essa informação. Então, get teste.txt, e aqui estão as informações que nós salvamos neste arquivo, que nós colocamos neste arquivo teste.txt, no momento em que nós inicializamos a nossa máquina. E o interessante disso é que não somente nessa máquina, mas nós também temos essa informação na nossa outra máquina virtual. Então, se nós nos conectarmos a ela, nós vamos verificar que esse arquivo também foi criado nessa outra máquina. Então, aquele user data, ele será utilizado em todas as instâncias que nós inicializarmos. Isso garante que o nosso cluster será consistente, terá consistência entre todas as máquinas virtuais. Vamos fazer aqui o mesmo. Já vamos usar um cat direto, um test.txt, onde nós temos também a mesma informação. Beleza? Então, eu espero que tenha ficado claro, eu espero que você tenha entendido a ideia desses auto-scaling groups, mas na próxima aula nós vamos nos aprofundar e nós vamos criar algumas policies, algumas regras de escalabilidade para que o auto-scaling, de fato, aconteça de forma dinâmica, de forma automática. Eu espero que você tenha gostado e vejo você na nossa próxima aula.