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:
Crie um módulo personalizado com os recursos exportados pelo DM Convert. Isso oferece mais flexibilidade.
Use um módulo publicado da coleção de módulos oficiais ou do registro do Terraform. Google Cloud
Para a maioria dos casos de uso, recomendamos que você use um módulo publicado.
Criar um módulo personalizado
Depois de converter a configuração, identifique os recursos que você quer mover para um módulo.
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_datasetegoogle_bigquery_tablepara 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 }No arquivo
main.tfexportado, 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" }Para inicializar o módulo local, execute o seguinte comando:
terraform initMova 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.bigquerytablePara 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).Para validar se nenhum recurso foi alterado, execute o seguinte comando:
terraform planConfira 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
Depois de converter a configuração, identifique um módulo publicado e os recursos que você quer mover para ele.
Identifique as opções de configuração do módulo lendo a documentação dele.
Crie uma instância do módulo configurada para a configuração de recursos atual.
Por exemplo, se você quiser mover
google_bigquery_datasetegoogle_bigquery_tablepara 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" }, } ] }Para inicializar o módulo local, execute o seguinte comando:
terraform initLeia 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"]'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.