Olá pessoal, sejam muito bem-vindos a mais uma aula. E na aula de hoje nós falaremos sobre um recurso do Terraform que pode te ajudar bastante, principalmente caso a sua empresa esteja começando a adotar Terraform, começando a adotar infraestrutura como código. Então, num cenário em que a maioria dos recursos com os quais você trabalha, a maioria dos recursos que estão provisionados na sua infraestrutura, caso eles tenham sido criados manualmente e agora você esteja implementando, queira começar a adotar o Terraform nos seus projetos, uma opção que você tem é utilizar o Terraform Import. Então, como o próprio nome sugere, com esse recurso nós podemos importar de uma infraestrutura já existente, um recurso para dentro do state do seu projeto em Terraform. Para ficar mais claro, nós faremos um exemplo. Eu estou aqui com o nosso projeto, onde nós temos os nossos dois módulos de network e o nosso módulo de cluster. Eu vou comentar aqui esses dois módulos, porque agora nós não falaremos especificamente sobre eles. E eu vou criar um outro recurso. Na verdade, eu já tenho esse recurso criado. Eu tenho uma fila aqui, uma fila no serviço SQS da AWS, que eu criei manualmente. Então, eu criei essa fila aqui, manual kill. Não está definida no nosso arquivo de configuração do Terraform. Mas, agora, eu quero que essa fila seja um recurso gerenciado pelo Terraform. eu quero que esta fila seja um recurso gerenciado pelo Terraform, eu quero importar ela aqui dentro do meu projeto, dentro do meu arquivo de configurações. E a forma como eu tenho de fazer isso é o seguinte, na verdade existe em duas formas, existe um comando Terraform import e existe o bloco import que nós vamos colocar diretamente no arquivo de configurações. O primeiro passo é nós sabermos qual que é o tipo do recurso que nós queremos importar. Então, nós temos ali a fila SQS e o recurso correspondente está aqui no provider AWS e é o recurso AWS SQS Queue. Para nós utilizarmos o Terraform Import, nós vamos precisar primeiro definir aqui o recurso, tá? Então nós teremos resource, precisamos especificar o tipo do recurso e precisamos dar um nome, tá? Então eu vou colocar aqui imported e só isso, não vou colocar nenhuma configuração por enquanto, tá? E somente com essas informações eu já consigo fazer o import deste recurso. Para isso eu vou abrir aqui o novo terminal e o comando que nós vamos utilizar é o terraform import e nós precisamos passar aqui como primeiro argumento o identificador do nosso recurso no arquivo de configuração. Então eu vou colocar aqui a WSSQSKILL, import it, e agora eu preciso passar o ID do recurso existente. Porém, cada recurso possui ali uma propriedade, um atributo que corresponde a esse ID. Então, para cada recurso que você precisar importar, você precisa consultar a documentação para saber qual é o ID daquele recurso. Então, nós podemos aqui verificar, na própria documentação da WS-SQS-Q, nós podemos pesquisar aqui por import. E aqui nós temos, né? O import, aqui nós, ele já explica, na verdade, uma forma de importar aqui, que nós veremos mais adiante, disponível somente a partir da versão 1.5.0, tá? Mas aqui nós temos o ID do recurso, que no caso é a URL da nossa Q. Então, nós vamos voltar aqui para a nossa queue e nós vamos pegar a URL, tá? Então, esse daqui é o atributo que identifica unicamente o nosso recurso e é ele que nós vamos utilizar no Terraform Import. Beleza? Nós vamos colocar aqui a URL e eu vou dar um Enter, tá? E nós vamos aguardar aqui que seja feito o refresh do state, que seja adquirido o state lock. E beleza, nós temos que o recurso foi importado. Só que aí você pode achar estranho porque aqui o nosso resource ainda está em branco. Mas é isso mesmo, quando nós importamos um recurso utilizando o Terraform Import, ele não altera em nada os nossos arquivos de configuração. A única coisa que ele faz é adicionar esse recurso com todos os seus atributos no state, no state do nosso projeto. Então, se nós fizermos aqui uma consulta no nosso state, então nós temos aqui o comando terraform state, nós ainda não vimos o terraform state, mas nós podemos aqui já utilizá-lo agora e ver na prática como esse comando funciona. Nós temos várias opções do state e uma das opções é o show, que vai nos mostrar as informações do nosso state para um recurso específico. Então nós temos aqui que colocar o identificador do nosso recurso, que é a ws.sqsq.imported. E ele vai mostrar todas as informações desse recurso de acordo com o que nós temos no nosso state atualmente. É claro que nós poderíamos consultar o arquivo tf.state no nosso projeto, mas o nosso arquivo está lá no S3. É melhor nós utilizarmos aqui mesmo o terraform.state. E aqui nós temos todos os atributos desse recurso. Então, nós podemos simplesmente copiar aqui todos esses atributos e colar aqui no recurso. Deixa eu formatar ele. E nós temos então agora o nosso recurso importado e definido no nosso arquivo de configurações. O problema é que nós temos aqui muitos atributos que eles não deveriam estar no nosso arquivo de configurações, como por exemplo é o ARN. Esse ARN é definido depois do Apply. Ele é um valor que é conhecido após a criação do recurso e ele não deve estar aqui. Nós não podemos inclusive alterar esse valor. Nós temos ele aqui no State do Terraform para que o Terraform consiga gerenciar. no state do Terraform para que o Terraform consiga gerenciar, ele precisa ter acesso a todas essas informações, mas algumas dessas informações não deveriam estar no arquivo de configuração então nós temos que acabar removendo aqui muitas dessas informações, o ID também nós temos muitas informações que são, ou muitos atributos que estão com valor default, nós não precisávamos tê-los aqui, então esse content-based desuplication não precisava de nós termos enfim, vários aqui, vários desses atributos nós podemos excluir, então toda essa parte KMS também são atributos padrões que eu não alterei quando eu criei o recurso, mas o interessante daqui é que você pode manter todos esses recursos e depois se você precisar você pode customizá-los, mas não é o caso. Então, nós podemos remover vários desses atributos, porque se nós dermos aqui um plan, por exemplo, da forma como está, se eu colocar aqui agora até a forma de plan, nós vamos ter um erro. Eu vou adiantar aqui que nós teremos um erro, que é o seguinte. Nós temos aqui neste recurso a configuração da URL, e essa URL é uma configuração que é definida após o Apply, então nós não temos controle, nós não podemos alterar a URL da nossa queue, inclusive ela é o nosso ID, então nós temos que remover esse cara, nós podemos remover as tags, enfim. Nós precisamos, depois de importar, nós precisamos de fazer várias alterações. Vamos verificar se agora nós conseguimos rodar aqui o Terraform Plan com sucesso. Beleza, Refresh State. E agora sim, agora nós temos o nosso recurso definido aqui no nosso arquivo de configurações, já temos uma configuração válida e agora nós poderíamos, por exemplo, alterar aqui o delay, o delay para o recebimento dessas mensagens e quando nós rodarmos Terraform Plan, aí sim nós teremos aqui o plano do Terraform para fazer a alteração desse recurso que antes não era gerenciado pelo Terraform, beleza? E aqui está, então nós vimos aí uma primeira opção de utilizar quando nós precisamos importar algum recurso porém você teria que fazer isso manualmente para cada um dos recursos, com certeza demoraria bastante tempo. Então, nós teremos uma outra forma, inclusive, que você já acabou visualizando lá na documentação do Terraform. Primeiro, eu vou mostrar um outro comando aqui do Terraform State, que é o Terraform State RM, para nós removermos um recurso aqui do nosso state, tá? Então quando nós fazemos essa remoção, nós estamos tirando o nosso state, mas o recurso permanece lá criado, beleza? Então nós vamos aqui passar o identificador desse recurso, terraform state rm identificador, beleza? Foi removido do nosso state, agora nós podemos remover aqui sem nenhum problema, tá? A outra forma de nós importarmos recursos no nosso projeto é utilizando este carinha aqui, tá? Utilizando o import, nós temos aqui o import, o bloco import, nós informamos qual vai ser o identificador do nosso recurso, então nós precisamos de conhecer o tipo do recurso para nós colocarmos aqui a WSSQSQ no nosso caso e aqui vai ser a Q do nosso recurso que no caso é uma Q arbitrária e precisamos do ID que nós já vimos que é a URL da nossa Q então nós colocamos o ID aqui e aí nós podemos utilizar o comando terraform-plan, porém agora com um argumento bem interessante, que é o argumento generate-config. Então, quando nós utilizamos esse generate-config-out no comando terraform-plan, e nós passamos o nome de arquivo, todos os imports que nós colocamos aqui, que nós colocamos no nosso arquivo de configuração, qualquer arquivo de configuração, todos esses imports acontecerão dentro do nosso state, mas não só isso. Nós teremos também os arquivos de configuração ou as configurações desses recursos sendo gerados dentro desse arquivo de inerere.tf que nós definimos aqui. Então, vamos entender como isso funciona na prática. Coloquei o comando aqui para ser executado. Beleza. Ele vai preparar o import. Aqui nós temos um warning dizendo que esse config generation é experimental, então nós precisamos revisar, ainda não é algo que vai ser totalmente automatizado. Aqui ele mostra qual foi o arquivo de configuração gerada, ou qual foi a configuração gerada para este recurso. E nós temos aqui no plano que temos um recurso a ser importado. Aqui nós navegamos até o arquivo gerado, esse generator.tf. Ele informa aqui que nós precisamos revisar, então colar dentro do nosso arquivo de configurações. E agora, as configurações geradas para esse recurso, elas já não possuem todas aquelas propriedades ou aqueles atributos que são gerados posteriormente que não devem estar no arquivo de configurações como nós vimos anteriormente. Então, nós não temos aqui, por exemplo, a URL nem o ARN. Nós temos somente os atributos que, de fato, podem estar na nossa configuraçãouração que nós podemos copiar copiar todo todo esse bloco todo esse recurso evidentemente você pode excluir daqui os atributos opcionais que possuem os valores padrões e nós vamos excluir o arquivo generator agora tá beleza temos aqui o nosso recurso definido agora agora nós podemos então rodar Terraform Apply, Auto-Approve, e agora nós teremos a importação de fato deste recurso dentro do nosso State, dentro do nosso projeto. Então, o Apply foi complete e nós temos aqui um recurso importado. Bem mais simples do que nós utilizarmos o Terraform Import, porque ali nós precisamos de colocar os atributos de forma manual, de fazer uma limpeza nesses atributos e assim por diante. Bom, este recurso aqui, como nós vimos aqui o próprio warning, ele ainda está em fase experimental. Eu testei, por exemplo, utilizando uma VM, eu criei lá uma instância no EC2 neste 2 forma manual eu tive uma série de problemas para utilizar esse import está inclusive nem conseguiu utilizar sem fazer muitas alterações então eu preferia até mostrar o recurso esse curso sqs que o que ele é mais simples e para este curso em parte funcionou sem nenhum problema tá mas não vai ser para todos os recursos que vai funcionar, pelo menos até o momento da gravação desse vídeo mas somente isso daqui já pode ajudar bastante, somente o fato de você poder colocar um recurso que já foi criado manualmente dentro do state do seu projeto de algo fantástico, algo que pode auxiliar bastante, principalmente quando você está fazendo um teste, você tem um recurso manual e você quer passar a gerenciar esse recurso através do Terraform sem precisar excluí-lo e criá-lo novamente. Beleza? Espero que você tenha gostado e nós nos vemos na nossa próxima aula.