Convertir vos configurations Deployment Manager avec DM Convert

Cette page décrit comment utiliser DM Convert pour convertir vos configurations Deployment Manager en modèle de ressource Kubernetes (KRM) ou Terraform.

Configurer votre environnement

Configurer vos variables d'environnement

Enregistrez les variables d'environnement suivantes utilisées par le reste de ce guide :

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"

Configurer vos outils

Vous devez avoir accès aux outils suivants :

  • gcloud

  • docker

  • kubectl

  • bq

  • jq

Si vous utilisez Cloud Shell pour exécuter DM Convert, vous y avez déjà accès.

Ouvrir dans Cloud Shell

Convertir vos configurations

En règle générale, vous devez migrer votre configuration Deployment Manager vers Terraform ou KRM en procédant comme suit :

  1. Préparer un déploiement Deployment Manager pour la conversion.

  2. Convertir la configuration au format HCL (langage de configuration HashiCorp, pour Terraform) ou KRM (modèle de ressource Kubernetes).

  3. Utiliser Terraform ou Config Connector pour appliquer la configuration convertie.

  4. Abandonner le déploiement Deployment Manager existant.

Préparer votre déploiement existant

DM Convert fonctionne sur les modèles et les fichiers de configuration de Deployment Manager. Tout au long du guide, ces fichiers seront créés et enregistrés localement en tant qu'entrées pour l'outil DM Convert.

Vous pouvez créer vous-même un fichier de configuration ou acquérir une configuration à partir d'un déploiement actif.

Convertir un fichier de configuration

Vous pouvez utiliser l'exemple de configuration suivant pour essayer le convertisseur. Remplacez PROJECT_ID par l'ID de votre projet Google Cloud et enregistrez le contenu ci-dessous dans un fichier nommé 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
  • Obtenir une configuration à partir d'un déploiement en cours

    Si vous souhaitez acquérir et convertir la configuration d'un déploiement en cours, vous pouvez récupérer la configuration étendue et l'enregistrer sur le disque en exécutant les commandes suivantes et en remplaçant DEPLOYMENT_NAME par le nom du déploiement.

    # 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
    

Convertir le déploiement

Pour convertir des ressources deployment.yaml au format HCL ou KRM et les enregistrer en tant que sorties converties, exécutez la commande suivante dans le même répertoire que deployment.yaml avec les substitutions souhaitées:

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

Effectuez les substitutions suivantes :

  • OUTPUT_FORMAT : format de sortie de la conversion. Il peut s'agir de TF pour Terraform ou de KRM pour KRM.

  • OUTPUT_FILE: nom du fichier dans lequel la sortie convertie est enregistrée.

  • (Terraform uniquement) OUTPUT_IMPORT_FILE: nom du fichier dans lequel les commandes d'importation Terraform sont enregistrées. Si un indicateur project_id est spécifié, les commandes d'importation sont générées à partir de cet indicateur. Si aucun indicateur project_id n'est spécifié, les commandes d'importation sont générées en fonction de l'attribut projectId à partir de la configuration de la ressource.

  • DEPLOYMENT_NAME : nom du déploiement. Cette information est utile si vous utilisez des modèles dans votre configuration Deployment Manager et que vous utilisez également la variable d'environnement deployment. Pour en savoir plus, consultez la section Utiliser une variable d'environnement.

Afficher les conversions

# Print output file
cat OUTPUT_FILE

Appliquer votre configuration convertie

Terraform

Configurer Terraform

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

Après avoir converti vos ressources Deployment Manager en Terraform, vous pouvez utiliser Terraform pour créer des ressources en déployant directement la configuration convertie.

Déployer votre configuration convertie à l'aide de 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

(Facultatif) Importer des ressources existantes

Si vous convertissez un déploiement existant et que vous souhaitez utiliser Terraform pour gérer ses ressources sans le redéployer, vous pouvez utiliser la fonctionnalité d'importation de Terraform.

Dans cette section, vous allez utiliser deployment.yaml pour le processus d'importation.

Initialisez Terraform :

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

Les commandes d'importation sont générées et enregistrées dans OUTPUT_IMPORT_FILE. Pour examiner son contenu, exécutez la commande suivante:

cat OUTPUT_IMPORT_FILE

Pour importer les ressources de deployment.yaml, exécutez la commande suivante:

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

Une fois que vous avez importé les ressources dans votre état Terraform, vous pouvez vérifier s'il existe des différences entre l'état et la configuration Terraform générée en exécutant la commande Terraform plan:

terraform plan

Vous obtenez le résultat suivant:

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.

Accepter cette modification dans le plan Terraform, car elle supprime les étiquettes spécifiques à Deployment Manager (c'est-à-dire goog-dm), qui ne sont pas nécessaires une fois que les ressources sont gérées par Terraform.

Pour appliquer la configuration Terraform, exécutez la commande suivante:

# Accept changes by entering yes when prompted
terraform apply

Toutes les ressources définies dans deployment.yaml sont maintenant gérées par Terraform.

Par exemple, si vous souhaitez vérifier que Terraform gère bien les ressources converties, vous pouvez modifier légèrement la configuration Terraform en modifiant le délai d'expiration de la table par défaut dans la ressource google_bigquery_dataset.bigquerydataset:

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

Une fois les modifications effectuées, vous pouvez appliquer la configuration Terraform et vérifier les modifications à l'aide de l'interface de ligne de commande (CLI) bq:

# 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'

Le résultat que vous recevez doit correspondre aux valeurs fournies dans la configuration Terraform mise à jour, ce qui confirme que Terraform gère désormais ces ressources.

KRM

Configurer Config Connector

Pour activer les ressources dans les fichiers de configuration KRM, vous avez besoin d'un cluster Kubernetes sur lequel Config Connector est installé. Pour créer un cluster de test, consultez la section Installer avec le module complémentaire GKE.

Dans Cloud Shell, assurez-vous que vos identifiants kubectl sont configurés pour le cluster GKE que vous souhaitez utiliser. Remplacez GKE_CLUSTER par le nom du cluster et exécutez la commande suivante :

gcloud container clusters get-credentials GKE_CLUSTER

Déployer votre configuration KRM convertie à l'aide de kubectl

Pour déployer votre configuration KRM convertie à l'aide de kubectl, exécutez les commandes suivantes :

# 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

Effectuer un nettoyage

Nettoyer les exemples d'ensemble de données et de table

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

Pour nettoyer l'ensemble de données et la table BigQuery de l'exemple de configuration, exécutez :

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

Abandonner l'exemple de déploiement Deployment Manager

Pour abandonner un déploiement en cours que vous avez réussi à convertir en KRM ou Terraform, exécutez :

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

Ressources compatibles avec la conversion

Terraform

Pour obtenir la liste des ressources compatibles avec Terraform, exécutez la commande suivante:

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

Pour obtenir la liste des ressources compatibles avec KRM, exécutez la commande suivante:

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

Étapes suivantes

Consultez les bonnes pratiques et recommandations pour la configuration convertie.