Beleza pessoal, então o repositório aqui está criado, vamos começar a montar aqui o nosso conteúdo. A primeira coisa que a gente vai fazer aqui é a criação de um arquivo Terraform, propriamente dito. Vai ser um código bem simples, só a gente conseguir poder fazer a demonstração então a gente está fazendo um source no módulo de EC2 está passando aqui um security group, uma subnet, um instance type está fazendo um instanciamento aqui também de um back-end eu criei previamente um bucket S3 na conta com esse nome. E aí dentro dessa região, que é a região aqui do Brasil, para a gente poder configurar esse back-end. Isso daqui a gente pode configurar via pipeline também, né? A gente consegue deixar mais dinâmico. Beleza, arquivo criado criado que mais que a gente vai fazer aqui né a gente vai começar a montar a estrutura do próprio dos próprios workflows então novamente a gente cria aqui o diretório ponto bitrub um outro diretório de workflow e aqui dentro a gente vai ter nosso arquivo de feature nosso workflow para main e a gente vai ter outros dois arquivos que vai ser um arquivo para CI de Terraform e também um arquivo para CD de Terraform legal os workflows vão ser bem parecidos com o que a gente já montou né então a gente vai basicamente aqui tem um workflow de feature baseado nas brancas feature fix onde a gente vai chamar o nosso workflow de CI e para main a gente vai ter aqui um fluxo com base no encerramento de um pull request desde que ele esteja com status de merged certo até aqui sem E aí, a gente vai ter o seguinte, né? Falando aqui de CI, eu vou repetir algumas coisas. Então, a parte de permissions, o meu trigger, que vai ser com workflow call. A gente vai ter dois inputs, que é o arquivo de settings e o nosso runner, e a gente vai ter aqui algumas etapas relacionadas à infraestrutura. Então, vamos passar um pouquinho por todas elas aqui. passar um pouquinho por todas elas aqui dentro do nosso job de CI a gente vai ter o que vai fazer um check out segundo step a gente vai parciar aquele arquivo de settings que a gente vai criar aí aqui vem já um item que a gente ainda não tinha visto que aí tá relacionado justamente com a etapa de identity provider que a gente criou no cloud provider né então aqui basicamente a gente tá utilizando uma action para gente conseguir fazer login a gente tá informando qual que é a região que a gente quer fazer login qual que é a role que a gente quer fazer login então essas informações elas precisam bater, precisam estar bem certinhas aqui a gente está capturando também via arquivo de settings qual que é o account id que a gente quer fazer login e aí a gente está pegando via github context qual que é o repository name, porque a gente se a gente for manter esse padrão de sempre criar as roles com o mesmo nome do repositório aqui no GitHub vai ficar um pouquinho mais fácil da gente enfim, ter um padrão pra gente conseguir saber ali a configuração exata que a gente faz a gente tá passando alguns outros itens aqui mais opcionais como para mascaramento né do account id tempo de tempo de a duração do toque né e isso a gente quer fazer algum tipo de tagging para a sessão onde a gente está fazendo o sumi role. Beleza, a gente configura aqui um terraform, então a versão do terraform também de forma customizável. A gente faz um terraform format para checar se está tudo identado bonitinho. Caso não esteja ele vai dar um vai mostrar que deu erro né mas ele vai continuar a gente não vai quebrar o workflow caso isso aconteça vai fazer um terra farm init que é fluxo de terra farm normal terra farm init terra farm validez terra farm plane e aí o plane é a mesma coisa Se estiver quebrando a gente vai continuar esse workflow nosso, tá? E aí quando a gente olha aqui pro... Dando tudo certo, né? A gente vai fazer aqui a abertura do PR Mantendo a dependência do primeiro job E aí quando a gente vier aqui pro... Segundo job pro segundo workflow, a gente vai executar esse segundo reusable, onde a gente vai ter algumas outras etapas, né? então o que a gente vai ter aqui dentro do nosso reusable de CD propriamente dito os inputs eles permanecem os mesmos a gente ainda precisa fazer o parser né porque a gente precisa de algumas informações para gente completar aqui as informações a gente vai fazer um login a gente vai instalar o terraform e como a gente tá fazendo um continue aqui caso de erro eu vou fazer novamente esse terraform plane eu acho que é mais prudente então se faz aqui o o terraform init terraform plane e caso de problema no plane dessa vez a gente vai quebrar porque a gente tá fazendo efetivando um deployment de fato né né? Legal. Bom, falando de arquivos de workflow é isso. O que ficou faltando a gente criar aqui? A gente precisa criar o nosso arquivo de settings, certo? Esse arquivo de settings vão ter algumas informações que a gente customizou ali no nosso reusable como a região, a versão do terraform, o account id que a gente quer e eu acho que é isso se tiver tudo certinho a gente vai conseguir executar com sucesso o nosso workflow. Um detalhe importante é que, se eu voltar aqui, muito provavelmente no ambiente de vocês, as primeiras execuções vão falhar. de vocês as primeiras execuções elas vão falhar tá nesse caso aqui a gente não não chegou a fazer nenhum push mas se a gente vê aqui nas configurações lembra que a gente mexeu aqui nas actions para a gente permitir que o nosso repositório aqui tanto fizesse criação de requests, quanto a leitura escrita aqui de permissões relacionadas a action. Se o repositório de vocês não estiver dessa forma, configurem aqui caso aqui esteja desabilitado é possível também fazer esse tipo de setup a nível de organization então se a gente vier aqui no usuário de vocês vai em organizations a gente consegue vir aqui em settings e a gente tem aqui o mesmo item relacionado a actions general e a gente configura aqui para também ter essas permissões de forma global. Beleza? Vamos voltar aqui para o nosso repositório. A gente não tem nada configurado aqui. vamos voltar aqui para o nosso repositório a gente não tem nada configurado aqui vamos comitar então todos esses arquivos Beleza, vamos ver se está funcionando bacana agora. Olha a nossa action aqui. olha a nossa action aqui o cycleinfra, tá certo ele não disparou nenhum workflow, vamos dar uma olhadinha no que pode ter e aí e aí e aí e aí e aí e aí e aí e aí e aí e aí e aí e aí e aí e aí e aí e aí e aí e aí e aí e aí e aí e o que fosse a gente muito e a gente mente então ele não se para o meu outro falou porque a gente tá disparando de fez o comitê que direto da mãe né a mãe não tá protegida nesse nesse caso vamos criar uma uma branca nova o nome aqui de um show setup certo pode alterar qualquer coisa que só pra gente nem me e vamos fazer também um terraforming fmt para deixar tudo indentado e aí Legal Vamos ver agora se en gente já tem a nossa action em execução, agora sim, ela entrou em execução, a gente consegue acompanhar aqui todos os nossos steps na primeira coisa que a gente vai conseguir validar aqui é a questão do assumir role então o que acontece ó da forma como a gente está fazendo ele está tentando fazer uma sumir role nessa conta nessa role nem aqui vamos dar uma olhadinha no nosso ambiente só se parece ser isso mesmo Roly, Concycle, Concycle CD sajpu sd E aí e ele deu um erro aqui falando o seguinte que ele não pode assumir essa role com o idc ele não está autorizado a realizar aqui um assume role with web identity né vamos dar uma olhadinha porque isso está acontecendo assumiu role with web identity Assume o olho e febre a gente. O olho que ele tá tentando assumir tá certo. Tá batendo certinho. Ah, beleza. A gente encontrou o problema, né? O que está acontecendo aqui? Ele está tentando fazer uma SumRoll, falou que não conseguiu, e aí quando a gente olha aqui o match, a roll está certinha, todavia, quando a gente olha o contexto que está configurado dentro dessa role, a gente tem aqui o ripple, a gente tem aqui a organization, então a organization está batendo. Quando a gente olha aqui o nome do nosso repositório, está diferente, né? O nosso repositório está com o nome de fullcycle-infra, enquanto que aqui está como full cycle cd vamos ajustar essa essa policy esse trust na verdade né vamos colocar aqui full cycle infra colocar aqui full cycle infra beleza, está atualizado como a gente não mexeu em nada no código a gente pode só fazer um rinran aqui e acompanhar novamente lembrando que pensando num fluxo corporativo essa configuração ela vai vir padronizada por alguma automação Então a chance de a gente errar nesse tipo de coisa aqui é muito baixa Agora já passou, então se a gente olhar aqui a gente já conseguiu fazer o nosso assumir role, a configuração de identity provider funcionou bacana né, a questão da tag que eu comentei com vocês, ele conseguiu fazer o format, o format passou bonitinho, porque a gente também rodou antes de executar o início vale de ti o plane que ele está falando que vai criar um recurso vai fazer a abertura agora do pr pra mim beleza é criado. A gente aprovando agora, a gente vai conseguir acompanhar. e aí e aí e aí e aí e aí e olha aqui as instâncias em um ano não tem nenhuma e aí e aí Na etapa de CD ele faz novamente uma Summary Role Faz a configuração do Terraform E aqui ele está rodando de fato o nosso upline e aí e aí e aí a beleza recurso criado vamos dar um refresh o que tá lá customizou aqui o nome até vizinha né até guineyme a máquina provisionada a tagzinha né, uma tag name, máquina aprovisionada é isso pessoal, aí assim, aqui ainda dá para fazer muita coisa né, então quando a gente pensa nos conhecimentos aí que a gente adquiriu ao longo das últimas aulas, dá muito bem, por exemplo, para a gente adicionar valores adicionais, de repente contemplar a gente criar, fazer actions como o Terraform destrói, o Terraform funciona de uma forma um pouco diferente, tirando a declaração dele ele já vai destruir o recurso, mas caso alguém queira fazer um destroy explícito, mantendo o código ali para algum tipo de histórico, é possível a gente fazer também. É possível trabalhar com workspaces de Terraform, se a gente achar que faz sentido. A gente consegue criar também arquivos de tfvars, se a gente quiser colocar no nosso workflow, aqui no nosso reusable workflow, para ler paths em específico de tfvars e fazer overwrite com o que a gente tá passando, aqui a gente não tá trabalhando com variável, né, é um código bem simples mas vamos supor que você tenha um ambiente de dev, omol e prod né, e aí você quer utilizar você quer, não, você com certeza vai utilizar security groups distintos, né, pra dev, pra omol e pra prod, dá muito bem pra gente fazer certeza vai utilizar security groups distintos né pra dev pro mod pro proj dá muito bem pra gente fazer utilizando arquivos diferentes né e a gente lendo de um lugar pré determinado para poder fazer essa configuração é aqui a mesma coisa quando a gente fala de account id a gente está trabalhando com uma única conta mas suponha que a gente tenha uma conta para dev e uma conta para produção mesma coisa, a gente poderia ter alguma coisa como, sei lá tipo aws dev prod e aí a gente teria a declaração das contas aqui e aqui então quando a gente fosse ler a gente saberia que o nosso output ficaria como algo como aws ou até aws account dev prod e a gente conseguiria AWS ou até AWS account dev prod, e a gente conseguiria fazer aqui também o assume role em contas distintas utilizando a nossa mesma pipeline eu acho que é isso que eu tinha pra mostrar pra vocês, espero que vocês tenham gostado espero que vocês tenham aprendido bastante coisa aí também esse é só o começo espero que vocês tenham aprendido bastante coisa aí também. Esse é só o começo, né? Para quem fosse aventurar aí dá para ver que a ferramenta é bem poderosa, dá para fazer bastante coisa. Mas pensando no que a gente mais utiliza aqui no dia a dia, acho que a gente conseguiu passar basicamente por tudo, né? A gente mostrou ali uma estrutura de workflow, de reusable workflow, passou um pouco por actions, falou de variáveis, secrets, a gente fez algumas customizações, né, de comportamento, então, eu acho que com isso daqui a gente já consegue ter uma boa cobertura de automações que a gente precisa fazer no ambiente. Valeu!