Introduction
Amazon S3 (Simple Storage Service) est le service de stockage objet leader du cloud AWS, scalable à l'infini et fiable à 99,999999999 % (11 neufs). Idéal pour héberger des sites statiques, backups, ML datasets ou assets multimédias, S3 gère des pétaoctets sans infrastructure. En 2026, avec l'essor de l'IA et edge computing, S3 intègre Lambda, Athena et S3 Glacier pour des coûts optimisés.
Ce tutoriel beginner vous guide de A à Z : création de bucket via console et CLI, uploads sécurisés, accès SDK Node.js. Chaque étape est actionable, avec code copier-collable. À la fin, vous stockerez vos premiers fichiers en production. Pourquoi S3 ? Économies (0,023 $/Go/mois), durabilité et conformité GDPR/HIPAA. Prêt à scaler ? (128 mots)
Prérequis
- Compte AWS gratuit (créez-en un sur aws.amazon.com)
- AWS CLI v2 installé (docs.aws.amazon.com/cli)
- Node.js 20+ et npm pour l'SDK
- Une clé Access Key IAM (générée après, voir étape 1)
- Éditeur de code (VS Code recommandé)
Installer et configurer AWS CLI
#!/bin/bash
# Téléchargement AWS CLI v2 (Linux/Mac)
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
# Vérification
aws --version
# Configuration des credentials (remplacez par vos valeurs)
aws configure set aws_access_key_id VOTRE_ACCESS_KEY
aws configure set aws_secret_access_key VOTRE_SECRET_KEY
aws configure set default.region eu-west-1
aws configure set default.output json
# Test
aws sts get-caller-identityCe script installe AWS CLI, configure vos credentials IAM et teste la connexion. Utilisez eu-west-1 pour Paris (faible latence EU). Piège : Ne commitez jamais vos clés en Git ; utilisez IAM roles en prod. Remplacez les placeholders par vos vraies clés.
Étape 1 : Créer vos premières credentials IAM
Avant CLI, générez une Access Key via AWS Console :
- Allez sur IAM > Users > Add user (nom : s3-user, Programmatic access).
- Attachez policy AmazonS3FullAccess (débutant) ou custom pour least privilege.
- Copiez Access Key ID et Secret.
Analogie : Les clés IAM sont comme des passeports ; limitez-les à S3 pour sécurité.
Créer un bucket S3
#!/bin/bash
BUCKET_NAME="mon-premier-bucket-$(date +%s)-unique"
REGION="eu-west-1"
# Créer le bucket (nom globalement unique !)
aws s3 mb s3://${BUCKET_NAME} --region ${REGION}
# Activer versioning (optionnel, protège contre suppressions)
aws s3api put-bucket-versioning --bucket ${BUCKET_NAME} --versioning-configuration Status=Enabled
# Lister buckets pour vérifier
aws s3 ls
# Rendre public en read (pour sites statiques)
aws s3api put-bucket-policy --bucket ${BUCKET_NAME} --policy '{"Version":"2012-10-17","Statement":[{"Sid":"PublicRead","Effect":"Allow","Principal":"*","Action":"s3:GetObject","Resource":"arn:aws:s3:::'${BUCKET_NAME}'/*"}]}'
echo "Bucket créé : s3://${BUCKET_NAME}"Crée un bucket unique (ajout timestamp), active versioning et policy publique. Noms buckets : lowercase, no underscores, global unique. Piège : Évitez public en prod ; utilisez CloudFront + OAI. Copiez le nom pour étapes suivantes.
Étape 2 : Uploader et gérer des objets
Un bucket stocke des objets (fichiers + métadonnées). Pensez-y comme un disque dur infini, sans hiérarchie native (utilisez / pour simuler dossiers).
Uploader, lister et télécharger un fichier
#!/bin/bash
BUCKET_NAME="mon-premier-bucket-$(date +%s)-unique" # Remplacez par votre bucket
FILE_LOCAL="exemple.txt"
# Créer fichier test
cat > ${FILE_LOCAL} << EOF
Contenu de test pour S3.
Upload réussi en 2026 !
EOF
# Upload
aws s3 cp ${FILE_LOCAL} s3://${BUCKET_NAME}/docs/exemple.txt
# Lister objets
aws s3 ls s3://${BUCKET_NAME}/ --recursive
# Télécharger
aws s3 cp s3://${BUCKET_NAME}/docs/exemple.txt ${FILE_LOCAL}.download
# Supprimer
aws s3 rm s3://${BUCKET_NAME}/docs/exemple.txt
# Vider bucket puis supprimer (attention !)
aws s3 rm s3://${BUCKET_NAME}/ --recursive
aws s3 rb s3://${BUCKET_NAME} --force
cat ${FILE_LOCAL}.downloadGère cycle complet : upload (cp), ls, download, rm. --recursive pour dossiers. Piège : Versioning garde suppressions ; listez versions avec aws s3api list-object-versions. Utilisez sync pour déploiements massifs.
Étape 3 : Intégrer S3 dans une app Node.js
Pour apps, utilisez AWS SDK. Installez : npm init -y && npm i @aws-sdk/client-s3 dotenv. Créez .env pour clés.
Installer dépendances Node.js
#!/bin/bash
mkdir s3-node-app && cd s3-node-app
npm init -y
npm install @aws-sdk/client-s3 dotenv
npm install -D typescript @types/node ts-node
cat > .env << EOF
AWS_ACCESS_KEY_ID=VOTRE_ACCESS_KEY
AWS_SECRET_ACCESS_KEY=VOTRE_SECRET_KEY
AWS_REGION=eu-west-1
S3_BUCKET=mon-premier-bucket-unique
EOF
cat > .gitignore << EOF
.env
node_modules/
EOFPrépare projet Node avec SDK v3 (moderne, tree-shakeable). .env protège secrets. Piège : Ajoutez .env à .gitignore. Lancez avec npx ts-node index.ts.
Script Node.js complet pour S3
import { S3Client, PutObjectCommand, GetObjectCommand, ListObjectsV2Command, DeleteObjectCommand } from '@aws-sdk/client-s3';
import * as dotenv from 'dotenv';
import * as fs from 'fs';
dotenv.config();
const client = new S3Client({
region: process.env.AWS_REGION,
credentials: {
accessKeyId: process.env.AWS_ACCESS_KEY_ID!,
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!,
},
});
const bucketName = process.env.S3_BUCKET!;
async function uploadFile(filePath: string, key: string) {
const fileContent = fs.readFileSync(filePath);
const command = new PutObjectCommand({
Bucket: bucketName,
Key: key,
Body: fileContent,
ContentType: 'text/plain',
});
await client.send(command);
console.log(`Uploadé: ${key}`);
}
async function listFiles() {
const command = new ListObjectsV2Command({ Bucket: bucketName });
const response = await client.send(command);
console.log('Fichiers:', response.Contents?.map(obj => obj.Key));
}
async function downloadFile(key: string, localPath: string) {
const command = new GetObjectCommand({ Bucket: bucketName, Key: key });
const response = await client.send(command);
fs.writeFileSync(localPath, await response.Body!.transformToString());
console.log(`Téléchargé: ${key}`);
}
async function deleteFile(key: string) {
const command = new DeleteObjectCommand({ Bucket: bucketName, Key: key });
await client.send(command);
console.log(`Supprimé: ${key}`);
}
// Exécution
(async () => {
await uploadFile('test.txt', 'app/test.txt');
await listFiles();
await downloadFile('app/test.txt', 'downloaded.txt');
await deleteFile('app/test.txt');
})();Script complet : upload, list, download, delete avec async/await. SDK v3 utilise Commands pour type-safety. Piège : Gérez erreurs avec try/catch ; en prod, utilisez IAM roles/EC2 metadata. Créez test.txt avant.
Étape 4 : Sécuriser avec policies et lifecycle
Analogie : Bucket = coffre-fort ; policies = serrures. Via Console > Permissions.
Policy JSON pour bucket privé + lifecycle
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DenyPublic",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::mon-bucket-prive",
"arn:aws:s3:::mon-bucket-prive/*"
],
"Condition": {
"BoolIfExists": {
"aws:SecureTransport": "false"
}
}
}
]
}Policy bloque accès HTTP non-SSL et public. Appliquez : aws s3api put-bucket-policy --bucket mon-bucket --policy file://policy.json. Lifecycle en Console auto-archive après 30j vers Glacier.
Bonnes pratiques
- Least privilege : Policies IAM spécifiques (s3:PutObject seulement).
- Chiffrement : Activez SSE-S3/KMS par défaut.
- Lifecycle rules : Archivez vers IA/Glacier après 30j pour -80% coûts.
- CloudFront CDN : Cachez pour vitesse globale.
- Monitoring : Activez S3 Analytics + CloudWatch alarms sur 404s.
Erreurs courantes à éviter
- Nom bucket non-unique : Ajoutez timestamp/UUID.
- Clés en clair : Toujours .env ou roles ; scannez Git.
- Public accidentel : Vérifiez Block Public Access (Console > Permissions).
- Pas de versioning : Activez pour undo suppressions.
- Région oubliée : Spécifiez --region partout.
Pour aller plus loin
- Docs officielles : AWS S3 Developer Guide
- Avancé : S3 Select (query CSV/JSON), Athena (SQL sur S3)
- Formations : Découvrez nos formations Learni sur AWS
- Projet bonus : Hébergez un site statique avec S3 + CloudFront.