Use Cases (Mis à jour: 03/06/2026)

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.

Claude Code avec AWS CloudFormation et CDK : guide pratique de revue IaC

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 :

Poser les limites

TravailClaude Code aide surL’humain valide
BesoinRessources, environnements, dépendancesUtilité réelle
BrouillonCloudFormation/CDKNoms, suppression, coût
IAMActions et ressources candidatesMoindre privilège
DiffRésumé de cdk diff ou change setSuppressions et remplacements
IncidentLecture d’événements, pistes de correctionPlan 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.

#claude-code #aws #cloudformation #cdk #iac #typescript
Gratuit

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.

Masa

À propos de l'auteur

Masa

Ingénieur spécialisé dans les workflows pratiques avec Claude Code.