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.
About author
Você pode gostar também
Como versionar sua infraestrutura com Terraform e GitLab
Deixando um pouco o assunto sobre Corona Vírus de lado, chegamos ao penúltimo post da nossa série de postagens sobre Terraform. Aqui iremos falar sobre como versionar sua infraestrutura utilizando
Teste sua infraestrutura com InSpec: auditoria automatizada e eficiente
Você conhece a ferramenta da Chef, o InSpec? Vamos realizar um teste básico de infraestrutura utilizando InSpec! Muita das vezes quando trabalhamos com integração continua não temos a certeza que
Guia definitivo: Como gerenciar sua infraestrutura com Terraform
Em meio ao caos que o Corona Vírus tem causado em todo o globo, chegamos ao último post da nossa série de postagens sobre Terraform. Caso tenha perdido os 5