Práticas recomendadas para usar a DM Convert

Práticas recomendadas para a conversão para o Terraform

Estado

O arquivo de estado armazena informações sobre os recursos gerenciados pelo Terraform. Por padrão, o Terraform armazena estado localmente no disco. Se você armazenar o estado remotamente, poderá permitir a colaboração distribuída, proteger informações sensíveis e executar o Terraform na integração contínua (CI).

Depois de converter o modelo do Deployment Manager para o Terraform e opcionalmente importar recursos, recomendamos que você siga as etapas para armazenar o estado remotamente no Cloud Storage.

Módulos

Se você quiser reduzir a complexidade, aplicar a consistência e promover a reutilização da configuração, use os módulos do Terraform para encapsular coleções de recursos.

Para usar módulos, faça uma destas ações:

Para a maioria dos casos de uso, recomendamos que você use um módulo publicado.

Criar um módulo personalizado

  1. Depois de converter a configuração, identifique os recursos que você quer mover para um módulo.

  2. Mova as configurações desses recursos para um diretório de módulo e converta as variáveis necessárias em parâmetros.

    O exemplo a seguir mostra como mover google_bigquery_dataset e google_bigquery_table para um módulo:

    # bq-module/main.tf
    resource "google_bigquery_dataset" "bigquerydataset" {
      provider = google-beta
    
      default_table_expiration_ms = 36000000
      location = "us-west1"
      dataset_id = var.dataset_id
      project = var.project_id
    }
    
    resource "google_bigquery_table" "bigquerytable" {
      provider = google-beta
    
      labels = {
        data-source = "external"
        schema-type = "auto-junk"
      }
      dataset_id = var.dataset_id
      project = var.project_id
      table_id = var.table_id
    
      depends_on = [
        google_bigquery_dataset.bigquerydataset
      ]
    }
    
    # bq-module/variables.tf
    variable "project_id" {
      description = "Project ID"
      type = string
    }
    
    variable "dataset_id" {
      description = "Dataset ID"
      type = string
    }
    
    variable "table_id" {
      description = "Table ID"
      type = string
    }
    
  3. No arquivo main.tf exportado, substitua a configuração original pelo módulo criado.

    O exemplo a seguir mostra essa substituição usando o módulo criado no exemplo da etapa anterior.

    # main.tf
    module "bq" {
      source = "./bq-module"
    
      project_id = "PROJECT_ID"
      dataset_id = "bigquerydataset"
      table_id   = "bigquerytable"
    }
    
  4. Para inicializar o módulo local, execute o seguinte comando:

    terraform init
    
  5. Mova o estado do Terraform associado aos recursos para a instância do módulo.

    Para mover o módulo do exemplo na etapa anterior, execute o seguinte comando:

    terraform state mv google_bigquery_dataset.bigquerydataset module.bq.google_bigquery_dataset.bigquerydataset
    terraform state mv google_bigquery_table.bigquerytable module.bq.google_bigquery_table.bigquerytable
    

    Para este exemplo, a saída da movimentação é:

    Move "google_bigquery_dataset.bigquerydataset" to "module.bq.google_bigquery_dataset.bigquerydataset"
    Successfully moved 1 object(s).
    Move "google_bigquery_table.bigquerytable" to "module.bq.google_bigquery_table.bigquerytable"
    Successfully moved 1 object(s).
    
  6. Para validar se nenhum recurso foi alterado, execute o seguinte comando:

    terraform plan
    

    Confira um exemplo da saída recebida após a execução do comando:

    No changes. Your infrastructure matches the configuration.
    

Usar um módulo publicado

  1. Depois de converter a configuração, identifique um módulo publicado e os recursos que você quer mover para ele.

  2. Identifique as opções de configuração do módulo lendo a documentação dele.

  3. Crie uma instância do módulo configurada para a configuração de recursos atual.

    Por exemplo, se você quiser mover google_bigquery_dataset e google_bigquery_table para o módulo oficial do BigQuery , o exemplo a seguir mostra como o módulo pode ser:

    module "bq" {
      source  = "terraform-google-modules/bigquery/google"
      version = "~> 5.0"
    
      project_id          = "PROJECT_ID"
      dataset_id          = "bigquerydataset"
      location            = "us-west1"
      deletion_protection = true
    
      tables = [
        {
          table_id           = "bigquerytable",
          friendly_name      = "bigquerytable"
          time_partitioning  = null,
          range_partitioning = null,
          expiration_time    = null,
          clustering         = [],
          schema             = null,
          labels = {
            data-source = "external"
            schema-type = "auto-junk"
          },
        }
      ]
    }
    
  4. Para inicializar o módulo local, execute o seguinte comando:

    terraform init
    
  5. Leia o código-fonte do módulo para identificar os endereços de recursos no módulo upstream e construir os comandos de movimentação.

    terraform state mv google_bigquery_dataset.bigquerydataset  module.bq.google_bigquery_dataset.main
    terraform state mv google_bigquery_table.bigquerytable 'module.bq.google_bigquery_table.main["bigquerytable"]'
    
  6. Para conferir as mudanças na configuração, execute o seguinte comando:

    terraform plan
    

Se o módulo publicado selecionado tiver configurações padrão diferentes ou for configurado de maneira diferente da sua configuração, você poderá ver as diferenças destacadas na saída da execução do comando.

Atuação

Recomendamos o uso de um sistema de integração contínua (CI), como o Cloud Build, o Jenkins ou o GitHub Actions, para automatizar a execução do Terraform em grande escala. Para mais informações, acesse Como gerenciar a infraestrutura como código com o Terraform, o Cloud Build e o GitOps.

Se você quiser inicializar a criação de acionadores e simplificar a autenticação, use o blueprint do espaço de trabalho do Cloud Build.

Estrutura

Cada configuração convertida do DM Convert é uma única configuração raiz mapeada para um único arquivo de estado. Não recomendamos configurar um único arquivo de estado para armazenar um grande número de recursos. Depois de converter a configuração, recomendamos que você garanta que a nova configuração siga as práticas recomendadas para módulos raiz.