Bom pessoal, conforme prometido na aula anterior, nessa aula nós falaremos sobre Workspaces. E para nós entendermos Workspaces, eu gostaria de relembrar um conceito muito importante em Terraform, que é o conceito de Backend. Então, todo projeto em Terraform, ele precisa de um Backend. Ele está associado a um Backend, esse Backend pode ser local ou pode ser remoto, que é o caso do nosso projeto, onde nós estamos utilizando o S3 como Backend remoto. O do nosso projeto, onde nós estamos utilizando o S3 como back-end remoto. O importante de um back-end é que ele armazena o state, então o arquivo tf.state está dentro do nosso back-end, está relacionado ao nosso back-end. A questão é que todo back-end está também relacionado a uma workspace. Bom, aí você pode se perguntar, até agora eu nunca ouvi falar sobre workspaces, mas nós já criamos aqui um projeto, nós já criamos o nosso Backend, e aí, como que acontece essa associação? Bom, sempre que nós inicializamos um projeto, um Workspace Default, ele é criado, nós podemos verificar isso aqui, rodando o Terraform Workspace List, e nós veremos aqui que temos o Workspace Default, e esse é o Workspace selecionado, até porque nós temos somente ele. Então é por isso que nós ainda não vimos nada sobre o workspace, porque quando nós inicializamos o projeto, nós já temos ele em workspace e tudo vai acontecer nesse workspace. Bom, se nós quisermos ter mais de um state, ou seja, nós quisermos replicar a nossa infraestrutura de formas diferentes, através de diferentes ambientes, nós podemos então criar um novo workspace. Então nós vamos utilizar aqui o comando perform workspace new e criaremos um workspace chamado dev. Este comando demora um pouquinho porque ele vai trabalhar lá no nosso remote backend. Nós podemos verificar isso se nós navegarmos até o nosso S3. Eu vou dar um refresh aqui no nosso bucket. E agora nós temos aqui uma estrutura diferente, tá? Eu estou aqui na raiz do nosso bucket, agora nós temos essa pasta env, aqui dentro nós temos dev, que é o nome da nossa workspace, states, então nós temos o nosso terraform state, tá? E bom, nós veremos aqui que uma nova pasta será criada quando nós criarmos um workspace de prod. Então nós teremos agora aqui um novo backend e ao terminar de rodar este comando, nós vamos dar um refresh aqui no nosso bucket e aqui temos também o nosso diretório prod. Então agora nós temos dois states para o nosso projeto. Para nós verificarmos qual é o workspace selecionado no momento, nósamos aqui um Terraform Workspace Show, no nosso caso é o PROD, então todas as alterações que nós fizermos aqui, elas serão aplicadas nesse workspace de PROD. A questão é, como nós referenciamos aqui no nosso projeto ou mudamos o comportamento da nossa infraestrutura, mudamos ali propriedades da nossa infraestrutura de acordo com o workspace. A forma mais simples que nós temos é aqui, por exemplo, no nosso prefixo, nós utilizarmos uma variável. Ao invés de nós utilizarmos somente var prefix aqui, nós vamos utilizar agora terraform.workspace. Então essa variável aqui nos dá acesso ao nome da nossa workspace. Se nós estamos trabalhando com prod, agora o nosso prefixo será prod- e aqui o prefixo padrão, o prefixo definido nas nossas variáveis, beleza? Nós podemos copiar este carinha aqui para dentro do prefixo do cluster também, perfeito? E agora, se nós soldarmos terraform- plena, nós veremos que todos os nossos recursos agora terão esse prefixo de acordo com o nosso workspace. Então nós teremos aqui prod, vamos navegar aqui até o início, mais um pouquinho, temos aqui o nosso auto scaling group, e aqui nós temos sim, nós temos aqui o nome do nosso auto-scaling group, que é prod-fullcycle-asg, e o mesmo se aplica para as nossas policies, tanto de scale in quanto de scale out, e assim por diante. Então, somente utilizando esse carinha aqui, nós já conseguimos diferenciar o nome dos nossos recursos. É claro que isso daqui não é suficiente para a maioria dos cenários, né? Nós já vimos que o ideal é que o nosso ambiente de desenvolvimento tenha aqui um capacete menor, porque nós não precisamos de ter várias máquinas, várias instâncias rodando, então nós poderíamos ter aqui uma diferenciação desse desired capacity, esse minisize e esse maxize. Nós poderíamos estar utilizando aqui sempre esse workspace, né, fazer um, aplicar aqui uma expressão ternária, onde nós poderíamos ter aqui o seguinte, se o workspace for igual a dev, então considere 1, caso contrário, considere 2. Mas não é o ideal que a gente faça isso, já que nós podemos ter essa alteração para vários atributos e nós teríamos algo muito verboso, muito difícil de ser lido, e o problema ainda aumenta quando nós falamos de mais de dois ambientes. Para isso, nós podemos utilizar arquivos tfvars, arquivos de definição de variáveis diferentes. Então, ao invés de nós termos aqui um único terraform tfvars, nós poderíamos ter aqui um dev tfvars, deixa eu renomear aqui, acabei colocando errado, dev tf vars e temos também um prod tf vars. Então de acordo com o ambiente que nós estivermos trabalhando, que nós estivermos fazendo o deploy, nós vamos selecionar um arquivo de variáveis diferente, um arquivo de definição de variáveis diferentes. Para PROD, o nosso prefixo poderia ser PROD-FULLCYCLE, para DEV, nós poderíamos ter aqui DEV-FULLCYCLE, e aí nós poderíamos definir as outras variáveis, o nosso DESIRED CAPACITY, que acabou que nós colocamos hardcode, mas o ideal seria nós termos aqui variáveis para nós conseguirmos atribuir um capacete diferente dependendo do ambiente. E aí para nós rodarmos, temos um exemplo, eu alterei o prefixo aqui no arquivo de variáveis, deixa eu salvar então todos esses arquivos, beleza. Agora aqui no arquivo main nós já não precisamos mais dessa concatenação, porque agora nós teremos o valor que nós desejamos já diretamente a partir da variável prefixo, que é diferente de acordo com a nossa workspace. Ao rodar play novamente, nós devemos ter aqui o mesmo output. Porque agora o prefixo está correto. Então, vamos aguardar aqui que seja feito o refresh. E se nós verificarmos o nome aqui... Ah, sim, nós precisamos agora de referenciar,enciar o arquivo tfvars, obviamente, então deixa eu colocar aqui var file, e aqui nós estamos falando de prod, então nós vamos utilizar o arquivo prod tfvars. Beleza, vamos aguardar aqui, obtendo o state lock. E agora, nós podemos observar, vamos verificar aqui se nós encontramos o nome de algum recurso. Agora sim, temos aqui o prod-fullcycle, tá? Este carinha, ele está vindo do arquivo tfvarsprod, e nós estamos ali utilizando o state também de produção. E é claro que nós poderíamos dar um switch, tá? Para a gente mudar aqui a nossa workspace, nós utilizamos o State também de produção, e é claro que nós poderíamos dar um switch, para a gente mudar aqui a nossa Workspace, nós utilizamos o comando Select, agora nós passaremos para a Dev, nós vamos selecionar Dev, beleza, agora nós podemos rodar aqui o Plan, porém apontando para a Dev, então Dev, TF, Vars. TF, Vars, teremos aqui um outro plano, quando nós aplicarmos nós vamos alterar o state da nossa workspace de dev e a nossa workspace de project permanecerá inalterada, tá? Nós podemos aqui verificar que o nome agora dos nossos recursos possui o prefixo dev-fullcycle-vpc, beleza? Então eu acho que eu nem vou aplicar aqui porque É bem simples e ficou evidente através do plan Como funciona E agora uma última coisa que eu gostaria de mostrar Aqui é que nós podemos também Trabalhar com contas diferentes Utilizando workspaces E aqui se nós estamos falando somente de duas contas Nós poderíamos utilizar aquele operador Ternário para nós fazermos Uma verificação do workspace aqui E se for dev, nós vamos utilizar o profile default, tá? Deixa eu colocar aqui, na verdade, um ponto de interrogação, agora caso contrário, nós vamos utilizar o profile prod, por exemplo, poderia ser qualquer outro profile aqui, e aí nós estaríamos fazendo o deploy da nossa aplicação de acordo com a nossa workspace, beleza? Então, espero que tenha ficado claro. Esse conceito de workspace nos ajuda bastante quando nós temos que replicar a nossa infraestrutura. Então, eu espero que você consiga utilizar aí no seu dia a dia. Espero que você tenha gostado. Vejo você na nossa próxima aula.