Introduction
Le Cloud Storage permet de stocker des fichiers de manière scalable sans gérer de serveurs physiques. AWS S3 est le service le plus utilisé pour cela. Ce tutoriel vous apprend à intégrer S3 dans une application Node.js, du setup jusqu'aux opérations CRUD. Vous gagnerez du temps en évitant les erreurs classiques de configuration.
Prérequis
- Node.js 20+
- Compte AWS avec clés d'accès
- Connaissances basiques de TypeScript
- AWS CLI installé (optionnel)
Initialisation du projet
mkdir s3-cloud-storage
cd s3-cloud-storage
npm init -y
npm install @aws-sdk/client-s3 dotenv
npm install --save-dev typescript @types/node ts-node
npx tsc --initCette commande crée un projet TypeScript et installe le SDK AWS S3 v3 moderne ainsi que dotenv pour les variables d'environnement.
Configuration AWS
import { S3Client } from '@aws-sdk/client-s3';
import * as dotenv from 'dotenv';
dotenv.config();
export const s3Client = new S3Client({
region: process.env.AWS_REGION || 'eu-west-3',
credentials: {
accessKeyId: process.env.AWS_ACCESS_KEY_ID!,
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!,
},
});Le client S3 est configuré une seule fois. Utilisez toujours des variables d'environnement pour vos clés afin de sécuriser votre code.
Uploader un fichier
import { PutObjectCommand } from '@aws-sdk/client-s3';
import { s3Client } from './config';
import * as fs from 'fs';
async function uploadFile(bucket: string, key: string, filePath: string) {
const fileContent = fs.readFileSync(filePath);
const command = new PutObjectCommand({
Bucket: bucket,
Key: key,
Body: fileContent,
ContentType: 'application/pdf',
});
await s3Client.send(command);
console.log(`Fichier uploadé : ${key}`);
}
uploadFile('mon-bucket-2026', 'documents/rapport.pdf', './rapport.pdf');PutObjectCommand permet d'uploader n'importe quel fichier. Toujours spécifier le ContentType pour un affichage correct dans la console AWS.
Télécharger un fichier
import { GetObjectCommand } from '@aws-sdk/client-s3';
import { s3Client } from './config';
import * as fs from 'fs';
async function downloadFile(bucket: string, key: string, outputPath: string) {
const command = new GetObjectCommand({ Bucket: bucket, Key: key });
const response = await s3Client.send(command);
const stream = response.Body as NodeJS.ReadableStream;
const writeStream = fs.createWriteStream(outputPath);
stream.pipe(writeStream);
console.log(`Fichier téléchargé : ${outputPath}`);
}
downloadFile('mon-bucket-2026', 'documents/rapport.pdf', './downloaded.pdf');GetObjectCommand retourne un stream. Il faut le piper vers un fichier local pour sauvegarder le contenu.
Lister les objets
import { ListObjectsV2Command } from '@aws-sdk/client-s3';
import { s3Client } from './config';
async function listFiles(bucket: string, prefix: string = '') {
const command = new ListObjectsV2Command({ Bucket: bucket, Prefix: prefix });
const response = await s3Client.send(command);
response.Contents?.forEach(obj => console.log(obj.Key));
}
listFiles('mon-bucket-2026', 'documents/');ListObjectsV2Command est la méthode moderne pour lister les fichiers. Le préfixe permet de filtrer par dossier virtuel.
Supprimer un objet
import { DeleteObjectCommand } from '@aws-sdk/client-s3';
import { s3Client } from './config';
async function deleteFile(bucket: string, key: string) {
const command = new DeleteObjectCommand({ Bucket: bucket, Key: key });
await s3Client.send(command);
console.log(`Fichier supprimé : ${key}`);
}
deleteFile('mon-bucket-2026', 'documents/rapport.pdf');DeleteObjectCommand supprime définitivement un objet. Attention : aucune corbeille n'existe par défaut sur S3.
Bonnes pratiques
- Toujours utiliser des variables d'environnement pour les credentials
- Activer le versioning sur vos buckets en production
- Utiliser des noms de clés cohérents avec des préfixes
- Limiter les permissions IAM au strict minimum
- Ajouter des tags sur les objets pour le suivi des coûts
Erreurs courantes à éviter
- Oublier de configurer la région AWS (erreur de signature)
- Utiliser des credentials en dur dans le code
- Ne pas gérer les erreurs réseau avec try/catch
- Ignorer les limites de taille des objets (5 Go pour PutObject simple)
Pour aller plus loin
Découvrez nos formations complètes sur le cloud pour maîtriser AWS, GCP et Azure.