Photo by Nubelson Fernandes on Unsplash

Como importar recursos existentes na plataforma do Azure com Terraform

Pensando em aplicar IaC (Infrastructure as Code) na sua plataforma de infraestrutura do Azure? Saiba que é possível importar recursos existentes e manter tudo gerenciado pelo Terraform de forma simples e rápida.

DevOps from Zero!💻
6 min readMay 31, 2023

--

E aí pessoal! Voltando com TUDO para falar mais sobre Terraform & Azure, hoje vamos aprender de uma vez por todas com importar recursos em plataformas de nuvem, aqui no caso o Azure usando o Hashicorp Terraform. Pretendo ser bem breve e direto no assunto, apenas para despertar a ideia de mindset IaC na sua mente e quem sabe depois, você já possa sair aplicando de fato dentro do seu homelab ou projeto. Bora que eu explico no caminho!! 🚀🚀🚀 Não esquece do seu café hein… e ótima leitura!!

Para o exemplo, vamos usar um resource_group no Azure, que foi criado manualmente, e que agora pretendo migrar o ambiente para IaC (Infrastructure as Code). Para que seja possível esse processo de importe dos recursos para o estado do Terraform, é necessário que o Engenheiro DevOps escreva os blocos do recurso em questão que está sendo importado, o Terraform NÃO vai criar o arquivo de configuração no formato (.tf) para você. Sabendo disso, vamos se atentar nos requerimentos para que possamos começar nossos trabalhos!

Requerimentos

Para que você possa aprender e testar, é necessário os seguintes tópicos:

  • Uma conta no Azure com subscription ativada.
  • Hashicorp Terraform instalado no seu sistema.
  • Básicos conhecimentos de tecnologia.
  • Sistema Operacional Ubuntu (unix-like systems).

Caso você não tenha os requisitos acima, prossiga com a leitura e outro dia você aproveita para por em prática os conhecimentos, apenas aproveite, tente entender e ganhe essa noção do contexto.

A infraestrutura atual no Azure

No momento que eu estou escrevendo o post, tenho um resource_group já criado no Azure, ele está sem nenhum recurso vinculado, eu fiz a criação do zero via Azure DevOps Pipeline com Azure CLI (esse será o próximo post do Medium 😜). Abaixo um exemplo de como está o ambiente:

azure resource_group miris

Um resource_group no Azure é um grupo lógico que agrupa recursos relacionados em uma assinatura do Microsoft Azure. Ele fornece uma maneira conveniente de gerenciar, organizar e controlar os recursos dentro de um ambiente Azure. Isso facilita demais possibilitando muitas vantagens como gerenciamento e organização, implantação e remoção simples e controle de acessos.

O comando — help do Terraform

Para que seja possível o processo de importação do recurso, precisamos recorrer sempre à documentação do Terraform, lá é a casinha das boas práticas e de como tudo funciona.

Eu sempre gosto de validar as informações diretamente pela CLI do Terraform antes de seguir com a documentação, o comando de --help é bem estruturado e com muito conteúdo. Veja abaixo como ele trás informações valiosas, você vai até mais esperto para a documentação.

$ t import --help
Usage: terraform [global options] import [options] ADDR ID

Import existing infrastructure into your Terraform state.

This will find and import the specified resource into your Terraform
state, allowing existing infrastructure to come under Terraform
management without having to be initially created by Terraform.

The ADDR specified is the address to import the resource to. Please
see the documentation online for resource addresses. The ID is a
resource-specific ID to identify that resource being imported. Please
reference the documentation for the resource type you're importing to
determine the ID syntax to use. It typically matches directly to the ID
that the provider uses.

The current implementation of Terraform import can only import resources
into the state. It does not generate configuration. A future version of
Terraform will also generate configuration.

Because of this, prior to running terraform import it is necessary to write
a resource configuration block for the resource manually, to which the
imported object will be attached.

This command will not modify your infrastructure, but it will make
network requests to inspect parts of your infrastructure relevant to
the resource being imported.

Options:

-config=path Path to a directory of Terraform configuration files
to use to configure the provider. Defaults to pwd.
If no config files are present, they must be provided
via the input prompts or env vars.

-input=false Disable interactive input prompts.

-lock=false Don't hold a state lock during the operation. This is
dangerous if others might concurrently run commands
against the same workspace.

-lock-timeout=0s Duration to retry a state lock.

-no-color If specified, output won't contain any color.

-var 'foo=bar' Set a variable in the Terraform configuration. This
flag can be set multiple times. This is only useful
with the "-config" flag.

-var-file=foo Set variables in the Terraform configuration from
a file. If "terraform.tfvars" or any ".auto.tfvars"
files are present, they will be automatically loaded.

-ignore-remote-version A rare option used for the remote backend only. See
the remote backend documentation for more information.

-state, state-out, and -backup are legacy options supported for the local
backend only. For more information, see the local backend's documentation

A documentação e o bloco do azure resource_group

Sabemos que precisamos escrever o bloco para importar no Terraform, para facilitar a sua busca pelo recurso, basta digitar no Google “terraform azure resource group”, que ele cai direto na página que estamos trabalhando.

terraform doc

Veja que do lado direito, ele tem alguns tópicos rápidos, clique na opção de import, ele já deixa tudo registrado o comando que vamos usar.

terraform doc
$ terraform import azurerm_resource_group.mygroup /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myresourcegroup

Perceba que o comando acima mostra de forma completa os dados que precisamos, entre eles, o resource_id , e o nome do resource_group, voltando rapidamente para o Azure, precisamos do resource_id que fica nas propriedades do resource_group .

Criando o bloco do resource_group no Terraform

Vamos escrever o código do recurso que estamos importando do Azure, basta apenas por os cabeçalhos, que é o bloco do terraform e o bloco de povidercomo descrito abaixo:

Crie um arquivo chamado import.tf para que Terraform possa entender que isso faz parte das configurações.

# Setup the Terrarom block
terraform {
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "~>3.0"
}
}
}

# Configure the Azure Provider
provider "azurerm" {
features {}
}

# Create a resource group
resource "azurerm_resource_group" "my-rg" {
name = "miris"
location = "Brazil South"
}

Inicializando o diretório e os plugins do Azure

Antes de executar o comando $ terraform import precisamos preparar o diretório para que tudo ocorra de forma correta.

$ t init

Initializing the backend...

Initializing provider plugins...
- Finding hashicorp/azurerm versions matching "~> 3.0"...

Importando o recurso com Terraform

Feito isso, e com as informações validadas, tanto o nome do resource_group quanto o resource_id podemos executar o comando terraform import .

$ t import azurerm_resource_group.my-rg /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/miris
azurerm_resource_group.my-rg: Importing from ID "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/miris"...
azurerm_resource_group.my-rg: Import prepared!
Prepared azurerm_resource_group for import
azurerm_resource_group.my-rg: Refreshing state... [id=/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/miris]

Import successful!

The resources that were imported are shown above. These resources are now in
your Terraform state and will henceforth be managed by Terraform.

Agora executando o comando $ terraform plan ele mostra que estamos sem nenhuma mudança, ou seja, podemos adicinar novos recursos para esse resource_group ou simplesmene manter esse recurso sendo gerenciado pelo Terraform.

# t plan
azurerm_resource_group.my-rg: Refreshing state... [id=/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/miris]

No changes. Your infrastructure matches the configuration.

Terraform has compared your real infrastructure against your configuration and found no differences, so no changes are needed.

And that’s all folks. If you liked this story, please show your support by 👏 this story. Thank you for reading!

--

--

DevOps from Zero!💻

SRE/DevOps Engineer| Lifelong learner | Medium Creator | AWS/Azure certified☁️ | Hashicorp Ambassador | Containers | Tech | Community | Coffee