Práticas recomendadas de 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 state 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 em integração contínua (CI).
Depois de converter o modelo do Deployment Manager para o Terraform e 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 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 o seguinte:
Crie um módulo personalizado com os recursos exportados pelo Converter por DM. Isso oferece a maior flexibilidade.
Use um módulo publicado da coleção de módulos oficiais do Google Cloud ou do registro do Terraform.
Na maioria dos casos de uso, recomendamos usar um módulo publicado.
Criar um módulo personalizado
Depois de converter a configuração identificar quais recursos você quer mover para um módulo.
Mova as configurações desses recursos para um diretório de módulos. converter as variáveis obrigatórias em parâmetros.
O exemplo abaixo mostra como mover
google_bigquery_dataset
egoogle_bigquery_table
em 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.tf
exportado, substitua a configuração original pelo módulo que você criou.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 init
Mova o estado do Terraform associado aos recursos para a instância do módulo.
Para mover o módulo do exemplo da 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).
Execute o comando a seguir para confirmar que nenhum recurso foi alterado:
terraform plan
Confira a seguir um exemplo da saída que você recebe depois de executar o comando:
No changes. Your infrastructure matches the configuration.
Usar um módulo publicado
Depois de converter a configuração, faça o seguinte: identificar um módulo publicado e os recursos que você quer migrar para ela.
Identifique as opções de configuração do módulo lendo a documentação dele.
Criar uma instância do módulo configurado para seu recurso atual configuração do Terraform.
Por exemplo, se você quiser mover
google_bigquery_dataset
egoogle_bigquery_table
no nível oficial Módulo do BigQuery , o exemplo a seguir mostra a aparência do módulo: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 init
Leia o código-fonte do módulo para identificar endereços de recursos no módulo upstream e construir os comandos move.
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 ver as alterações na configuração, execute o seguinte comando:
terraform plan
Se o módulo publicado que você selecionou tiver configurações padrão diferentes ou estiver configurado de maneira diferente da sua configuração, você poderá ver 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 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 dar início à criação de acionadores e simplificar a autenticação, use o modelo 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 conter um grande número de recursos. Depois de converter a configuração, recomendamos que você verifique se a nova configuração segue as práticas recomendadas para módulos raiz.