Deployer NestJS sur AWS : Un Tutoriel Intermédiaire en 25 Minutes
Pourquoi Deployer NestJS sur AWS ?
Le déploiement de NestJS sur AWS offre une plateforme robuste et scalable pour les applications Node.js. En particulier, AWS fournit des services tels que Elastic Beanstalk, Lambda, VPC, et CloudFront qui permettent d'héberger, de gérer et de déployer des applications avec un haut niveau de disponibilité.
Un cas d'usage concret serait une application de gestion de projet pour une équipe de développement. Avec NestJS, on peut créer une API robuste, et avec AWS, elle sera facilement déployée, mise à l'échelle et protégée.
Prerequis
Pour suivre ce tutoriel, vous aurez besoin des éléments suivants :
- Connaissances en Node.js : Vous devez être familier avec les concepts de base de Node.js.
- NestJS : Un bon connaissances de NestJS est nécessaire pour comprendre le code.
- AWS Account : Vous devrez avoir un compte AWS pour accéder à ses services.
- Outils d'installation :
- Node.js (>=14.0)
- npm ou yarn
- AWS CLI
Concepts fondamentaux
1. Elastic Beanstalk
Elastic Beanstalk est un service d'hébergement déclaratif qui simplifie le déploiement et la gestion des applications web.
## Installez l'extension Elastic Beanstalk pour Node.js
npm install -g elasticbeanstalk-cli
2. AWS Lambda
Lambda permet d'exécuter du code sans gérer les infrastructures de serveurs.
// src/lambda-app.ts
import { APIGatewayEvent, Context } from 'aws-lambda';
export const handler = async (event: APIGatewayEvent, context: Context) => {
return {
statusCode: 200,
body: JSON.stringify({ message: 'Hello World' }),
};
};
3. VPC
VPC (Virtual Private Cloud) permet de créer un réseau privé sécurisé sur AWS.
## Créez un VPC
aws ec2 create-vpc --cidr-block 10.0.0.0/16
Mise en pratique : projet fil rouge
Mini-Projet : Gestionnaire de Tâches
Étape 1 : Créer le Projet NestJS
## Installez NestJS CLI
npm install -g @nestjs/cli
## Créez un nouveau projet
nest new task-manager
cd task-manager
Étape 2 : Configurer Elastic Beanstalk
## Initialisez Elastic Beanstalk
eb init -p node.js-14.x task-manager-env --region us-west-2
## Créez une application Elastic Beanstalk
eb create task-manager-app
Étape 3 : Ajouter une Entité de Tâche
// src/tasks/entities/task.entity.ts
import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';
@Entity()
export class Task {
@PrimaryGeneratedColumn()
id: number;
@Column()
title: string;
@Column()
description: string;
@Column({ default: false })
completed: boolean;
}
Étape 4 : Créer un Service pour les Tâches
// src/tasks/task.service.ts
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { Task } from './entities/task.entity';
@Injectable()
export class TasksService {
constructor(
@InjectRepository(Task)
private readonly tasksRepository: Repository<Task>,
) {}
findAll(): Promise<Task[]> {
return this.tasksRepository.find();
}
findOne(id: number): Promise<Task> {
return this.tasksRepository.findOne(id);
}
async remove(id: number): Promise<void> {
await this.tasksRepository.delete(id);
}
}
Étape 5 : Créer un Controller pour les Tâches
// src/tasks/task.controller.ts
import { Controller, Get, Post, Body, Param, Delete } from '@nestjs/common';
import { TasksService } from './task.service';
import { Task } from './entities/task.entity';
@Controller('tasks')
export class TasksController {
constructor(private readonly tasksService: TasksService) {}
@Get()
async findAll(): Promise<Task[]> {
return this.tasksService.findAll();
}
@Get(':id')
findOne(@Param('id') id: string): Promise<Task> {
return this.tasksService.findOne(+id);
}
@Delete(':id')
remove(@Param('id') id: string): Promise<void> {
return this.tasksService.remove(+id);
}
}
Étape 6 : Ajouter la Configuration pour Elastic Beanstalk
Créez un fichier .ebextensions/task-manager.config :
option_settings:
aws:elasticbeanstalk:container:nodejs:
NodeVersion: 14.x
NpmConfigCacheDir: /tmp/.npm
Étape 7 : Déployer l'Application
## Déploiement sur Elastic Beanstalk
eb deploy
Erreurs frequentes et debugging
Erreur 1 : Erreur de connexion à la base de données
// src/app.module.ts
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
@Module({
imports: [
TypeOrmModule.forRoot({
type: 'postgres',
host: 'localhost',
port: 5432,
username: 'user',
password: 'password',
database: 'task_manager',
entities: [__dirname + '/**/*.entity{.ts,.js}'],
synchronize: true,
}),
],
})
export class AppModule {}
bash
## Corrigez le fichier .ebextensions/task-manager.config
option_settings:
aws:elasticbeanstalk:container:nodejs:
NodeVersion: 14.x
NpmConfigCacheDir: /tmp/.npm
EnvironmentProperties:
TYPEORM_HOST: localhost
TYPEORM_PORT: 5432
TYPEORM_USERNAME: user
TYPEORM_PASSWORD: password
TYPEORM_DATABASE: task_manager
Erreur 2 : Erreur de configuration d'Elastic Beanstalk
## Corrigez le fichier .ebextensions/task-manager.config
option_settings:
aws:elasticbeanstalk:container:nodejs:
NodeVersion: 14.x
NpmConfigCacheDir: /tmp/.npm
Erreur 3 : Erreur de configuration d'AWS Lambda
// src/lambda-app.ts
import { APIGatewayEvent, Context } from 'aws-lambda';
export const handler = async (event: APIGatewayEvent, context: Context) => {
return {
statusCode: 200,
body: JSON.stringify({ message: 'Hello World' }),
};
};
Pour aller plus loin
- Intégration avec AWS S3 : Utilisez S3 pour stocker des fichiers et des médias.
- Utilisation de TypeScript Types : Améliorez la sécurité en utilisant les types de données dans votre code.
- Migrer vers AWS Fargate : Pour un contrôle plus fin sur l'infrastructure.
Défi pratique
Créez une API pour une application de blog avec les fonctionnalités suivantes :
- Création d'un article
- Lecture d'un article par ID
- Mise à jour d'un article
- Suppression d'un article