Todos os produtos
Search
Central de documentação

Terraform:Soluções para problemas de gerenciamento de recursos de nuvem existentes

Última atualização: Jun 28, 2026

Este tópico descreve como resolver problemas de gerenciamento em recursos de nuvem existentes com o Terraform.

Informações básicas

Este tópico aplica-se aos seguintes cenários de O&M:

  • Cenário 1: Primeiro uso do Terraform, embora o console web, a Alibaba Cloud CLI, o ROS ou as APIs já estejam em uso para criar e gerenciar recursos.

  • Cenário 2: O Terraform já gerencia os recursos, mas o estado deve permanecer inalterado mesmo após a modificação das propriedades de um recurso.

  • Cenário 3: Todos os recursos estão definidos em um modelo. A adição de novos recursos não dificulta o gerenciamento de modelos ou estados quando o modelo existente é reconstruído ou dividido.

  • Cenário 4: Novos parâmetros dos providers mais recentes precisam ser sincronizados com os documentos originais.

Além de criar, alterar e excluir recursos por meio de definições de modelos, o Terraform permite importar e gerenciar recursos externos ao seu sistema de gerenciamento. Com comandos simples, você centraliza a gestão de toda a infraestrutura.

Importar recursos existentes

Para importar recursos existentes no Terraform, siga estas etapas:

  1. Obtenha os IDs dos recursos.

    Consulte os recursos pelos IDs e obtenha suas propriedades.

  2. Declare no modelo os recursos a importar.

    Como o Terraform utiliza uma abordagem orientada a modelos, declare os recursos a serem importados diretamente no modelo.

  3. Complete as definições do modelo de recursos.

    Após a importação, preencha as definições declaradas no modelo com base nas propriedades reais dos recursos.

  1. Obtenha os IDs dos recursos.

    Obtenha os IDs dos recursos pelo console web, pela Alibaba Cloud CLI ou pelas APIs. A maneira mais simples consiste em inserir condições básicas de consulta usando data sources do Terraform. O exemplo a seguir demonstra como obter o ID de uma instância SLB:

    data "alicloud_slbs" "default" {
      name_regex  = "for-demo*"
    }
    output "slb_ids" {
      value = data.alicloud_slbs.default.ids
    }

    Execute o comando terraform apply para visualizar os IDs de todas as instâncias SLB que atendem aos critérios:

    $ terraform apply
    data.alicloud_slbs.default: Refreshing state...
    
    Apply complete! Resources: 0 added, 0 changed, 0 destroyed.
    
    Outputs:
    
    slb_ids = [
      "lb-gw8vinrqxxxxxxxxxxx",
      "lb-gw8axostxxxxxxxxxxx",
    ]
  2. Declare no modelo os recursos a importar.

    Assim como na criação de recursos, declare-os no modelo antes da importação para definir o caminho de armazenamento no estado. Os exemplos abaixo declaram uma instância SLB:

    resource "alicloud_slb" "this" {}

    Uma declaração simples permite importar recursos sem definir parâmetros específicos inicialmente. No Terraform, use o comando de importação cujo formato completo é Terraform import <Resource type>.<Resource name> <Resource ID>.

    $ terraform import alicloud_slb.this lb-gw8vinrqxxxxxxxxxxx
    alicloud_slb.this: Importing from ID "lb-gw8vinrqxxxxxxxxxxx"...
    alicloud_slb.this: Import prepared!
      Prepared alicloud_slb for import
    alicloud_slb.this: Refreshing state... [id=lb-gw8vinrqxxxxxxxxxxx]
    
    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.
  3. Complete as definições do modelo de recursos.

    Como o modelo não contém as definições completas dos recursos importados, seu conteúdo difere daquele armazenado no estado após a importação. Ao executar o comando plan, uma atualização será exibida.

    $ terraform plan
    Refreshing Terraform state in-memory prior to plan...
    The refreshed state will be used to calculate this plan, but will not be
    persisted to local or remote state storage.
    
    data.alicloud_slbs.default: Refreshing state...
    alicloud_slb.this: Refreshing state... [id=lb-gw8vinrqxxxxxxxxxxx]
    
    ------------------------------------------------------------------------
    
    An execution plan has been generated and is shown below.
    Resource actions are indicated with the following symbols:
      ~ update in-place
    
    Terraform will perform the following actions:
    
      # alicloud_slb.this will be updated in-place
      ~ resource "alicloud_slb" "this" {
            address              = "47.254.181.122"
            ...
          ~ delete_protection    = "on" -> "off"
            id                   = "id=lb-gw8vinrqxxxxxxxxxxx"
            ...
          ~ name                 = "for_demo-test" -> "tf-lb-20191108144235105700000001"
            ...
        }
    
    Plan: 0 to add, 1 to change, 0 to destroy.
    
    ------------------------------------------------------------------------
    
    Note: You didn't specify an "-out" parameter to save this plan, so Terraform
    can't guarantee that exactly these actions will be performed if
    "terraform apply" is subsequently run.

    Para manter a consistência entre o modelo e o estado do recurso, adicione manualmente as definições de parâmetros ausentes no modelo até que nenhuma atualização apareça ao executar o comando plan.

    resource "alicloud_slb" "this" {
      delete_protection = "on"
      name              = "for_demo-test"
    }

    Adicione os campos que causam a atualização. Após completar as definições de parâmetros, execute o comando plan para verificar os resultados.

    $ terraform plan
    Refreshing Terraform state in-memory prior to plan...
    The refreshed state will be used to calculate this plan, but will not be
    persisted to local or remote state storage.
    
    data.alicloud_slbs.default: Refreshing state...
    alicloud_slb.this: Refreshing state... [id=lb-gw8vinrqtqx1ro1r94c96]
    
    ------------------------------------------------------------------------
    
    No changes. Infrastructure is up-to-date.
    
    This means that Terraform did not detect any differences between your
    configuration and real physical resources that exist. As a result, no
    actions need to be performed.

    A mensagem acima indica que nenhuma alteração adicional é necessária e que o processo de importação do recurso foi concluído.

Remover recursos existentes

Na prática, alguns problemas podem ocorrer: importação de recursos incorretos, importação para caminhos errados, necessidade de modificar caminhos de recursos ou retenção permanente de certos recursos. Uma solução simples para esses casos consiste em remover os recursos importados do estado e importá-los novamente.

Use o comando state rm para remover recursos. O formato completo do comando é terraform state rm <Resource type>.<Resource name>.

$ terraform state rm alicloud_slb.this
Removed alicloud_slb.this
Successfully removed 1 resource instance(s).

O comando state rm remove apenas o recurso especificado do arquivo de estado, sem excluí-lo fisicamente. Portanto, você pode importar os recursos novamente.

Resumo

As soluções a seguir atendem aos quatro cenários descritos anteriormente:

  • Solução para o cenário 1:

    Execute o comando terraform import para importar recursos existentes e gerenciá-los centralizadamente com o Terraform.

  • Solução para o cenário 2:

    Determine os valores das propriedades dos parâmetros. Para usar os valores do modelo, execute o comando apply e depois altere os valores. Caso prefira os valores do console web, adicione ou modifique os valores diretamente no modelo.

  • Solução para o cenário 3:

    Execute o comando terraform state rm para remover do estado todos os recursos que serão reconstruídos. Em seguida, execute o comando terraform import para importar os recursos.

  • Solução para o cenário 4:

    De forma semelhante à solução do cenário 3, remova os recursos e importe-os novamente.

O Terraform oferece comandos simples. O comando terraform import permite o gerenciamento centralizado de recursos existentes, baseando-se no princípio de que o modelo e o estado devem ter conteúdo consistente. Assim, não é preciso se preocupar se os recursos estão fora do sistema de gerenciamento do Terraform ou se foram removidos do estado.