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

Infraestrutura TI

Maximize o desempenho do seu banco de dados com a ferramenta pg_activity

O monitoramento eficaz de um banco de dados é crucial para manter um desempenho otimizado e garantir a disponibilidade contínua de suas aplicações. Neste post, vamos explorar como a ferramenta

Cloud

Melhore a performance do seu Elasticsearch com um eficiente Capacity Planning

E aí meus amiguinhos, hoje vamos falar um pouquinho sobre o ElasticSearch, um motor de buscas para indexar dados de maneira fácil.  A ideia aqui é discutir um pouco sobre

Destaques

Descubra como implementar uma governança ágil na Cloud com o novo ebook da 4Linux

Com conteúdo relevante e vanguardista, a proposta deste ebook é apresentar modelos para se implementar uma governança ágil na Cloud (AWS – Azure – GCP) usando o conceito de IDP.