Converter as configurações do Deployment Manager com a DM Convert

Esta página descreve o processo de uso da DM Convert para converter as configurações do Deployment Manager no modelo de recursos do Kubernetes (KRM) ou no Terraform.

Configurar o ambiente

Configurar as variáveis de ambiente

Salve as seguintes variáveis de ambiente, que são usadas no restante deste guia:

export PROJECT_ID=$(gcloud config get-value project) \
export DM_CONVERT_IMAGE="us-central1-docker.pkg.dev/\
dm-convert-host/deployment-manager/dm-convert:public-preview"

Configurar suas ferramentas

Você precisa ter acesso às seguintes ferramentas:

  • gcloud

  • docker

  • kubectl

  • bq

  • jq

Se você usa o Cloud Shell para executar a conversão direta, já tem acesso a eles.

Abrir no Cloud Shell

Converter suas configurações

Em geral, você migra sua configuração do Deployment Manager para o Terraform ou o KRM da seguinte maneira:

  1. Preparar uma implantação do Deployment Manager para a conversão.

  2. converter a configuração no formato HCL (HashiCorp, para Terraform) ou formato KRM (Kubernetes Resource Model).

  3. Como usar o Terraform ou o Config Connector para aplicar a configuração convertida.

  4. Como abandonar a implantação atual do Deployment Manager.

Preparar a implantação atual

O DM Convert opera em arquivos de configuração e modelos do Deployment Manager. Ao longo do guia, esses arquivos serão criados e salvos localmente como entrada para a ferramenta DM Convert.

Você pode criar um arquivo de configuração ou adquirir uma configuração de uma implantação ativa.

Converter um arquivo de configuração

Você pode usar a configuração de amostra a seguir para testar o conversor. Substitua PROJECT_ID pelo ID do projeto do Google Cloud e salve o conteúdo abaixo em um arquivo chamado deployment.yaml:

  resources:
  - name: bigquerydataset
    type: bigquery.v2.dataset
    properties:
      datasetReference:
        datasetId: bigquerydataset
        projectId: PROJECT_ID
      defaultTableExpirationMs: 36000000
      location: us-west1
  - type: bigquery.v2.table
    name: bigquerytable
    properties:
      datasetId: bigquerydataset
      labels:
        data-source: external
        schema-type: auto-junk
      tableReference:
        projectId: PROJECT_ID
        tableId: bigquerytable
    metadata:
      dependsOn:
      - bigquerydataset
  • Adquirir uma configuração de uma implantação ativa

    Se você quiser adquirir e converter a configuração de uma implantação ativa, poderá recuperar a configuração expandida e salvá-la no disco executando os seguintes comandos, substituindo DEPLOYMENT_NAME pelo nome: implantação.

    # Configure your project/deployment
    DEPLOYMENT_NAME=DEPLOYMENT_NAME
    PROJECT_ID=PROJECT_ID
    
    # Fetch the latest manifest for the given deployment
    gcloud deployment-manager deployments describe $DEPLOYMENT_NAME \
      --project $PROJECT_ID --format="value(deployment.manifest)"
    https://www.googleapis.com/deploymentmanager/v2/projects/$PROJECT_ID/global/deployments/bq/manifests/manifest-1618872644848
    
    # The manifest name is the last path segment from the URI
    # in the above command output
    MANIFEST_NAME="manifest-1618872644848"
    # Save the expanded manifest to deployment.yaml
    gcloud deployment-manager manifests describe $MANIFEST_NAME \
      --deployment $DEPLOYMENT_NAME --project $PROJECT_ID \
      --format="value(expandedConfig)" > deployment.yaml
    

Converter a implantação

Para converter os recursos em deployment.yaml para o formato HCL ou KRM e salvá-los como saídas convertidas, execute o seguinte comando no mesmo diretório que deployment.yaml com as substituições desejadas:

CONVERTED_RESOURCES=OUTPUT_FILE

docker run --rm -it --workdir=/convert \
--volume=$(pwd):/convert \
$DM_CONVERT_IMAGE \
--config deployment.yaml \
--output_format OUTPUT_FORMAT \
--output_file OUTPUT_FILE \
--output_tf_import_file OUTPUT_IMPORT_FILE \
--deployment_name DEPLOYMENT_NAME \
--project_id $PROJECT_ID

Faça as seguintes substituições:

  • OUTPUT_FORMAT: o formato de saída da conversão. Pode ser TF para o Terraform ou KRM para o KRM.

  • OUTPUT_FILE: o nome do arquivo em que a saída convertida é salva.

  • (Somente Terraform) OUTPUT_IMPORT_FILE: o nome do arquivo em que os comandos de importação do Terraform são salvos. Se uma flag project_id for especificada, os comandos de importação serão gerados com base nessa flag. Se uma flag project_id não for especificada, os comandos de importação serão gerados com base no atributo projectId da configuração do recurso.

  • DEPLOYMENT_NAME: o nome da implantação. Isso é relevante se você estiver usando modelos na configuração do Deployment Manager e também a variável de ambiente deployment. Para mais informações, acesse Como usar uma variável de ambiente.

Conferir as conversões

# Print output file
cat OUTPUT_FILE

Aplicar a configuração convertida

Terraform

Configurar o Terraform

# Configure default project
cat <<EOF > echo > main.tf
provider "google" {
  project = "$PROJECT_ID"
}
EOF

Depois de converter os recursos do Deployment Manager para o Terraform, é possível usar o Terraform para criar recursos implantando diretamente a configuração convertida.

Implantar a configuração convertida usando o Terraform

# NOTE: if Terraform state gets corrupted during testing,
# use init --reconfigure to reset backend
terraform init
echo "***************  TERRAFORM PLAN  ******************"
terraform plan
echo "**************  TERRAFORM APPLY  ******************"
terraform apply

(Opcional) Importar recursos atuais

Se você estiver convertendo uma implantação atual e quiser usar o Terraform para gerenciar os recursos sem fazer uma nova implantação, use o recurso de importação do Terraform.

Nesta seção, você vai usar deployment.yaml para o processo de importação.

Inicialize o Terraform:

# NOTE: if Terraform state gets corrupted during testing,
# use init --reconfigure to reset backend
terraform init

Os comandos de importação são gerados e salvos em OUTPUT_IMPORT_FILE. Para conferir o conteúdo, execute o seguinte comando:

cat OUTPUT_IMPORT_FILE

Para importar os recursos de deployment.yaml, execute o seguinte comando:

# Make the import file executable
chmod +x OUTPUT_IMPORT_FILE
# Perform the import
./OUTPUT_IMPORT_FILE

Depois de importar os recursos para o estado do Terraform, é possível verificar se há mudanças entre o estado e a configuração gerada do Terraform executando o comando plan do Terraform:

terraform plan

Isso produz o seguinte resultado:

Terraform will perform the following actions:

# google_bigquery_dataset.bigquerydataset will be updated in-place
~ resource "google_bigquery_dataset" "bigquerydataset" {
    ...
    ~ labels = {
        # the label value will be based on the deployment name and may not
        # match
        - "goog-dm" = "bq-for-import" -> null
      }
    ...
  }

# google_bigquery_table.bigquerytable will be updated in-place
~ resource "google_bigquery_table" "bigquerytable" {
    ...
    ~ labels = {
        # the label value will be based on the deployment name and may not
        # match
        - "goog-dm" = "bq-for-import" -> null
      }
    ...
  }

Plan: 0 to add, 2 to change, 0 to destroy.

Aceite essa mudança no plano do Terraform, já que ela remove rótulos específicos do Deployment Manager, ou seja, goog-dm, que não são necessários quando os recursos são gerenciados pelo Terraform.

Para aplicar a configuração do Terraform, execute o seguinte comando:

# Accept changes by entering yes when prompted
terraform apply

Agora, todos os recursos definidos em deployment.yaml estão sob gerenciamento do Terraform.

Por exemplo, se você quiser verificar se o Terraform está gerenciando os recursos convertidos, faça uma pequena mudança na configuração do Terraform modificando o tempo de expiração padrão da tabela no recurso google_bigquery_dataset.bigquerydataset:

...
# change from 10 hrs to 12 hrs
default_table_expiration_ms = 43200000
...

Depois de fazer as mudanças, é possível aplicar a configuração do Terraform e usar a interface de linha de comando (CLI) bq para verificar as mudanças:

# Accept changes by entering yes when prompted
terraform apply
# Access the dataset properties via bq to verify the changes
bq show --format=prettyjson bigquerydataset | jq '.defaultTableExpirationMs'

A saída recebida deve corresponder aos valores fornecidos na configuração atualizada do Terraform, confirmando que ele agora está gerenciando esses recursos.

KRM

Configurar o Config Connector

Para ativar os recursos nos arquivos de configuração do KRM, você precisa de um cluster do Kubernetes com o Config Connector instalado. Para criar um cluster de teste, consulte Como instalar com o complemento do GKE.

No Cloud Shell, verifique se as credenciais kubectl estão configuradas para o cluster do GKE que você quer usar. Substitua GKE_CLUSTER pelo nome do cluster e execute o seguinte comando:

gcloud container clusters get-credentials GKE_CLUSTER

Implante sua configuração de KRM convertida usando kubectl.

Para implantar a configuração de KRM convertida usando kubectl, execute os seguintes comandos:

# Ensure that the namespace is annotated to create resources in the correct
# project/folder/organization. https://cloud.google.com/config-connector/docs/how-to/install-upgrade-uninstall#specify
kubectl apply -n CONFIG_CONNECTOR_NAMESPACE \
  -f OUTPUT_FILE

# Wait for the resources to become healthy
kubectl wait -n CONFIG_CONNECTOR_NAMESPACE \
  --for=condition=Ready \
  --timeout=5m -f OUTPUT_FILE

Limpar

Limpar o conjunto de dados e a tabela de amostra

Terraform

# NOTE: if Terraform state gets corrupted during testing,
# use init --reconfigure to reset backend
echo "***************  TERRAFORM INIT  ******************"
terraform init
# Remove delete protection on BigQuery table
sed -i "/resource \"google_bigquery_table\"/a deletion_protection=\"false\"" \
OUTPUT_FILE
terraform apply
echo "***************  TERRAFORM DESTROY ****************"
terraform destroy

KRM

Para limpar o conjunto de dados e a tabela do BigQuery da configuração de amostra, execute:

# If the resource was created via Config Connector:
kubectl delete -n CONFIG_CONNECTOR_NAMESPACE \
  -f OUTPUT_FILE

Abandonar a implantação de exemplo do Deployment Manager

Para abandonar uma implantação ativa que você converteu para KRM ou Terraform, execute:

gcloud deployment-manager deployments delete DEPLOYMENT_NAME --delete-policy ABANDON

Recursos com suporte para conversão

Terraform

Para listar os recursos compatíveis com o Terraform, execute o seguinte comando:

docker run --rm -it \
us-central1-docker.pkg.dev/dm-convert-host/deployment-manager/dm-convert:public-preview \
--output_format tf \
--list_supported_types

KRM

Para listar os recursos com suporte para o KRM, execute o seguinte comando:

docker run --rm -it \
us-central1-docker.pkg.dev/dm-convert-host/deployment-manager/dm-convert:public-preview \
--output_format krm \
--list_supported_types

Próximas etapas

Leia as práticas recomendadas e recomendações para a configuração convertida.