EXIGENCES CRITIQUES DE RÉUSSITE
La sortie de migration DOIT respecter tous les critères suivants :
-
Couverture Complète des Ressources
- Chaque ressource CloudFormation synthétisée par CDK DOIT :
- Être représentée dans le programme Pulumi OU
- Être explicitement justifiée dans le rapport final.
- Chaque ressource CloudFormation synthétisée par CDK DOIT :
-
Déploiement Réussi
- Le programme Pulumi produit doit être structurellement valide et capable d'une
pulumi upréussie (en supposant une configuration appropriée).
- Le programme Pulumi produit doit être structurellement valide et capable d'une
-
Rapport de Migration Final
- Toujours produire un rapport de migration formel adapté à une Pull Request.
- Inclure :
- Mappage des ressources CDK → Pulumi
- Décisions sur les providers (aws-native vs aws)
- Différences comportementales
- Étapes manquantes ou requérant une action manuelle
- Instructions de validation
QUAND L'INFORMATION EST MANQUANTE
Si un projet CDK fourni par l'utilisateur est incomplet, ambigu ou manque d'artefacts (comme cdk.out), posez des questions ciblées avant de générer le code Pulumi.
FLUX DE MIGRATION
Suivez exactement ce flux de travail et dans cet ordre :
1. COLLECTE D'INFORMATIONS
1.1 Vérifier les Identifiants AWS (ESC)
L'exécution de commandes AWS (p. ex. aws cloudformation list-stack-resources) et de commandes CDK (p. ex. cdk synth) nécessite des identifiants chargés via Pulumi ESC.
- Si l'utilisateur a déjà fourni un environnement ESC, utilisez-le.
- Si aucun environnement ESC n'est spécifié, demandez à l'utilisateur quel environnement ESC utiliser avant de poursuivre avec les commandes AWS.
Vous DEVEZ confirmer la région AWS avec l'utilisateur. Les résultats de cdk synth peuvent être incorrects s'ils sont exécutés avec la mauvaise région AWS.
1.2 Synthétiser le CDK
Exécutez/inspectez :
npx cdk synth --quiet
- TOUJOURS exécuter
synthavec--quietpour éviter que le template ne soit affiché sur stdout.
En cas d'échec, inspectez cdk.json ou package.json pour les comportements de synth personnalisés.
1.3 Identifier les Stacks & Environnements CDK
Lisez cdk.out/manifest.json :
jq '.artifacts | to_entries | map(select(.value.type == "aws:cloudformation:stack") | {displayName: .key, environment: .value.environment}) | .[]' cdk.out/manifest.json
Exemple de sortie :
{
"displayName": "DataStack-dev",
"environment": "aws://616138583583/us-east-2"
}
{
"displayName": "AppStack-dev",
"environment": "aws://616138583583/us-east-2"
}
Dans le stack Pulumi que vous créez, vous DEVEZ définir les variables de configuration aws:region et aws-native:region. Par exemple :
pulumi config set aws-native:region us-east-2 --stack dev
pulumi config set aws:region us-east-2 --stack dev
1.4 Créer un Inventaire des Ressources
Pour chaque stack :
aws cloudformation list-stack-resources \
--region <region> \
--stack-name <stack> \
--output json
1.5 Analyser la Structure CDK
Extrayez :
- Conditions spécifiques à l'environnement
- Dépendances entre stacks et références croisées
- Configuration à l'exécution (contexte/variables d'environnement)
- Types de constructs (L1, L2, L3)
2. CONVERSION DE CODE (CDK → PULUMI)
- Effectuez la conversion initiale à l'aide de l'outil
cdk2pulumi. Suivez cdk-convert.md pour effectuer la conversion. - Lisez le rapport de conversion et comblezles lacunes. Par exemple, si la conversion échoue à convertir une ressource, vous devez la convertir manuellement.
2.1 Gestion des Ressources Personnalisées
CDK utilise les Custom Resources sauvegardées par Lambda pour les fonctionnalités non disponibles dans CloudFormation. Dans les CloudFormation synthétisés, elles apparaissent comme :
- Type de ressource :
AWS::CloudFormation::CustomResourceouCustom::<name> - Les métadonnées contiennent
aws:cdk:pathavec le nom du handler (p. ex.aws-s3/auto-delete-objects-handler)
Comportement par défaut : cdk2pulumi réécrit les ressources personnalisées en aws-native:cloudformation:CustomResourceEmulator, qui invoque le Lambda original. Cela fonctionne mais comporte des compromis (dépendance Lambda, cold starts, cohérence finale).
Stratégies de migration par type de handler :
| Handler | Stratégie |
|---|---|
aws-certificatemanager/dns-validated-certificate-handler |
Remplacer par aws.acm.Certificate, aws.route53.Record et aws.acm.CertificateValidation |
aws-ec2/restrict-default-security-group-handler |
Remplacer par la ressource aws.ec2.DefaultSecurityGroup avec des règles d'ingress/egress vides |
aws-ecr/auto-delete-images-handler |
Remplacer aws-native:ecr:Repository par aws.ecr.Repository avec forceDelete: true |
aws-s3/auto-delete-objects-handler |
Remplacer aws-native:s3:Bucket par aws.s3.Bucket avec forceDestroy: true |
aws-s3/notifications-resource-handler |
Remplacer par aws.s3.BucketNotification |
aws-logs/log-retention-handler |
Remplacer par aws.cloudwatch.LogGroup avec retentionInDays explicite |
aws-iam/oidc-handler |
Remplacer par aws.iam.OpenIdConnectProvider |
aws-route53/delete-existing-record-set-handler |
Remplacer par aws.route53.Record avec allowOverwrite: true |
aws-dynamodb/replica-handler |
Remplacer par aws.dynamodb.TableReplica |
Handlers multi-comptes/régions :
aws-cloudfront/edge-function→ Utiliseraws.lambda.Functionavecregion: "us-east-1"aws-route53/cross-account-zone-delegation-handler→ Utiliser un provider aws distinct avec assomption de rôle inter-comptes
Dégradation gracieuse pour les handlers inconnus :
- Conservez le
CustomResourceEmulator(comportement par défaut) - Documentez la ressource personnalisée dans le rapport de migration avec :
- Nom et objectif du handler original (si discernible à partir du chemin CDK)
- Note indiquant qu'elle utilise l'invocation Lambda à l'exécution
- Recommandation pour l'utilisateur d'examiner les remplacements natifs potentiels
2.2 Stratégie de Provider
- Par défaut : Utiliser
aws-nativechaque fois que le type de ressource est disponible. - Solution de secours : Utiliser
awsquand aws-native ne supporte pas les fonctionnalités équivalentes.
2.3 Assets et Bundling
CDK utilise Assets et Bundling pour gérer les artefacts de déploiement. Ceux-ci sont traités par la CLI CDK avant le déploiement CloudFormation et apparaissent dans le répertoire cdk.out aux côtés des fichiers de métadonnées *.assets.json. Les templates CloudFormation contiennent des références codées en dur aux emplacements des assets (bucket/clé S3 ou repo/tag ECR).
# Inspecter les définitions d'asset
jq '.files, .dockerImages' cdk.out/*.assets.json
Stratégies de migration par type d'asset :
| Type d'Asset | Détection | Migration Pulumi |
|---|---|---|
| Docker Image | dockerImages dans assets.json |
Utiliser docker-build.Image pour compiler et pousser. Remplacer l'URI ECR codée en dur par la sortie d'image. |
| Fichier avec commande de compilation | files avec champ executable |
Signaler à l'utilisateur - la commande de compilation nécessite une configuration dans Pulumi |
| Fichier statique | files sans executable, pas de bundling dans la source CDK |
Utiliser pulumi.FileArchive ou pulumi.FileAsset |
| Fichier bundlé | files sans executable, mais la source CDK utilise le bundling |
Signaler à l'utilisateur - le bundling nécessite une configuration dans Pulumi |
Détecter le Bundling dans la Source CDK :
Vérifiez le code source CDK pour les constructs de bundling (NodejsFunction, PythonFunction, GoFunction, ou ressources utilisant l'option bundling). Si le bundling est utilisé, l'étape de compilation doit être répliquée dans Pulumi pour le développement continu - sinon les changements source nécessiteraient de réexécuter manuellement cdk synth.
Quand le bundling est détecté, informez l'utilisateur :
Étape de Compilation Détectée : Cette application CDK utilise <BUNDLING_TYPE> qui compile des artefacts déployables lors de la synthèse. Cette étape de compilation doit être répliquée dans Pulumi pour le développement continu.
Options :
- Pipeline CI/CD (Recommandé) : Déplacer l'étape de compilation vers votre pipeline CI et référencer l'artefact pré-compilé dans Pulumi
- Provider Command Pulumi : Utiliser
command.local.Commandpour exécuter la commande de compilation lors depulumi up- Script de pré-compilation : Créer un script de compilation qui s'exécute avant
pulumi upet exporte vers un emplacement connuChaque option comporte des compromis autour de la mise en cache, de la reproductibilité et de la vitesse de déploiement. Pour les charges de travail en production, l'option 1 est généralement préférée.
2.4 Gestion de TypeScript pour aws-native
Les sorties aws-native contiennent souvent undefined. Éviter les assertions non-null !. Toujours déballer en toute sécurité avec .apply() :
// ❌ FAUX - Causera des erreurs TypeScript
functionName: lambdaFunction.functionName!,
// ✅ CORRECT - Gérer undefined en toute sécurité
functionName: lambdaFunction.functionName.apply(name => name || ""),
2.5 Préservation de la Logique d'Environnement
Reporter tous les comportements conditionnels :
if (currentEnv.createVpc) {
// créer des ressources
} else {
const vpcId = pulumi.output(currentEnv.vpcId);
}
3. Importation de Ressources (optionnel)
Après la conversion, vous pouvez optionnellement importer les ressources existantes pour qu'elles soient désormais gérées par Pulumi. Si l'utilisateur ne demande pas cela, vous devriez suggérer cela comme étape de suivi à la conversion.
- Toujours commencer par une importation automatisée à l'aide de l'outil
cdk-importer. Suivez cdk-importer.md pour effectuer l'importation automatisée. - Pour toute ressource qui échoue à s'importer avec l'outil automatisé, l'importer manuellement.
Si vous devez importer des ressources manuellement :
-
Suivez cloudformation-id-lookup.md pour rechercher les identifiants d'importation CloudFormation.
-
Utilisez l'outil web-fetch pour obtenir le contenu de la documentation officielle Pulumi.
-
Trouver les IDs d'importation AWS -> https://www.pulumi.com/docs/iac/guides/migration/aws-import-ids/
-
Approches de migration manuelle -> https://www.pulumi.com/docs/iac/guides/migration/migrating-to-pulumi/migrating-from-cdk/migrating-existing-cdk-app/#approach-b-manual-migration
3.1 Exécuter preview après l'importation
Après avoir effectué une importation, vous devez exécuter pulumi preview pour vous assurer qu'il n'y a aucun changement. Aucun changement signifie :
- PAS de mises à jour
- PAS de remplacements
- PAS de créations
- PAS de suppressions
S'il y a des changements, vous devez investiguer et mettre à jour le programme jusqu'à ce qu'il n'y ait aucun changement.
Travailler avec l'Utilisateur
Si l'utilisateur demande de l'aide pour planifier ou effectuer une migration CDK vers Pulumi, utilisez les informations ci-dessus pour guider l'utilisateur vers l'approche de migration automatisée.
Pour la Documentation Détaillée
Quand l'utilisateur veut s'écarter du chemin recommandé ci-dessus, utilisez l'outil web-fetch pour obtenir du contenu de la documentation officielle Pulumi -> https://www.pulumi.com/docs/iac/guides/migration/migrating-to-pulumi/migrating-from-cdk/migrating-existing-cdk-app
Cette documentation couvre les sujets :
- Stratégie de migration
- Convertir vs. Réécrire
- Importer vs. Réhydrater
- Bonnes pratiques
- Gérer Plusieurs Stacks CDK
- Gérer les Stages CDK
- Organisation du code
- Conversion des Constructs CDK
- Stratégies d'Exécution
- Migration Automatisée (recommandée)
- Migration Manuelle
FORMAT DE SORTIE (REQUIS)
Lors de l'exécution d'une migration, toujours produire :
- Aperçu (description générale)
- Résumé du Plan de Migration
- Sorties de Code Pulumi (TypeScript ; structurées par fichier)
- Tableau de Mappage des Ressources (CDK → Pulumi)
- Résumé des Ressources Personnalisées (le cas échéant) :
- Handlers migrés vers les ressources Pulumi natives
- Handlers conservés comme
CustomResourceEmulatoravec justification - Tous les handlers nécessitant l'attention de l'utilisateur
- Résumé Assets & Bundling (le cas échéant) :
- Migrés : Assets convertis avec succès (p. ex. images Docker →
docker-build.Image, fichiers statiques →pulumi.FileArchive) - Nécessite attention : Assets avec étapes de bundling, options présentées et décision si prise
- Migrés : Assets convertis avec succès (p. ex. images Docker →
- Rapport de Migration Final (prêt pour PR)
- Étapes Suivantes (refactorisations optionnelles)
Garder le code syntaxiquement valide et clairement séparé par fichiers.