Claude Code avec AWS CloudFormation et CDK : guide pratique de revue IaC
Relisez AWS CDK et CloudFormation avec Claude Code: IAM minimal, diffs, dérive, rollback et garde-fous.
Cliquer dans la console AWS paraît rapide jusqu’au jour où il faut expliquer pourquoi la production diffère de staging. CloudFormation et AWS CDK placent l’infrastructure dans du code, mais l’IaC ne supprime pas les risques : une politique IAM trop large, un remplacement de ressource avec état ou un NAT Gateway oublié peuvent coûter cher.
J’utilise Claude Code comme partenaire de rédaction et de revue, pas comme opérateur de déploiement autonome. Il peut produire un premier brouillon CloudFormation/CDK, expliquer cdk diff, repérer une extension de privilèges et transformer des événements CloudFormation en checklist de rollback. L’approbation reste humaine.
Pour débuter : CloudFormation est le service AWS qui applique des templates. CDK permet d’écrire l’infrastructure en TypeScript puis de la synthétiser en CloudFormation. Un stack est l’unité déployée. Une dérive, ou drift, signifie que la ressource réelle ne correspond plus au code.
Références AWS officielles consultées au 3 juin 2026 :
- AWS CDK Developer Guide
- AWS CDK CLI deploy command
- AWS CDK CLI diff command
- CloudFormation change sets
- CloudFormation drift detection
- CloudFormation stack failure options
- IAM security best practices
- AWS CDK security best practices
Poser les limites
| Travail | Claude Code aide sur | L’humain valide |
|---|---|---|
| Besoin | Ressources, environnements, dépendances | Utilité réelle |
| Brouillon | CloudFormation/CDK | Noms, suppression, coût |
| IAM | Actions et ressources candidates | Moindre privilège |
| Diff | Résumé de cdk diff ou change set | Suppressions et remplacements |
| Incident | Lecture d’événements, pistes de correction | Plan de rollback |
flowchart LR
A["Écrire le besoin"] --> B["Brouillon IaC avec Claude Code"]
B --> C["Revue humaine coût et noms"]
C --> D["cdk diff ou change set"]
D --> E["Claude Code revoit les risques"]
E --> F["Approuver et déployer"]
F --> G["Noter drift et rollback"]
Cas 1 : convertir une petite partie en CloudFormation
Commencez par un périmètre peu risqué. Ce template crée un bucket S3 privé et un rôle IAM assumable par Lambda qui ne peut lire que ce bucket. Comme il crée un rôle nommé, CAPABILITY_NAMED_IAM est nécessaire.
mkdir cfn-iac-review-demo
cd cfn-iac-review-demo
# Enregistrez le YAML suivant dans cfn-safe-iac-demo.yaml
AWSTemplateFormatVersion: "2010-09-09"
Description: "ClaudeCodeLab safe IaC review demo: private S3 bucket and least-privilege Lambda role"
Parameters:
Environment:
Type: String
Default: dev
AllowedValues:
- dev
- staging
- prod
ProjectName:
Type: String
Default: cclab-iac-demo
AllowedPattern: "^[a-z0-9][a-z0-9-]{2,24}$"
Resources:
DemoBucket:
Type: AWS::S3::Bucket
DeletionPolicy: Retain
UpdateReplacePolicy: Retain
Properties:
BucketName: !Sub "${ProjectName}-${Environment}-${AWS::AccountId}-${AWS::Region}"
VersioningConfiguration:
Status: Enabled
PublicAccessBlockConfiguration:
BlockPublicAcls: true
BlockPublicPolicy: true
IgnorePublicAcls: true
RestrictPublicBuckets: true
BucketEncryption:
ServerSideEncryptionConfiguration:
- ServerSideEncryptionByDefault:
SSEAlgorithm: AES256
Tags:
- Key: Project
Value: !Ref ProjectName
- Key: Environment
Value: !Ref Environment
DemoReaderRole:
Type: AWS::IAM::Role
Properties:
RoleName: !Sub "${ProjectName}-${Environment}-reader-${AWS::Region}"
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Principal:
Service: lambda.amazonaws.com
Action: sts:AssumeRole
Policies:
- PolicyName: ReadOnlyDemoBucket
PolicyDocument:
Version: "2012-10-17"
Statement:
- Sid: ListOnlyThisBucket
Effect: Allow
Action:
- s3:ListBucket
Resource: !GetAtt DemoBucket.Arn
- Sid: ReadObjectsOnly
Effect: Allow
Action:
- s3:GetObject
Resource: !Sub "${DemoBucket.Arn}/*"
Outputs:
BucketName:
Value: !Ref DemoBucket
ReaderRoleArn:
Value: !GetAtt DemoReaderRole.Arn
Demandez une revue stricte :
claude -p "
Relis cfn-safe-iac-demo.yaml comme template CloudFormation.
Retourne un tableau sur:
1. accès public accidentel
2. portée IAM Resource
3. risque de suppression ou remplacement
4. coût mensuel possible
5. points à vérifier dans un change set de production
"
Créez ensuite un change set :
aws cloudformation create-change-set \
--stack-name cclab-iac-demo-dev \
--change-set-name review-20260603-001 \
--template-body file://cfn-safe-iac-demo.yaml \
--capabilities CAPABILITY_NAMED_IAM \
--parameters ParameterKey=Environment,ParameterValue=dev ParameterKey=ProjectName,ParameterValue=cclab-iac-demo
aws cloudformation describe-change-set \
--stack-name cclab-iac-demo-dev \
--change-set-name review-20260603-001
Surveillez Add, Modify, Remove et surtout Replacement. Sur S3, RDS, DynamoDB, KMS ou réseau, un remplacement doit bloquer l’approbation jusqu’à clarification.
Cas 2 : stack CDK TypeScript minimal
Pour un nouveau projet, CDK TypeScript est plus lisible et plus facile à relire. Exemple volontairement petit : DynamoDB, S3 et Lambda, sans API Gateway.
mkdir cdk-iac-review-demo
cd cdk-iac-review-demo
npm init -y
npm install aws-cdk-lib constructs
npm install --save-dev aws-cdk typescript ts-node @types/node
mkdir bin lib
{
"app": "npx ts-node --prefer-ts-exts bin/app.ts"
}
// bin/app.ts
import * as cdk from "aws-cdk-lib";
import { IacReviewDemoStack } from "../lib/iac-review-demo-stack";
const app = new cdk.App();
new IacReviewDemoStack(app, "IacReviewDemoStack", {
env: {
account: process.env.CDK_DEFAULT_ACCOUNT,
region: process.env.CDK_DEFAULT_REGION ?? "eu-west-3",
},
});
// lib/iac-review-demo-stack.ts
import * as cdk from "aws-cdk-lib";
import { Construct } from "constructs";
import * as dynamodb from "aws-cdk-lib/aws-dynamodb";
import * as iam from "aws-cdk-lib/aws-iam";
import * as lambda from "aws-cdk-lib/aws-lambda";
import * as logs from "aws-cdk-lib/aws-logs";
import * as s3 from "aws-cdk-lib/aws-s3";
export class IacReviewDemoStack extends cdk.Stack {
constructor(scope: Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
const stage = this.node.tryGetContext("stage") ?? "dev";
const isProd = stage === "prod";
const table = new dynamodb.Table(this, "AppTable", {
partitionKey: { name: "pk", type: dynamodb.AttributeType.STRING },
billingMode: dynamodb.BillingMode.PAY_PER_REQUEST,
pointInTimeRecovery: isProd,
deletionProtection: isProd,
removalPolicy: isProd ? cdk.RemovalPolicy.RETAIN : cdk.RemovalPolicy.DESTROY,
});
const bucket = new s3.Bucket(this, "PrivateAssetsBucket", {
blockPublicAccess: s3.BlockPublicAccess.BLOCK_ALL,
enforceSSL: true,
encryption: s3.BucketEncryption.S3_MANAGED,
versioned: true,
removalPolicy: isProd ? cdk.RemovalPolicy.RETAIN : cdk.RemovalPolicy.DESTROY,
autoDeleteObjects: !isProd,
});
const fn = new lambda.Function(this, "ApiHandler", {
runtime: lambda.Runtime.NODEJS_20_X,
handler: "index.handler",
code: lambda.Code.fromInline(`
exports.handler = async () => ({
statusCode: 200,
body: JSON.stringify({
tableName: process.env.TABLE_NAME,
bucketName: process.env.BUCKET_NAME
})
});
`),
environment: {
TABLE_NAME: table.tableName,
BUCKET_NAME: bucket.bucketName,
STAGE: stage,
},
timeout: cdk.Duration.seconds(10),
memorySize: 256,
logRetention: logs.RetentionDays.ONE_WEEK,
});
table.grantReadWriteData(fn);
bucket.grantPut(fn);
fn.addToRolePolicy(
new iam.PolicyStatement({
sid: "DenyInsecureS3Transport",
effect: iam.Effect.DENY,
actions: ["s3:*"],
resources: [bucket.bucketArn, bucket.arnForObjects("*")],
conditions: { Bool: { "aws:SecureTransport": "false" } },
}),
);
cdk.Tags.of(this).add("Project", "ClaudeCodeLab");
cdk.Tags.of(this).add("Stage", stage);
new cdk.CfnOutput(this, "FunctionName", { value: fn.functionName });
new cdk.CfnOutput(this, "BucketName", { value: bucket.bucketName });
new cdk.CfnOutput(this, "TableName", { value: table.tableName });
}
}
Revue avant déploiement :
npx cdk synth -c stage=dev
npx cdk diff -c stage=dev
claude -p "
Relis ce cdk diff.
Signale seulement suppressions, remplacements, extension IAM, exposition S3, coût DynamoDB et fuite de variables Lambda.
$(npx cdk diff -c stage=dev 2>&1)
"
autoDeleteObjects: !isProd est pratique en développement, mais dangereux en production. Claude Code doit détecter ce type de garde-fou d’environnement.
Cas 3 : expliquer le diff de production
claude -p "
Résume ce cdk diff pour un responsable produit non spécialiste AWS.
Colonnes:
- type de changement
- ressource
- impact utilisateur
- impact sécurité
- impact coût
- question avant approbation
$(npx cdk diff -c stage=prod 2>&1)
"
Les risques fréquents sont IAM Action/Resource, security group ouvert à 0.0.0.0/0, absence de protection contre la suppression, S3 public, ajout de CloudFront ou NAT Gateway et remplacement d’une ressource avec état.
Cas 4 : rollback et drift
aws cloudformation describe-stacks --stack-name cclab-iac-demo-dev
aws cloudformation detect-stack-drift --stack-name cclab-iac-demo-dev
aws cloudformation describe-stack-drift-detection-status --stack-drift-detection-id YOUR_DETECTION_ID
claude -p "
Ce stack est en UPDATE_ROLLBACK_FAILED.
Lis les événements et sépare causes probables, ressources modifiables, ressources à ne pas toucher et étapes à vérifier dans la documentation AWS.
$(aws cloudformation describe-stack-events --stack-name cclab-iac-demo-dev 2>&1)
"
Pièges courants
IAM trop large. Refusez Action: "*" ou Resource: "*" par défaut. Limitez actions, ARN et conditions au cas d’usage.
Déployer sans lire le diff. Production exige synth, diff et change set. Replacement impose une pause.
Oublier les coûts fixes. ALB, NAT Gateway, RDS, OpenSearch et ECS permanent coûtent même sans trafic.
Transformer un correctif console en solution durable. La console peut aider en urgence, mais la correction doit revenir dans CloudFormation ou CDK.
Écrire les secrets dans le code. Utilisez Secrets Manager ou SSM Parameter Store et demandez à Claude Code de ne jamais imprimer les valeurs secrètes.
Prompt de revue
Tu es un relecteur AWS CloudFormation/CDK strict.
Relis ce diff IaC avant production.
Vérifie:
- IAM Action/Resource/Condition au moindre privilège
- exposition accidentelle via security groups ou S3
- suppression ou remplacement de ressources avec état
- nouveau coût fixe comme ALB, NAT Gateway, RDS ou OpenSearch
- drift CloudFormation probable
- ressources nécessitant un rollback manuel
Sortie:
1. problèmes à corriger maintenant
2. questions pour l’approbateur
3. commandes avant deploy
4. commandes après deploy
Pour aller plus loin
Pour IAM, lisez Claude Code et AWS IAM. Pour l’exécution et la donnée, ajoutez AWS Lambda, AWS API Gateway et AWS DynamoDB.
ClaudeCodeLab propose aussi des produits pratiques et une formation équipe pour transformer ces prompts en modèles de Pull Request et checklists de release.
Résumé
Claude Code est le plus utile avec CloudFormation/CDK comme second relecteur strict. Laissez-le rédiger, mais exigez une explication IAM, coût, remplacement, rollback et drift avant tout déploiement. En pratique, relire cdk diff et les change sets avec Claude Code révèle plus de risques que la génération de templates seule.
PDF gratuit: cheatsheet Claude Code
Saisissez votre email et téléchargez une page avec commandes, habitudes de review et workflow sûr.
Nous protégeons vos données et n'envoyons pas de spam.
À propos de l'auteur
Masa
Ingénieur spécialisé dans les workflows pratiques avec Claude Code.
Articles liés
Workflow Obsidian vers CLAUDE.md avec Claude Code
Transformer des notes Obsidian en notes CLAUDE.md concises pour reprendre les sessions sans réexpliquer.
Claude Code Revenue CTA Routing : relier articles, PDF, Gumroad et consultation
Un workflow Claude Code pour orienter les lecteurs vers PDF gratuit, Gumroad ou consultation selon l'intention.
Règles de handoff Claude Code en équipe: preuves, permissions, rollback et revenus
Un format concret pour transmettre un travail Claude Code avec preuves, permissions, rollback, PDF gratuit, Gumroad et consultation.