IMPORTANT: AJUSTEMENT DU PLAN REQUIS
Si vous avez déjà généré un plan de migration avant de charger cette skill, vous DEVEZ:
- Examiner votre plan existant par rapport aux workflows et exigences de cette skill
- Identifier les lacunes, étapes manquantes ou hypothèses incorrectes
- Mettre à jour et réviser votre plan pour l'aligner avec les recommandations de cette skill
- Communiquer le plan ajusté à l'utilisateur avant de procéder
EXIGENCES CRITIQUES DE SUCCÈS
La sortie de migration DOIT satisfaire tous les points suivants:
-
Couverture complète des ressources
- Chaque ressource CloudFormation DOIT être représentée dans le programme Pulumi OU explicitement justifiée dans le rapport final.
-
Identifiant logique CloudFormation comme nom de ressource
- CRITIQUE: Chaque ressource Pulumi DOIT utiliser l'identifiant logique CloudFormation comme nom de ressource.
- Cela permet à l'outil
cdk-importerde trouver automatiquement les identifiants d'import. - NE RENOMMEZ PAS les ressources. L'import automatisé ÉCHOUERA si vous modifiez les identifiants logiques.
-
Déploiement réussi
- Le programme Pulumi produit doit être structurellement valide et capable d'une
pulumi previewréussie (en supposant une configuration appropriée).
- Le programme Pulumi produit doit être structurellement valide et capable d'une
-
Validation import sans différence (si import de ressources existantes)
- Après import,
pulumi previewne doit afficher AUCUNE mise à jour, remplacement, création ou suppression.
- Après import,
-
Rapport de migration final
- Toujours produire un rapport de migration formel adapté à une Pull Request.
LORSQUE DES INFORMATIONS MANQUENT
Si l'utilisateur n'a pas fourni de template CloudFormation, vous DEVEZ le récupérer depuis AWS en utilisant le nom de stack.
WORKFLOW DE MIGRATION
Suivez ce workflow exactement et dans cet ordre:
1. COLLECTE D'INFORMATIONS
1.1 Vérifier les credentials AWS (ESC)
L'exécution de commandes AWS requiert des credentials chargées 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 procéder.
Pour des informations détaillées sur ESC: Utilisez la skill pulumi-esc.
Vous DEVEZ confirmer la région AWS avec l'utilisateur.
1.2 Obtenir le template CloudFormation
Si l'utilisateur a fourni un fichier template: Lisez le template directement.
Si l'utilisateur a fourni uniquement un nom de stack: Récupérez le template depuis AWS:
aws cloudformation get-template \
--region <region> \
--stack-name <stack-name> \
--query 'TemplateBody' \
--output json > template.json
1.3 Créer un inventaire des ressources
Listez toutes les ressources de la stack:
aws cloudformation list-stack-resources \
--region <region> \
--stack-name <stack-name> \
--output json
Cela fournit:
LogicalResourceId- Utilisez ceci comme nom de ressource PulumiPhysicalResourceId- L'identifiant AWS réel de la ressourceResourceType- Le type de ressource CloudFormation
1.4 Analyser la structure du template
Extrayez du template:
- Les paramètres et leurs valeurs par défaut
- Les mappages
- Les conditions
- Les sorties
- Les dépendances de ressources (Ref, GetAtt, DependsOn)
2. CONVERSION DE CODE (CloudFormation → Pulumi)
IMPORTANT: Il n'existe PAS d'outil de conversion automatisé pour CloudFormation. Vous DEVEZ convertir chaque ressource manuellement.
2.1 Convention de nommage des ressources (CRITIQUE)
Chaque ressource Pulumi DOIT utiliser l'identifiant logique CloudFormation comme nom.
// CloudFormation:
// "MyAppBucketABC123": { "Type": "AWS::S3::Bucket", ... }
// Pulumi - CORRECT:
const myAppBucket = new aws.s3.Bucket("MyAppBucketABC123", { ... });
// Pulumi - INCORRECT (NE PAS faire ceci - l'import échouera):
const myAppBucket = new aws.s3.Bucket("my-app-bucket", { ... });
Cette convention de nommage est REQUISE car l'outil cdk-importer associe les ressources par nom.
2.2 Stratégie de fournisseur
⚠️ CRITIQUE: UTILISEZ TOUJOURS aws-native PAR DÉFAUT ⚠️
- Utilisez
aws-nativepour toutes les ressources sauf s'il existe une raison spécifique d'utiliseraws. - Les types CloudFormation sont mappés directement à aws-native (p. ex.,
AWS::S3::Bucket→aws-native.s3.Bucket). - Utilisez
aws(classique) uniquement quand aws-native ne supporte pas une fonctionnalité requise.
C'est OBLIGATOIRE pour les imports réussis avec cdk-importer. Le cdk-importer fonctionne en associant les ressources CloudFormation aux ressources Pulumi, et CloudFormation se mappe 1:1 à aws-native. L'utilisation du fournisseur aws classique causera des échecs d'import.
2.3 Fonctions intrinsèques CloudFormation
Mappez les fonctions intrinsèques CloudFormation aux équivalents Pulumi:
| CloudFormation | Équivalent Pulumi |
|---|---|
!Ref (ressource) |
Sortie de ressource (p. ex., bucket.id) |
!Ref (paramètre) |
Configuration Pulumi |
!GetAtt Resource.Attr |
Sortie de propriété de ressource |
!Sub "..." |
pulumi.interpolate |
!Join [delim, [...]] |
pulumi.interpolate ou .apply() |
!If [cond, true, false] |
Opérateur ternaire |
!Equals [a, b] |
Comparaison === |
!Select [idx, list] |
Indexation de tableau avec .apply() |
!Split [delim, str] |
.apply(v => v.split(...)) |
Fn::ImportValue |
Références de stack ou configuration |
Exemple: !Sub
// CloudFormation: !Sub "arn:aws:s3:::${MyBucket}/*"
// Pulumi:
const bucketArn = pulumi.interpolate`arn:aws:s3:::${myBucket.bucket}/*`;
Exemple: !GetAtt
// CloudFormation: !GetAtt MyFunction.Arn
// Pulumi:
const functionArn = myFunction.arn;
2.4 Conditions CloudFormation
Convertissez les conditions CloudFormation en logique TypeScript:
// CloudFormation:
// "Conditions": {
// "CreateProdResources": { "Fn::Equals": [{ "Ref": "Environment" }, "prod"] }
// }
// Pulumi:
const config = new pulumi.Config();
const environment = config.require("environment");
const createProdResources = environment === "prod";
if (createProdResources) {
// Créer les ressources spécifiques à la production
}
2.5 Paramètres CloudFormation
Convertissez les paramètres en configuration Pulumi:
// CloudFormation:
// "Parameters": {
// "InstanceType": { "Type": "String", "Default": "t3.micro" }
// }
// Pulumi:
const config = new pulumi.Config();
const instanceType = config.get("instanceType") || "t3.micro";
2.6 Mappages CloudFormation
Convertissez les mappages en objets TypeScript:
// CloudFormation:
// "Mappings": {
// "RegionMap": {
// "us-east-1": { "AMI": "ami-12345" },
// "us-west-2": { "AMI": "ami-67890" }
// }
// }
// Pulumi:
const regionMap: Record<string, { ami: string }> = {
"us-east-1": { ami: "ami-12345" },
"us-west-2": { ami: "ami-67890" },
};
const ami = regionMap[aws.config.region!].ami;
2.7 Ressources personnalisées
Les ressources personnalisées CloudFormation (AWS::CloudFormation::CustomResource ou Custom::*) requièrent un traitement spécial:
- Identifier l'objectif: Lisez le code de la fonction Lambda pour comprendre ce qu'elle fait
- Trouver un équivalent natif: Vérifiez si Pulumi possède une ressource native qui fournit la même fonctionnalité
- Si pas d'équivalent: Documentez dans le rapport de migration qu'une implémentation manuelle est nécessaire
2.8 Gestion des sorties TypeScript
Les sorties aws-native contiennent souvent undefined. Évitez les assertions non-null !. Déroulez toujours en toute sécurité avec .apply():
// INCORRECT
functionName: lambdaFunction.functionName!,
// CORRECT
functionName: lambdaFunction.functionName.apply(name => name || ""),
3. IMPORT DE RESSOURCES
Après la conversion, importez les ressources existantes pour qu'elles soient gérées par Pulumi.
3.0 Validation pré-import (REQUISE)
Avant de procéder à l'import, validez votre code:
- Vérifier l'utilisation du fournisseur: Scannez votre code pour vérifier que toutes les ressources utilisent
aws-native - Documenter les exceptions: Toute utilisation du fournisseur
aws(classique) doit être justifiée - Vérifier les noms de ressources: Confirmez que toutes les ressources utilisent les identifiants logiques CloudFormation comme noms
3.1 Import automatisé avec cdk-importer
Parce que vous avez utilisé les identifiants logiques CloudFormation comme noms de ressources, vous pouvez utiliser l'outil cdk-importer pour importer automatiquement les ressources.
Suivez cfn-importer.md pour les procédures d'import détaillées.
3.2 Import manuel pour les ressources non importées
Pour les ressources dont l'import automatique échoue:
- Suivez cloudformation-id-lookup.md pour trouver le format de l'identifiant d'import
- Utilisez
pulumi import:
pulumi import <pulumi-resource-type> <logical-id> <import-id>
3.3 Exécution de Preview après l'import
Après l'import, exécutez pulumi preview. Il ne doit y avoir:
- AUCUNE mise à jour
- AUCUN remplacement
- AUCUNE création
- AUCUNE suppression
S'il y a des modifications, enquêtez et mettez à jour le programme jusqu'à ce que la preview soit propre.
FORMAT DE SORTIE (REQUIS)
Lors d'une migration, produisez toujours:
- Vue d'ensemble (description de haut niveau)
- Résumé du plan de migration
- Sorties de code Pulumi (TypeScript; organisées par fichier)
- Tableau de correspondance des ressources:
| Identifiant logique CloudFormation | Type CFN | Type Pulumi | Fournisseur |
|---|---|---|---|
MyAppBucketABC123 |
AWS::S3::Bucket |
aws-native.s3.Bucket |
aws-native |
MyLambdaFunction456 |
AWS::Lambda::Function |
aws-native.lambda.Function |
aws-native |
- Résumé des ressources personnalisées (le cas échéant)
- Rapport de migration final (adapté à Pull Request)
- Étapes suivantes (instructions d'import)
POUR LA DOCUMENTATION DÉTAILLÉE
Récupérez le contenu de la documentation officielle Pulumi: