Bom pessoal, na aula de hoje nós vamos refatorar o nosso projeto, uma vez que nós criamos ali vários recursos dentro do nosso módulo de cluster, porém todos os valores que nós utilizamos foram valores hardcode, e muitos daqueles valores são valores muito específicos, onde cada aplicação vai ter uma necessidade diferente e vai precisar customizar esses valores, então é interessante nós deixarmos os nossos módulos bem customizáveis, permitir que eles possam ter valores customizados. Nós vamos então dar uma olhada aqui no nosso arquivo main.tf e tentar identificar alguns desses valores. É claro que eu não vou customizar todos esses atributos, não faz sentido. Vou pegar alguns principais só para nós termos como exemplo, mas eu recomendo que você também analise por si mesmo e tente correlacionar com algum caso específico que você esteja trabalhando lá na sua empresa e veja se faz sentido deixar algum desses valores aqui como variável, algum dos valores que eu não colocar como variável. Como por exemplo, nós temos aqui o nosso de userdeira. como por exemplo, nós temos aqui o nosso UserData e esse UserData, ele possui um valor que claramente deve ser customizável claramente, cada aplicação vai ter uma necessidade diferente aqui por exemplo, nós estamos instalando o Nginx estamos habilitando o serviço, inicializando o serviço estamos sobrescrevendo o nosso arquivo index.html mas é algo extremamente específico do nosso use case, do nosso exemplo. Cada aplicação vai ter uma necessidade diferente, vai precisar de packages diferentes, vai precisar de serviços diferentes, vai precisar de inicializar a sua aplicação de uma forma diferente. Então, claramente, o nosso use case é algo que deve ser passado como uma variável, verdeira é algo que deve ser passado como uma variável, que deve ser um argumento que o nosso módulo raiz, por exemplo, é quem deve informar este valor. Por outro lado, nós temos aqui o nosso image ID, que no nosso caso é uma imagem específica, uma imagem da AWS, Linux, que nós estamos utilizando aqui para o nosso exemplo. Ela é elegível a fitia, então por isso que nós escolhemos ela. Obviamente, esse daqui é um valor que pode ser customizado, às vezes nós temos uma aplicação que ela precisa rodar no Linux, por exemplo, ou nós temos ali um time que prefere trabalhar com uma distribuição específica do Linux por algum motivo, então faz sentido também colocar esse image ID como sendo uma variável, tá? Por outro lado, nós poderíamos pensar em manter um padrão, uma consistência entre todos os nossos times e todos que fossem utilizar este módulo deveriam utilizar essa imagem. Sabendo que todas as aplicações são compatíveis com Linux e elas podem utilizar essa imagem. Então poderia ser uma forma de nós evitarmos que imagens que não foram verificadas, imagens que possuem algum problema de segurança, que elas sejam utilizadas, tá? Para o nosso caso, eu vou manter hardcode mesmo, mas eu já dei aqui alguns motivos pelos quais nós poderíamos deixar esse valor customizável. A mesma coisa para o tamanho da instância, tá? Então, pode ser que existam aplicações que requerem uma utilização maior de recursos. Mas, como nós estamos trabalhando com o Scaling horizontal, nós estamos escalando a nossa aplicação horizontalmente, ou seja, adicionando novas instâncias ao invés de aumentar a quantidade de recursos de uma única instância, às vezes faz sentido também nós mantermos esse P2 Micro como sendo o nosso Instance Type. Dessa forma nós garantimos que as aplicações vão utilizar uma instância pequena, com poucos recursos, mas sempre que precisar ela vai adicionar novas instâncias e dessa forma nós garantimos o uso mais eficiente dos nossos recursos. Uma vez que nós não vamos utilizar uma instância gigantesca, muito cara, e às vezes nós estamos utilizando simplesmente 20% dos recursos daquela instância gigantesca, muito cara, e às vezes nós estamos utilizando ali simplesmente 20% dos recursos daquela instância, tá? Então se nós mantermos uma instância menor, nós garantimos ali o controle de uma forma mais granular dos nossos recursos e é por isso que também eu vou deixar aqui o nosso Instance Type como sendo um valor fixo, tá? Temos outros recursos aqui, Type Specification, não vou mexer, network interfaces, vou continuar aqui atribuindo um public IP address e vou também continuar atribuindo o security group ID, que no caso nós já estamos recebendo como uma variável, tá? Então, para o nosso Cloud Stakeplate, eu acho que faz mais sentido nós customizarmos simplesmente o nosso user beira e é por isso que agora eu terei aqui uma nova variável então teremos variable userData o tipo é string e aqui eu vou considerar que esse valor em string ele não estará encodado em base64, será ali em plaintext e é por isso que eu vou simplesmente substituir essa parte aqui e vou deixar a nossa função base64 em code. Então, nós teremos agora o var user data. Perfeito. Agora, nós temos as nossas policies de auto-scaling, tá? E aqui nós temos coisas que nós podemos customizar também. Nós temos, por exemplo, o nosso desired capacity, min-size e maxSize, que definitivamente nós deveríamos customizar, tá? Então, vamos inclusive criar aqui já essas variáveis. Nós poderíamos criar um objeto complexo para definir esses valores, mas eu acho que faz mais sentido nós criarmos aqui eles independentes, tá? Então, desire de capacity, o nosso tipo aqui é o number. Number, beleza. Nós teremos agora o min size e o max size. Então, vamos colocar aqui min size. E agora, o max size. Basta nós alterarmos aqui Var Desarque Capacity Var Min Size Opa, coloquei Mark Size, Min Size E agora o Var Mark Size Beleza, já temos aqui o nosso Auto Scaling Group Já configurado Eu acho que essas três opções aqui São as opções que nós devemos customizar Agora nós temos aqui as nossas policies E novamente nós temos aqui Uma oportunidade de customização bem interessante, como por exemplo o scaling adjustment. Então às vezes nós temos uma aplicação seja inicializada e pra que então ali os health checks eles sejam também iniciados tá então nós vamos aqui a permitir a customização desses dois argumentos nós teremos então var scaling adjustment e teremos var cooldown. Vamos criar as variáveis. Variable. E que eu terei, deixa eu pegar aqui o nome. Scaling adjustment and cooldown. Mas aqui para esse caso específico eu vou criar uma variável do tipo objeto, até para que a gente tenha um exemplo de uma utilização desses tipos mais complexos. Então eu vou criar um objeto onde nós vamos receber o scaling, adjustment, o cooldown e o threshold também, que eu achoar que a única métrica utilizada será a CPU Utilization. Claro que é muito comum nós utilizarmos também Memory Utilization ou tráfego, o Network In e o Network Out, porém, para este exemplo eu vou manter aqui como única opção o CPU Utilization. A única coisa que nós vamos poder customizar é o Threshold. Então nós poderíamos definir em uma aplicação que 80% será o nosso threshold, será o nosso limite de utilização do cluster e depois disso nós precisamos subir uma nova instância, por exemplo. Então esse K-Line aqui, ele será também uma variável. Vamos colocar aqui var threshold. Beleza. Nós fizemos isso para o scale out, mas nós temos exatamente as mesmas coisas para o nosso ScaleIn. Então, nós precisamos aqui pegar esses dois valores, var ScaleInAdjustment, e atribuir aqui também para o nosso AutoScalingPolicy, mas nós precisamos diferenciar. Então, aqui nós vamos ter primeiro ScaleIn, já que nós vamos trabalhar com objeto complexo, tá? Vai ficar um pouco mais claro quando eu criar a definição das variáveis, então nós teremos var scale in, scale adjustment, var scale in, cooldown e var scale in, threshold. Perfeito, nós teremos agora scale out, tá? Nessa parte nós teremos o scale out, vamos alterar aqui também o cooldown, beleza, Agora, ScaleOut, tá? Nessa parte nós teremos o ScaleOut. Vamos alterar aqui também o CullDown. Beleza. E a mesma coisa aqui para o Threshold. Agora sim, vamos lá. Vamos criar aqui primeiro o nosso ScaleIn. A nossa variável ScaleIn. Beleza. E o tipo agora será um objeto. um objeto onde nós teremos em primeiro lugar o scaling adjustment, que será do tipo número, numérico, nós teremos em seguida o nosso cooldown, será também do tipo numérico, number, e por fim nós teremos aqui o nosso threshold, que também é um número, tá? Ali está como string, mas nós temos o parse automaticamente, nós podemos colocar aqui como sendo number, pra esse caso. Beleza, temos aqui o nosso scale in, mas nós precisamos exatamente aqui da mesma estrutura para as nossas regras de scale out. Beleza, nós já temos aqui já as nossas policies já customizáveis. Claro que, novamente, poderíamos colocar metric name, namespace, tudo isso poderia ser customizáveis claro que novamente poderíamos colocar metric name, namespace tudo isso poderia ser customizável mas vamos manter mais simples aqui customizando somente os valores beleza aqui nós temos o nosso load balancer, temos o nosso target group com as configurações health check que também poderiam ser candidatos aqui a customização claro que o nosso path também é algo bem interessante de ser customizado configurações de health check, que também poderiam ser candidatos aqui à customização. Claro que o nosso path também é algo bem interessante de ser customizado, mas deixaremos aqui dessa forma, tá? Porque dessa forma aqui atende vários cenários, diversos cenários são atendidos por essas configurações. Então, o nosso cluster agora já está da forma como nós gostaríamos, tá? Nas últimas aulas nós não mexemos aqui muito no network, eu acho que já está legal nós podemos manter dessa forma uma sugestão aí que eu faço que eu deixo como exercício é talvez agregar a parte de security groups, tá? Já que esses security groups aqui, eles não estão sendo utilizados diretamente nesse cluster, tá? Nós estamos simplesmente expondo como output esse security group e depois referenciando o nosso cluster claro que esse security group aqui pode ser considerado como main security group onde ele vai ser utilizado ali por diversas razões, em diferentes recursos mas é interessante deixar esse security group sendo criados de acordo com os recursos que serão utilizados, então por exemplo, nós temos aqui a exposição da porta 22 e não faz sentido nós expormos a porta 22 e atribuirmos a Security Group, por exemplo, para um Load Balancer. Para que nós vamos expor a porta 22? Para nós acessarmos o SSH através de um Load Balancer. Então, não faz muito sentido e eu até comentei que o ideal seria termos security groups diferentes para o load balancer e para as máquinas virtuais. Mas, novamente, a título de simplificação, vamos deixar dessa forma, tá? Então, perfeito, nós temos aqui novas variáveis que nós adicionamos. Agora chegou a hora de nós, de fato, alterarmos aqui o nosso módulo raiz, né? O nosso módulo raiz para passar todos esses valores. Então, agora eu vou passar aqui o nosso userData e eu acabei perdendo aqui o nosso userData, mas é claro que o Git vai nos ajudar, tá? Então, eu vou pegar aqui toda a definição, se eu conseguir copiar. Então, vamos copiar aqui, changeLines, beleza? Deixa eu voltar aqui para dentro Agora sim Beleza Agora nós temos aqui o nosso user data Deixa eu só colocar aqui A mesma linha, perfeito Vamos agora passar aqui o nosso Desire de capacidade, que no nosso caso vai ser 2 O nosso min size 1 O nosso max size Agora ele é 3, claro que normalmente esses valores poderiam ser variáveis aqui dentro do nosso módulo raiz mas vou deixar aqui por enquanto como valor hardcode, tá? Pra gente ir trabalhando e refatorando passo a passo. Agora nós precisamos das nossas policies, né? ScaleIn esse ScaleIn aqui eu vou fatorando passo a passo. Agora nós precisamos das nossas policies, né? Scale in. Esse scale in aqui, eu vou pegar de uma variável já diretamente, tá? Scale in, porque é muito mais fácil nós atribuirmos por variável aqui. E eu vou também pegar aqui o nosso scale out, como sendo var scale out. Beleza? E aqui eu mantive como uma variável até para a gente ver como funciona a declaração dele no tf vars porque nós eu acredito que nós não tínhamos visto isso ainda então eu vou definir aqui primeira variável scale1 que será do tipo e nós podemos inclusive copiar aqui das variáveis do nosso cluster porque nós precisamos dessas variáveis no nosso módulo raiz. E a definição delas deve ser exatamente igual. Beleza? E agora nós vamos colocar as definições, tá? Então nós podemos colocar aqui scaleIn e ele inclusive já nos ajuda com o autocomplete, tá? Então a estrutura aqui é semelhante à estrutura de um JSON. Nós vamos colocar 60 no nosso cooldown. Aqui nós precisamos do threshold. O scaling é quando nós estamos diminuindo a quantidade de instâncias. Então nós vamos colocar o threshold como sendo 20. E o scaling adjustment, menos 1. Agora nós teremos uma estrutura bem semelhante para o scale out. Então vamos colocar aqui scale out. O nosso cooldown permanecerá o mesmo. O nosso threshold aqui será 60 podemos mudar aqui para 70 e vou colocar o keylinheadjustment para mais um então toda vez que nós chegarmos a 70% de utilização nós adicionamos uma nova instância ao nosso cluster e beleza, aparentemente tudo já está ok nós não temos nenhum erro aqui na definição do nosso cluster. Agora, claro, nós precisamos verificar se tudo está funcionando, rodando um Terraform plan. Vamos verificar se nós não teremos nenhum erro aqui. E beleza, eu não tinha nenhum recurso criado na minha infraestrutura, havia destruído a infraestrutura na aula anterior, e agora nós temos 20 recursos para serem adicionados e aparentemente nenhum erro, tá? Eu não vou dar aqui agora o Apply, mas eu sugiro que você rode aí, que você verifique se as alterações que você fez estão todas corretas e estão sendo refletidas na sua infraestrutura. Perfeito? Espero que você tenha gostado. Vejo você na nossa próxima aula.