Aller au contenu
Infrastructure as Code medium

Découvrir AWS CloudFormation

8 min de lecture

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.

  • Comprendre template, stack et change set
  • Écrire un premier template CloudFormation
  • Le valider sans compte AWS avec cfn-lint
  • Situer CloudFormation face à Terraform

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.

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.

Voici une stack minimale : un bucket S3. La section Resources déclare la ressource ; les Outputs exposent des valeurs utiles après création.

bucket.yaml
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.Arn

On 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.

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.

Fenêtre de terminal
pip install cfn-lint
cfn-lint bucket.yaml

Sur 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:5

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 :

Fenêtre de terminal
aws cloudformation deploy \
--template-file bucket.yaml \
--stack-name mon-bucket

Pour inspecter ou supprimer :

Fenêtre de terminal
aws cloudformation describe-stacks --stack-name mon-bucket
aws cloudformation delete-stack --stack-name mon-bucket

Les templates ne sont pas statiques : des fonctions intrinsèques y injectent des valeurs calculées. Les quatre les plus courantes :

FonctionRôleExemple
!Refvaleur d'un paramètre ou identifiant d'une ressource!Ref MyBucket
!GetAttun attribut d'une ressource!GetAtt MyBucket.Arn
!Subsubstitution de variables dans une chaîne!Sub "bucket-${AWS::StackName}"
!Joinconcaté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.

Le choix dépend surtout de votre périmètre cloud.

CritèreCloudFormationTerraform / OpenTofu
PérimètreAWS uniquementmulti-cloud (providers)
LangageYAML / JSONHCL
Étatgéré par AWSfichier d'état à gérer/sécuriser
Coût du moteurgratuitopen source
Écosystèmenatif 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 offre for_each/count nativement.
  • Fonctions intrinsèques : leur multiplicité (Ref, GetAtt, Sub, FindInMap, Select...) demande un temps d'apprentissage.
  • CloudFormation est l'IaC natif AWS, déclaratif, gratuit, avec l'état géré par AWS.
  • Un template décrit les ressources (Resources obligatoire) ; une stack les gère comme un tout ; un change set prévisualise (comme terraform plan).
  • cfn-lint valide un template hors ligne, sans compte AWS, et connaît les schémas de ressources.
  • Déploiement via aws cloudformation deploy ; --capabilities CAPABILITY_IAM si 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.

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracking. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn