Com o Terraform 1.5 e posterior, você pode usar o bloco import
para gerenciar a importação de recursos diretamente em sua configuração. Essa funcionalidade simplifica o processo de importação de infraestrutura existente para o estado do Terraform, eliminando a necessidade de um comando separado do CLI terraform import
.
Neste artigo, explicamos o bloco de importação e como utilizá-lo para importar diferentes recursos.
O que é um Bloco de Importação do Terraform?
O bloco de importação do Terraform introduzido no Terraform v1.5.0 fornece uma abordagem declarativa para importar recursos de infraestrutura existentes em um arquivo de estado do Terraform. Ele permite que as importações de recursos se tornem parte integrante do processo de planejamento do Terraform — semelhante a outros recursos gerenciados — em vez de serem tratados como uma operação de estado direta.
Como resultado, o bloco import
melhora a transparência e alinha as importações de recursos com os princípios fundamentais da infraestrutura como código (IaC), permitindo que os usuários gerenciem sua infraestrutura de forma mais eficaz e previsível.
A sintaxe para um bloco de import
no Terraform é a seguinte:
import {
to = <resource_address>
id = <resource_identifier>
}
para
: Especifica o endereço do recurso em sua configuração onde o recurso importado será mapeado.id
: Define o identificador único do recurso existente na API do provedor. Certifique-se de que o seu provedor Terraform esteja corretamente configurado para acessar o recurso a ser importado.
Observe que alguns tipos de recursos podem ter requisitos ou restrições adicionais para a importação.
Bloco de Importação vs. Comando de Importação do Terraform
Um bloco import
no Terraform permite que você defina recursos diretamente em seu arquivo de configuração, simplificando o gerenciamento da infraestrutura existente.
Por outro lado, quando o comando terraform import
é usado sem um bloco import
, ele vincula um recurso existente ao estado do Terraform, mas não gera automaticamente a configuração correspondente em seu código. Você deve adicionar manualmente essa configuração posteriormente. O comando de importação é particularmente útil para importações únicas ou para transição da infraestrutura para o gerenciamento do Terraform.
Ambos os métodos exigem cuidadosa manipulação para garantir a consistência entre o estado do Terraform e a infraestrutura real. Os blocos de import
são geralmente mais adequados para o gerenciamento contínuo de recursos, enquanto o comando autônomo funciona bem para importações ocasionais.
Exemplo 1: Usando o Bloco de Importação do Terraform para Importar um Bucket S3
Vamos supor que temos um bucket existente da AWS S3 (my-existing-bucket) que você deseja gerenciar com o Terraform.
O bloco resource
especifica o bucket S3 (aws_s3_bucket.example) e o atributo bucket
define o nome do bucket existente:
resource "aws_s3_bucket" "example" {
bucket = "my-existing-bucket"
}
import {
to = aws_s3_bucket.example
id = "my-existing-bucket"
}
O bloco import
vincula o bucket S3 existente ao recurso do Terraform.
para
: Mapeia o recurso importado para o endereço do blocoresource
(aws_s3_bucket.example)id
: Especifica o ID único do bucket (my-existing-bucket).
Ao executar terraform plan
, o Terraform lê o bloco import
, verifica o estado do bucket S3 existente e mostra uma prévia das alterações que fará no arquivo de estado. Em seguida, após executarmos terraform apply
, o Terraform atualiza o arquivo de estado para incluir o bucket existente, mapeando-o para o recurso aws_s3_bucket.example.
Depois de executar terraform apply
e importar com sucesso o recurso, é uma boa prática remover o bloco import
. Deixá-lo não causará nenhum dano, mas removê-lo ajuda a manter uma configuração limpa e minimiza a confusão potencial durante a futura gerência de estado.
Exemplo 2: Usando o Bloco de Importação do Terraform para Importar uma Instância EC2
Vamos considerar outro exemplo: Temos uma instância EC2 existente com o ID i-1234567890abcdef0
e queremos trazê-la para gerenciamento pelo Terraform.
Definimos o recurso aws_instance
que queremos que o Terraform gerencie no bloco resource
. Certifique-se de que os atributos (por exemplo, ami
, instance_type
) correspondam à configuração da instância existente:
resource "aws_instance" "example" {
ami = "ami-0abcdef1234567890" # Replace with the actual AMI ID
instance_type = "t2.micro"
}
import {
to = aws_instance.example
id = "i-1234567890abcdef0"
}
No bloco import
:
to
: Mapeia o recurso em sua configuração (aws_instance.example
) para o recurso existente.id
: Especifica o ID único da instância EC2 que você está importando.
Depois de adicionar o bloco de recurso e a declaração de importação ao arquivo de configuração do Terraform, execute terraform plan
para visualizar as alterações. Em seguida, execute terraform apply
para importar o recurso para o arquivo de estado do Terraform.
Após a importação, o Terraform gerenciará a instância EC2 existente, garantindo que sua configuração permaneça declarativa.
Exemplo 3: Usando o Bloco de Importação do Terraform para Importar um Grupo de Recursos do Azure
No próximo exemplo, estaremos importando um grupo de recursos do Azure.
Temos um grupo de recursos do Azure existente chamado example-resource-group
na região East US
, e queremos gerenciá-lo com o Terraform.
Primeiramente, no bloco de resource
, definimos o recurso azurerm_resource_group
que o Terraform irá gerenciar:
resource "azurerm_resource_group" "example" {
name = "example-resource-group"
location = "East US"
}
import {
to = azurerm_resource_group.example
id = "/subscriptions/<subscription_id>/resourceGroups/example-resource-group"
}
O bloco de importação:
to
: Mapeia o recurso em sua configuração (azurerm_resource_group.example
) para o recurso do Azure existente.id
: Especifica o ID do recurso do Azure totalmente qualificado do grupo de recursos. Lembre-se de substituir<subscription_id>
pelo seu ID de assinatura real.
Adicione o recurso e o bloco de importação ao seu arquivo de configuração do Terraform. Em seguida, execute o comando terraform plan
para visualizar as alterações e execute terraform apply
para aplicar as alterações e importar o recurso para o arquivo de estado do Terraform.
É possível usar o Bloco de Importação do Terraform Condicionalemente?
O bloco de importação do Terraform é projetado para ser declarativo e requer valores específicos conhecidos no momento do planejamento. Portanto, não pode ser usado condicionalmente dentro do seu código do Terraform.
O bloco de importação não suporta expressões dinâmicas ou variáveis para determinar o ID de importação com base em condições. Tentativas de usar construções como count ou variáveis dentro do bloco de importação resultarão em erros, pois o Terraform não permite tais argumentos nesse contexto.
Pontos Chave
A introdução do bloco de importação no Terraform 1.5+ simplifica a gestão de recursos ao permitir a importação direta e definição de recursos dentro de arquivos de configuração. Isso está alinhado com os princípios de IaC ao reduzir a complexidade e facilitar a integração da infraestrutura existente nas configurações do Terraform.
Source:
https://dzone.com/articles/how-to-use-terraform-import-block