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
| Aspect | CloudFormation | CDK |
|---|---|---|
| Langage | YAML/JSON | TypeScript, Python, Java |
| Abstraction | Bas niveau | Haut niveau (constructs) |
| Réutilisabilité | Templates imbriqués | Classes et modules |
| Tests | Limités | Tests unitaires natifs |
| Courbe d’apprentissage | Moyenne | Faible (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.