Pourquoi l’Infrastructure as Code

L’IaC élimine la configuration manuelle de l’infrastructure. Votre infrastructure est versionnée, testable, reproductible et documentée dans le code.

Lueur Externe utilise AWS CDK pour tous ses projets d’infrastructure, garantissant reproductibilité et traçabilité.

CDK vs CloudFormation

AspectCloudFormationCDK
LangageYAML/JSONTypeScript, Python, Java
AbstractionBas niveauHaut niveau (constructs)
RéutilisabilitéTemplates imbriquésClasses et modules
TestsLimitésTests unitaires natifs
Courbe d’apprentissageMoyenneFaible (si dev)

CDK génère du CloudFormation en arrière-plan. Vous bénéficiez de la puissance de CloudFormation avec l’ergonomie d’un langage de programmation.

Premiers pas avec CDK

Initialisation

# Installer CDK
npm install -g aws-cdk

# Créer un projet
mkdir mon-infra && cd mon-infra
cdk init app --language typescript

# Bootstrap (une seule fois par compte/région)
cdk bootstrap aws://123456789/eu-west-3

Stack de base

import * as cdk from 'aws-cdk-lib';
import * as s3 from 'aws-cdk-lib/aws-s3';
import * as lambda from 'aws-cdk-lib/aws-lambda';
import * as apigateway from 'aws-cdk-lib/aws-apigateway';
import { Construct } from 'constructs';

export class ApiStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // Fonction Lambda
    const handler = new lambda.Function(this, 'ApiHandler', {
      runtime: lambda.Runtime.NODEJS_20_X,
      code: lambda.Code.fromAsset('lambda'),
      handler: 'index.handler',
      memorySize: 256,
      timeout: cdk.Duration.seconds(30),
      environment: {
        NODE_ENV: 'production',
      },
    });

    // API Gateway
    const api = new apigateway.RestApi(this, 'Api', {
      restApiName: 'Mon API',
      deployOptions: { stageName: 'prod' },
    });

    api.root.addMethod('GET', new apigateway.LambdaIntegration(handler));
  }
}

Constructs réutilisables

// Construct personnalisé pour un site statique
export class StaticWebsite extends Construct {
  public readonly bucket: s3.Bucket;
  public readonly distribution: cloudfront.Distribution;

  constructor(scope: Construct, id: string, props: { domainName: string }) {
    super(scope, id);

    this.bucket = new s3.Bucket(this, 'Bucket', {
      blockPublicAccess: s3.BlockPublicAccess.BLOCK_ALL,
      removalPolicy: cdk.RemovalPolicy.DESTROY,
      autoDeleteObjects: true,
    });

    this.distribution = new cloudfront.Distribution(this, 'CDN', {
      defaultBehavior: {
        origin: new origins.S3Origin(this.bucket),
        viewerProtocolPolicy: cloudfront.ViewerProtocolPolicy.REDIRECT_TO_HTTPS,
      },
      domainNames: [props.domainName],
    });
  }
}

// Utilisation
const site = new StaticWebsite(this, 'Site', {
  domainName: 'blog.lueurexterne.com',
});

Tests

import { Template } from 'aws-cdk-lib/assertions';

test('Stack crée un bucket S3', () => {
  const app = new cdk.App();
  const stack = new ApiStack(app, 'TestStack');
  const template = Template.fromStack(stack);

  template.hasResourceProperties('AWS::S3::Bucket', {
    PublicAccessBlockConfiguration: {
      BlockPublicAcls: true,
    },
  });
});

Déploiement

# Voir les changements
cdk diff

# Déployer
cdk deploy --require-approval broadening

# Déployer toutes les stacks
cdk deploy --all

Conclusion

L’IaC avec AWS CDK transforme la gestion d’infrastructure en une pratique de développement logiciel. Lueur Externe conçoit des infrastructures CDK modulaires et maintenables pour ses clients.