Maximize a eficiência da sua infraestrutura com o novo recurso de importação do Terraform

Maximize a eficiência da sua infraestrutura com o novo recurso de importação do Terraform

O Terraform pode importar recursos de infraestrutura existentes. Essa funcionalidade permite colocar recursos existentes sob o gerenciamento do Terraform. Isso é muito útil quando estamos iniciando no uso do terraform e já temos alguma infraestrutura criada, ou mesmo quando alguém altera a infraestrutura apenas no console da nuvem, sem ter realizado os ajustes na configuração.

Até a versão 1.5 do terraform, o processo de import era feito apenas via comando terraform import, que apesar de já ser uma funcionalidade bastante útil para uma infra que já possuía vários recursos, tornava a tarefa rapidamente maçante, porque só era possível importar os recursos um a um.

O novo import block, que foi introduzido no terraform v 1.5.0, tornou o processo de importação de recursos para o terraform muito mais simples.

Em vez de usar o comando terraform import, agora você pode simplesmente adicionar um bloco ao código do terraform e importar recursos durante o processo de apply. Isso significa que as operações de importação podem ser executadas em massa e agora fazem parte do workflow padrão de `plan` e `apply`.

Apresentando a infra

Para o exemplo do post vamos usar uma infra simples, com apenas uma VPC e uma subnet:

Criando um bloco import

Na própria documentação dos recursos do terraform, na seção de import, é possível encontrar uma breve descrição de como estruturar um bloco import.

É preciso ter um bloco import para cada recurso que se queira importar, sendo que todos os blocos import podem ser reunidos em um único arquivo. No exemplo do post criamos um arquivo 01-import.tf com o conteúdo abaixo:

</span>

<span style="font-weight: 400;">import {</span>

<span style="font-weight: 400;">to = aws_vpc.vpc-4linux</span>

<span style="font-weight: 400;">id = "vpc-0d42613db3ec6ec52"</span>

<span style="font-weight: 400;">}</span>

<span style="font-weight: 400;">import {</span>

<span style="font-weight: 400;">to = aws_subnet.subnet1-vpc-4linux</span>

<span style="font-weight: 400;">id = "subnet-03ef562d6d8e724ae"</span>

<span style="font-weight: 400;">}</span>

<span style="font-weight: 400;">

Realizando o processo de import

O processo de configuração e autenticação inicial do terraform está fora do escopo deste post, por isso vamos tratar somente do passo a passo para realizar o import.

Definido o arquivo contendo os blocos import como demostrado acima, basta seguir o workflow padrão de execução do terraform:

terraform plan -> terraform apply

Uma das vantagens de se utilizar o bloco import é que, os arquivos contendo as configurações dos recursos que serão importados podem ser gerados durante a fase de plan utilizando a nova opção do plan -generate-config-out:

</span>

<span style="font-weight: 400;">terraform plan -generate-config-out=generated.tf</span>

<span style="font-weight: 400;">

 

 

Ajustando o arquivo generated.tf

O arquivo é gerado com alguns parâmetros que são conflitantes do ponto de vista do terraform, desse modo o arquivo gerado precisa ser ajustado.

Abaixo segue um exemplo do arquivo gerado após a execução do comando anterior:

</span>

<span style="font-weight: 400;"># __generated__ by Terraform</span>

<span style="font-weight: 400;"># Please review these resources and move them into your main configuration files.</span>

<span style="font-weight: 400;"># __generated__ by Terraform</span>

<span style="font-weight: 400;">resource "aws_subnet" "subnet1-vpc-4linux" {</span>

<span style="font-weight: 400;">assign_ipv6_address_on_creation = false</span>

<span style="font-weight: 400;">availability_zone = "us-east-2a"</span>

<span style="font-weight: 400;">availability_zone_id = "use2-az1"</span>

<span style="font-weight: 400;">cidr_block = "192.168.10.0/24"</span>

<span style="font-weight: 400;">customer_owned_ipv4_pool = null</span>

<span style="font-weight: 400;">enable_dns64 = false</span>

<span style="font-weight: 400;">enable_lni_at_device_index = 0</span>

<span style="font-weight: 400;">enable_resource_name_dns_a_record_on_launch = false</span>

<span style="font-weight: 400;">enable_resource_name_dns_aaaa_record_on_launch = false</span>

<span style="font-weight: 400;">ipv6_cidr_block = null</span>

<span style="font-weight: 400;">ipv6_native = false</span>

<span style="font-weight: 400;">map_customer_owned_ip_on_launch = false</span>

<span style="font-weight: 400;">map_public_ip_on_launch = true</span>

<span style="font-weight: 400;">outpost_arn = null</span>

<span style="font-weight: 400;">private_dns_hostname_type_on_launch = "ip-name"</span>

<span style="font-weight: 400;">tags = {</span>

<span style="font-weight: 400;">Name = "subnet1-vpc-4linux"</span>

<span style="font-weight: 400;">}</span>

<span style="font-weight: 400;">tags_all = {</span>

<span style="font-weight: 400;">Name = "subnet1-vpc-4linux"</span>

<span style="font-weight: 400;">}</span>

<span style="font-weight: 400;">vpc_id = "vpc-0d42613db3ec6ec52"</span>

<span style="font-weight: 400;">}</span>

<span style="font-weight: 400;"># __generated__ by Terraform</span>

<span style="font-weight: 400;">resource "aws_vpc" "vpc-4linux" {</span>

<span style="font-weight: 400;">assign_generated_ipv6_cidr_block = false</span>

<span style="font-weight: 400;">cidr_block = "192.168.0.0/16"</span>

<span style="font-weight: 400;">enable_dns_hostnames = false</span>

<span style="font-weight: 400;">enable_dns_support = true</span>

<span style="font-weight: 400;">enable_network_address_usage_metrics = false</span>

<span style="font-weight: 400;">instance_tenancy = "default"</span>

<span style="font-weight: 400;">ipv4_ipam_pool_id = null</span>

<span style="font-weight: 400;">ipv4_netmask_length = null</span>

<span style="font-weight: 400;">ipv6_cidr_block = null</span>

<span style="font-weight: 400;">ipv6_cidr_block_network_border_group = null</span>

<span style="font-weight: 400;">ipv6_ipam_pool_id = null</span>

<span style="font-weight: 400;">ipv6_netmask_length = 0</span>

<span style="font-weight: 400;">tags = {</span>

<span style="font-weight: 400;">Name = "vpc-4linux"</span>

<span style="font-weight: 400;">}</span>

<span style="font-weight: 400;">tags_all = {</span>

<span style="font-weight: 400;">Name = "vpc-4linux"</span>

<span style="font-weight: 400;">}</span>

<span style="font-weight: 400;">}</span>

<span style="font-weight: 400;">

Aqui, o arquivo após a limpeza realizada, apenas com os parâmetros que são necessários para realizar a configuração da vpc e da subnet que estamos usando nesse exemplo:

 

</span>

<span style="font-weight: 400;">resource "aws_subnet" "subnet1-vpc-4linux" {</span>

<span style="font-weight: 400;">availability_zone = "us-east-2a"</span>

<span style="font-weight: 400;">cidr_block = "192.168.10.0/24"</span>

<span style="font-weight: 400;">map_public_ip_on_launch = true</span>

<span style="font-weight: 400;">tags = {</span>

<span style="font-weight: 400;">Name = "subnet1-vpc-4linux"</span>

<span style="font-weight: 400;">}</span>

<span style="font-weight: 400;">vpc_id = "vpc-0d42613db3ec6ec52"</span>

<span style="font-weight: 400;">}</span>

<span style="font-weight: 400;">resource "aws_vpc" "vpc-4linux" {</span>

<span style="font-weight: 400;">cidr_block = "192.168.0.0/16"</span>

<span style="font-weight: 400;">enable_dns_hostnames = false</span>

<span style="font-weight: 400;">enable_dns_support = true</span>

<span style="font-weight: 400;">tags = {</span>

<span style="font-weight: 400;">Name = "vpc-4linux"</span>

<span style="font-weight: 400;">}</span>

<span style="font-weight: 400;">}</span>

<span style="font-weight: 400;">

terraform plan

Agora para importar efetivamente a configuração, basta seguir o workflow padrão do terraform:

</span>

<span style="font-weight: 400;">terraform plan</span>

<span style="font-weight: 400;">

 

terraform apply


terraform apply

Validando a importação

Depois de finalizar o import, é possível validar com o comando terraform state list, que, a partir de agora, o terraform já consegue enxergar e realizar o gerenciamento da infraestrutura importada:

</span>

<span style="font-weight: 400;">terraform state list</span>

<span style="font-weight: 400;">

 

Conclusão

Em resumo, o novo recurso de import block do terraform oferece uma ferramenta poderosa para integrar recursos existentes em sua infraestrutura, com sua configuração de infraestrutura como código (IaC). Suas vantagens são claras: permite a importação de recursos de maneira eficiente e automática, economizando tempo e esforço na criação de recursos já existentes em sua infraestrutura.

No entanto, é importante destacar que o sucesso da importação depende do entendimento prévio da configuração dos recursos a serem importados, bem como da necessidade de ajustes nos arquivos gerados, para que eles estejam alinhados com os requisitos específicos de sua infraestrutura.

Portanto, ao utilizar um import block, é essencial combinar o conhecimento das configurações com a capacidade de personalização para obter o máximo benefício desta poderosa funcionalidade do terraform.

 

 

 

Anterior Criando um Pendrive Bootável com Múltiplas ISOs no Linux
Próxima Novidades do PostgreSQL 16

About author

Anderson Bispo
Anderson Bispo 5 posts

Formado em Sistemas de Informação, pela Universidade Salvador. Possui especialização em Gestão e Governança de TI e MBA em BI/DW. Atua com TI desde 2001 principalmente como SysAdmin Unix/Linux, DBA Oracle e Cloud Architect. Possui certificações ITIL, Scrum Master, Oracle OCP, Oracle Cloud Architect, Google Cloud Engineer, entre outras. Atualmente é servidor público do Tribunal de Justiça da Bahia e consultor, instrutor e conteudista da 4Linux.

View all posts by this author →

Você pode gostar também

Notícias

4Linux se torna A.T.O do EXIN e lança curso DEVOPS Master

A 4linux acaba de se tornar um A.T.O. (Authorized Training Organization) do EXIN e juntamente teve o conteúdo de seu treinamento ‘DEVOPS Master’ aprovado, isso significa que o material didático criado

Treinamentos

Domine o Terraform e gerencie a Cloud com o novo curso da 4Linux

E aí, galera que curte DevOps! Preparados para colocar a mão na massa com o Terraform? Essa é a sua chance de dominar a maior ferramenta de IaC e gerenciar

Infraestrutura TI

Descubra como o Rundeck pode otimizar suas tarefas de sysadmin

O que é? Rundeck é mais que simplesmente um software. Trata-se de uma plataforma open-source com interface web, que auxilia o administrador na automatização de rotinas operacionais em data-center ou