Olá pessoal, sejam muito bem-vindos a mais uma aula. E hoje nós iremos falar sobre um dos conceitos mais importantes em Terraform, que é o conceito de estado. Bom, quando nós rodamos o comando terraform apply pela primeira vez, nós ainda não teremos esse arquivo terraform.tfstate. Então o Terraform entende que nós estamos criando uma infraestrutura do zero, que aqueles recursos que nós definimos nos arquivos de configuração, eles ainda não existem. Então o Terraform provisiona todos aqueles recursos. Após esse provisionamento, é criado este arquivo localmente aqui, chamado terraform.tfstate, com todas as informações da infraestrutura que foi criada. Então nós temos, por exemplo, todos os outputs dos nossos arquivos de configuração, nós temos os recursos de fato, você pode observar aqui, por exemplo, que nós temos um recurso Managed, que significa que esse recurso é gerenciado pelo Terraform, nós temos que o tipo dele é um local file, o name que nós especificamos é exemplo, temos o provider e temos aqui os atributos dessa instância, os atributos desse recurso criado, tá? Tem tudo aquilo que o Terraform precisa para identificar aquele recurso no mundo real, para identificar aquele recurso real provisionado na sua infraestrutura, tá? Seja em cloud, seja on-premises, seja lá onde for. Beleza? Aqui nós temos o ID, por exemplo, então tudo aquilo relacionado àquele recurso está definido aqui neste arquivo tfstate, nós temos por exemplo aqui também o random patch, temos o nome que nós especificamos, meu patch e temos o id do nosso recurso, temos o id desse valor aleatório que foi gerado no momento em que nós declaramos, definimos esse recurso pela primeira vez dentro do nosso arquivo de configuração. Bom, por default, no momento em que nós rodamos novamente em Terraform Apply, e ele identifica que já existe esse arquivo terraform.tf.stage, por default, nós podemos mudar esse comportamento, mas ele vai fazer um refresh desse stage. Ele vai verificar a nossa infraestrutura, de acordo com os identificadores desses recursos, ele vai verificar se todas essas configurações, se todos esses atributos permanecem os mesmos. Então imagina que você criou uma máquina virtual na AWS, provisionou através do Terraform, e agora você roda o comando Terraform Apply novamente. Neste momento, o Terraform vai ir até a AWS, vai acessar esse recurso específico, então ele sabe como identificar essa instância, ele tem o ID dessa instância que está salvo aqui nesse TF State, e ele vai carregar todas as configurações novamente para garantir que o estado está de acordo com a infraestrutura. Então, esse TF State é como se fosse um inventário. Ele garante que todas as informações aqui da sua infraestrutura na vida real estão mapeadas neste arquivo e ele pode confiar neste arquivo. Bom, mas aí você pode pensar, se todas as vezes ele faz esse refresh porque que nós precisamos de um pf stage bom primeiro que o terraform ele precisa ter um identificador daquele recurso então novamente vamos dar o exemplo da máquina virtual você criou uma máquina virtual você provisionou uma máquina virtual através de um arquivo de configuração. Aqui no arquivo de configuração, a única coisa que você especificou, por exemplo, foi a imagem que você quer utilizar e o capacity dessa máquina. E aí o Terraform foi lá e criou essa máquina virtual e um ID foi gerado para essa máquina virtual. O que o Terraform fez? Ele salva esse ID dentro do arquivo terraform.tfstate para que da próxima vez ele saiba qual é a máquina virtual que está mapeada para aquele recurso específico. Caso contrário, caso ele não tivesse salvado esse ID, como ele poderia fazer esse mapeamento? Porque às vezes você pode ter ali 10 máquinas virtuais com a mesma imagem, com a mesma configuração, mas ele não sabe qual é a máquina virtual que corresponde àquela instância específica, que corresponde àquela declaração específica daquele recurso. Ele precisa de ter este mapeamento. E um outro motivo para que haja esse TF State aqui na nossa máquina, no nosso projeto, é por questões de performance. Então, existem muitos cenários em que nós estamos provisionando muitos recursos na nossa infraestrutura, nós estamos provisionando recursos em diferentes cloud providers e dar um refresh vai demorar muito tempo, pode consumir muito tempo. Então, nós temos uma forma de melhorar a performance que é pedindo para que o Terraform não faça esse refresh, tá? Pedindo para que o Terraform confie que o estado que está nesse arquivo já é o estado atual, que não houve um desvio de configuração, que ninguém alterou manualmente, tá? Então, nós podemos confiar nesse TF State aqui, e o Terraform simplesmente vai considerar esse arquivo como sendo a fonte da verdade. E bom, neste caso, para nós conseguirmos utilizar o tfstate sem esse refresh é muito simples. Nós podemos simplesmente dar um Terraform plan ou apply. Então, esta opção se aplica tanto ao plain quanto ao apply, nós podemos colocar aqui refresh igual a false, tá? Deixa eu verificar se é isso mesmo, beleza. Então, se nós utilizarmos essa configuração, nós garantimos, né, ou melhor dizendo, se nós utilizarmos essa opção, nós garantimos que não vai haver o refresh e com isso nós ganhamos em performance. Beleza? Então nós temos um motivo de nós termos esse TF State aqui na nossa máquina. E agora você já pode ter imaginado que ter um TF State local pode ser um problema. Então imagina que nós estamos trabalhando com um time de 10 pessoas e todo mundo está trabalhando na mesma infraestrutura. Todo mundo precisa fazer alterações nessa mesma infraestrutura. Cada um ter esse arquivo tfstate na sua máquina pode gerar inconsistências. Então eu posso, por exemplo, estar trabalhando aqui neste projeto, fazer uma alteração, dar um terraform e apply, mas tem uma outra pessoa, um outro colega do meu time que também tem este projeto em sua máquina, ele também faz uma outra modificação e tenta dar um apply. Então, nós vamos ter inconsistências no nosso ambiente. E nós podemos ter problemas maiores, que é, por exemplo, nós executarmos aqui o nosso Terraform e apply simultaneamente. Nós podemos, inclusive, destruir a nossa infraestrutura sem querer. Por isso, existe um conceito muito interessante, muito importante nós entendermos, que é o conceito de Remote State. Então, ao invés de termos esse terraform.tfstate localmente, nós vamos salvar isto remotamente, por exemplo, lá no Amazon S3, que é um serviço de storage da Amazon. E todas as vezes que nós precisarmos de modificar o estado ou de consultar o estado da nossa infraestrutura, o arquivo de estado utilizado será este arquivo remoto. Então, nós vamos acessar remotamente este arquivo e nós vamos utilizar somente uma pessoa por vez pode utilizar este arquivo. Por quê? Porque também estes Remote States implementam o que nós chamamos de State Locking. Então, eles vão colocar um lock nesse arquivo para garantir que esse arquivo é acessado uma única vez simultaneamente. Não pode haver acesso simultâneo. Dessa forma, nós garantimos que não há inconsistência e todo mundo pode trabalhar em conjunto. Eu não darei um exemplo aqui agora de como nós podemos trabalhar com Remote State, porque ainda nós não falamos sobre AWS, nós não falamos sobre nenhum Cloud Provider, então eu vou deixar para falar sobre Remote State na nossa próxima sessão, onde de fato nós vamos trabalhar com Cloud Provider, que no nosso exemplo será AWS, mas se aplica também a outros Cloud Providers, então nós iremos trabalhar com o Remote State. Beleza? E bom, também é importante observar uma das coisas que impossibilita nós de trabalharmos com o TF State localmente, é o fato de que este arquivo não deve ser versionado. Então, se ele não é versionado, não tem como nós compartilharmos esse estado entre os nossos colegas de trabalho, tá? Porque esse arquivo não vai subir lá para o GitHub, por exemplo, e aí o meu colega não vai poder baixar este TF State conforme eu tenho aqui na minha máquina. Por quê? Porque nós podemos ter informações sensíveis aqui dentro. Então, imagina que você, novamente, criou uma máquina virtual, eu sempre dou o exemplo da máquina virtual porque é o exemplo mais simples de nós entendermos e é algo comum entre todos os cloud providers. Imagina que nós criamos essa VM, nós temos, por exemplo, um IP atribuído a essa VM, nós temos ali informações da nossa chave de acesso, para nós fazermos acesso SSH e ter essas informações no arquivo tfstate versionadas lá no nosso repositório, é interessante, porque qualquer pessoa pode acessar às vezes pode haver um acesso indevido dessas informações lá no repositório e aí nós temos a nossa infraestrutura comprometida então é por isso que aqui, por default, nós temos este tfstate ignorado do nosso versionamento. E é por isso que é essencial nós utilizarmos o Remote State para garantir a possibilidade de nós trabalharmos em time, nós garantirmos a colaboração entre várias pessoas, sem nós termos nenhum problema. Bom, dessa forma nós finalizamos o assunto sobre State. É um assunto muito importante, é essencial que a gente entenda isso E é essencial também que a gente utilize este conceito de Remote State Dificilmente você conseguirá trabalhar em equipe sem utilizar o Remote State Beleza? Eu espero que você tenha gostado Vejo você na nossa próxima aula