AWS CloudFormation est le service d'Infrastructure as Code natif d'AWS : vous décrivez vos ressources dans un template YAML ou JSON, et CloudFormation les crée, les met à jour et les supprime comme un tout cohérent. Pas de fichier d'état à gérer (AWS s'en charge), et le service est gratuit (vous ne payez que les ressources créées). Ce guide montre les concepts (template, stack, change set), un premier template validé avec cfn-lint sans compte AWS, et la comparaison avec Terraform. Pour débutants et intermédiaires en IaC. Validé avec cfn-lint 1.52.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Comprendre template, stack et change set
- Écrire un premier template CloudFormation
- Le valider sans compte AWS avec
cfn-lint - Situer CloudFormation face à Terraform
Ce qu'est CloudFormation
Section intitulée « Ce qu'est CloudFormation »CloudFormation est déclaratif : vous décrivez l'état voulu de votre infrastructure AWS, et le service gère l'ordre de création et les dépendances entre ressources à votre place. Le template est un fichier texte (YAML ou JSON) qui sert de plan. Avantage majeur face à Terraform : aucun fichier d'état à stocker et sécuriser, AWS conserve l'état de la stack côté service.
Les concepts clés
Section intitulée « Les concepts clés »Quatre notions suffisent pour démarrer :
- Template : le fichier décrivant les ressources. Sa seule section obligatoire est
Resources. - Stack : l'ensemble des ressources créées depuis un template, gérées comme une unité (création, mise à jour, suppression atomiques).
- Change set : un résumé des changements avant application, l'équivalent du
terraform plan. CloudFormation n'applique les modifications que lorsque vous exécutez le change set. - Drift detection : détecte quand l'infrastructure réelle a divergé du template (modification manuelle dans la console, par exemple).
En cas d'échec de création, CloudFormation effectue un rollback automatique : il supprime les ressources déjà créées pour ne pas laisser une stack à moitié construite.
Un premier template
Section intitulée « Un premier template »Voici une stack minimale : un bucket S3. La section Resources déclare la ressource ; les Outputs exposent des valeurs utiles après création.
AWSTemplateFormatVersion: "2010-09-09"Description: Stack minimale - un bucket S3
Resources: MyBucket: Type: AWS::S3::Bucket
Outputs: BucketName: Description: Nom du bucket cree Value: !Ref MyBucket BucketArn: Description: ARN du bucket Value: !GetAtt MyBucket.ArnOn ne fixe pas BucketName : CloudFormation génère un nom unique, ce qui évite les collisions (les noms S3 sont globaux). !Ref MyBucket retourne le nom du bucket, !GetAtt MyBucket.Arn son ARN.
Valider sans compte AWS avec cfn-lint
Section intitulée « Valider sans compte AWS avec cfn-lint »Avant tout déploiement, validez le template hors ligne avec cfn-lint, le linter open source d'AWS (licence MIT-0). Il vérifie la syntaxe et les schémas de ressources, sans aucun credential.
pip install cfn-lintcfn-lint bucket.yamlSur le template ci-dessus, la commande ne renvoie rien et sort avec le code 0 : le template est valide. Glissez une faute de frappe dans le type de ressource, et cfn-lint la détecte immédiatement :
E3006 Resource type 'AWS::S3::Buckett' does not exist in 'us-east-1'bad.yaml:4:5Déployer une stack
Section intitulée « Déployer une stack »Le déploiement passe par l'AWS CLI. La commande deploy crée la stack si elle n'existe pas, ou la met à jour via un change set :
aws cloudformation deploy \ --template-file bucket.yaml \ --stack-name mon-bucketPour inspecter ou supprimer :
aws cloudformation describe-stacks --stack-name mon-bucketaws cloudformation delete-stack --stack-name mon-bucketLes fonctions intrinsèques
Section intitulée « Les fonctions intrinsèques »Les templates ne sont pas statiques : des fonctions intrinsèques y injectent des valeurs calculées. Les quatre les plus courantes :
| Fonction | Rôle | Exemple |
|---|---|---|
!Ref | valeur d'un paramètre ou identifiant d'une ressource | !Ref MyBucket |
!GetAtt | un attribut d'une ressource | !GetAtt MyBucket.Arn |
!Sub | substitution de variables dans une chaîne | !Sub "bucket-${AWS::StackName}" |
!Join | concaténation avec un séparateur | !Join [":", [a, b, c]] |
!Sub est souvent plus lisible que !Join pour construire des chaînes ; la documentation AWS le recommande d'ailleurs comme alternative.
CloudFormation ou Terraform
Section intitulée « CloudFormation ou Terraform »Le choix dépend surtout de votre périmètre cloud.
| Critère | CloudFormation | Terraform / OpenTofu |
|---|---|---|
| Périmètre | AWS uniquement | multi-cloud (providers) |
| Langage | YAML / JSON | HCL |
| État | géré par AWS | fichier d'état à gérer/sécuriser |
| Coût du moteur | gratuit | open source |
| Écosystème | natif AWS (console, drift, change sets) | registry de milliers de providers |
En clair : CloudFormation si vous êtes 100 % AWS et voulez le natif intégré sans gérer d'état ; Terraform ou OpenTofu si vous visez le multi-cloud et un large écosystème. Ce n'est pas un verdict, mais un choix de contexte.
Deux extensions à connaître dans l'univers AWS : le CDK (Cloud Development Kit) définit l'infra dans un vrai langage (TypeScript, Python, Go...) et synthétise du CloudFormation ; SAM simplifie la syntaxe pour le serverless (Lambda, API Gateway) et se transforme aussi en CloudFormation au déploiement.
- Verrouillage AWS : CloudFormation ne provisionne que des ressources AWS. Pour du multi-cloud, c'est Terraform/OpenTofu.
- Verbosité : le YAML brut devient vite long ; c'est précisément ce que le CDK cherche à réduire.
- Boucles limitées : les itérations riches (
Fn::ForEach) nécessitent un transform, là où HCL offrefor_each/countnativement. - Fonctions intrinsèques : leur multiplicité (
Ref,GetAtt,Sub,FindInMap,Select...) demande un temps d'apprentissage.
À retenir
Section intitulée « À retenir »- CloudFormation est l'IaC natif AWS, déclaratif, gratuit, avec l'état géré par AWS.
- Un template décrit les ressources (
Resourcesobligatoire) ; une stack les gère comme un tout ; un change set prévisualise (commeterraform plan). cfn-lintvalide un template hors ligne, sans compte AWS, et connaît les schémas de ressources.- Déploiement via
aws cloudformation deploy;--capabilities CAPABILITY_IAMsi le template touche à IAM. - Les fonctions intrinsèques (
!Ref,!GetAtt,!Sub,!Join) injectent des valeurs calculées. - AWS only : pour du multi-cloud, regardez Terraform/OpenTofu ; le CDK et SAM génèrent du CloudFormation.