Migration de Terraform vers Pulumi
Contraintes critiques — à lire avant d'agir :
- Ne PAS exécuter
pulumi convert— utiliser le plugin terraform-migrate à la place, qui préserve la correspondance d'état.- Ne PAS exécuter
pulumi package add terraform-module— ceci concerne un flux de travail différent.- Ne PAS créer le projet Pulumi sous
/workspace— le créer à l'intérieur du dépôt cloné.- Remplacer
${terraform_dir}et${pulumi_dir}ci-dessous par les chemins réels confirmés avec l'utilisateur.
Commencer par établir la portée et planifier la migration en travaillant avec l'utilisateur pour déterminer :
- où se trouvent les sources Terraform (
${terraform_dir}) - où se trouve le projet Pulumi migré (
${pulumi_dir}) - quel est le langage Pulumi cible (TypeScript, Python, YAML, etc.)
- si la migration vise à configurer les états de stack Pulumi, ou seulement à traduire le code source
Confirmer le plan avec l'utilisateur avant de procéder.
Créer un nouveau projet Pulumi dans ${pulumi_dir} dans le langage choisi. Éditer les sources pour qu'elles soient vides et ne déclarent aucune ressource. S'assurer qu'un stack Pulumi existe.
Vous devez exécuter l'outil pulumi_up avant de procéder pour vous assurer que l'état initial du stack est écrit.
Si aucun fichier .tfstate local n'existe dans ${terraform_dir}, l'état se trouve peut-être dans un backend distant (S3, Pulumi Cloud, Terraform Cloud, etc.). Le récupérer avant de procéder :
cd ${terraform_dir} && terraform state pull > terraform.tfstate
Cela fonctionne pour tous les backends, y compris Pulumi Cloud. Si terraform n'est pas disponible, essayer tofu state pull à la place.
Produire maintenant un brouillon de traduction d'état Pulumi :
pulumi plugin run terraform-migrate -- stack \
--from ${terraform_dir} \
--to ${pulumi_dir} \
--out /tmp/pulumi-state.json \
--plugins /tmp/required-providers.json
Ne PAS installer le plugin car il s'installera automatiquement selon les besoins.
Parfois le plugin terraform-migrate échoue parce que tofu refresh n'est pas autorisé. Ne PAS sauter cette étape. Travailler avec l'utilisateur pour trouver ou construire un environnement Pulumi ESC qui fournit les credentials nécessaires pour que la commande réussisse. Si la configuration d'un environnement ESC n'est pas possible, informer l'utilisateur que la migration ne peut pas se faire automatiquement.
Lire le fichier généré /tmp/required-providers.json et installer tous les fournisseurs Pulumi dans le nouveau projet, en respectant les versions suggérées même si elles rétrogradent un fournisseur déjà installé. Le fichier contiendra des enregistrements tels que [{"name":"aws","version":"7.12.0"}].
Installer les fournisseurs en tant que dépendances du projet en utilisant le gestionnaire de paquets spécifique au langage (NON pulumi plugin install, qui télécharge uniquement les plugins sans ajouter les dépendances) :
# TypeScript/JavaScript
npm install @pulumi/aws@7.12.0
# Python
pip install pulumi_aws==7.12.0
# Go
go get github.com/pulumi/pulumi-aws/sdk/v7@v7.12.0
# C#
dotnet add package Pulumi.Aws --version 7.12.0
Importer le brouillon d'état traduit (/tmp/pulumi-state.json) dans le stack Pulumi :
pulumi stack import --file /tmp/pulumi-state.json
Traduire le code source pour correspondre à la fois à la source Terraform et à l'état traduit. Viser une correspondance exacte. Vous pouvez consulter le brouillon d'état /tmp/pulumi-state.json pour les types et noms de ressources Pulumi à utiliser.
Itérer pour corriger le code source jusqu'à ce que l'outil pulumi_preview confirme qu'il n'y a aucune modification à faire et que la diff est vide ou presque vide. Les diffs de fournisseur ou de tags peuvent être acceptables.
Proposer à l'utilisateur de lier un environnement ESC au stack afin que chaque stack Pulumi ait accès aux credentials du fournisseur dont il a besoin de manière transparente.
Quand tout semble bon, créer une Pull Request avec le code source migré.