Introduction
AWS Secrets Manager permet de stocker, de gérer et de récupérer des secrets tels que des clés API, des mots de passe de base de données ou des certificats sans les hardcoder. En 2026, cette pratique est indispensable pour respecter les normes de sécurité et les exigences de conformité. Ce tutoriel vous guide pas à pas dans l'intégration d'AWS Secrets Manager au sein d'une application Node.js en TypeScript. Vous apprendrez à configurer les permissions IAM, à récupérer les secrets de manière efficace et à implémenter un système de cache performant.
Prérequis
- Compte AWS avec permissions IAM
- Node.js 20+ et TypeScript 5.4+
- AWS CLI configuré (aws configure)
- Connaissances de base d'Express ou d'un framework Node.js
Installation des dépendances
npm install @aws-sdk/client-secrets-manager
dotenvNous installons le SDK AWS v3 officiel et dotenv pour charger les variables d'environnement locales pendant le développement.
Création du client AWS Secrets Manager
import { SecretsManagerClient } from '@aws-sdk/client-secrets-manager';
export const secretsClient = new SecretsManagerClient({
region: process.env.AWS_REGION || 'eu-west-3',
});Ce module centralise la création du client. Il utilise la région définie dans les variables d'environnement pour une configuration flexible entre environnements.
Récupération d'un secret
import { GetSecretValueCommand } from '@aws-sdk/client-secrets-manager';
import { secretsClient } from './client';
export async function getSecret(secretName: string): Promise<string> {
const command = new GetSecretValueCommand({ SecretId: secretName });
const response = await secretsClient.send(command);
if (response.SecretString) {
return response.SecretString;
}
throw new Error('Secret non trouvé ou binaire');
}Cette fonction récupère le secret en clair. Elle gère uniquement les secrets texte ; les secrets binaires nécessitent un traitement différent.
Implémentation du cache en mémoire
const cache = new Map<string, { value: string; expires: number }>();
const CACHE_TTL = 5 * 60 * 1000; // 5 minutes
export async function getCachedSecret(secretName: string): Promise<string> {
const now = Date.now();
const cached = cache.get(secretName);
if (cached && cached.expires > now) {
return cached.value;
}
const value = await getSecret(secretName);
cache.set(secretName, { value, expires: now + CACHE_TTL });
return value;
}Le cache réduit les appels API coûteux et évite les limites de débit. La durée de vie de 5 minutes est un bon compromis sécurité/performance.
Utilisation dans une application Express
import express from 'express';
import { getCachedSecret } from './secrets/secretCache';
const app = express();
app.get('/config', async (req, res) => {
try {
const dbPassword = await getCachedSecret('prod/db/password');
res.json({ status: 'ok' });
} catch (error) {
res.status(500).json({ error: 'Impossible de récupérer le secret' });
}
});
app.listen(3000);Exemple concret d'utilisation du secret dans une route. Le secret n'est jamais exposé dans les logs ni dans le code source.
Bonnes pratiques
- Toujours utiliser le cache avec une TTL courte
- Appliquer le principe du moindre privilège sur les politiques IAM
- Activer la rotation automatique des secrets
- Ne jamais logger les valeurs de secrets
- Utiliser des noms de secrets hiérarchiques (prod/app/db)
Erreurs courantes à éviter
- Oublier de gérer les erreurs de throttling du SDK
- Stocker des secrets dans des variables d'environnement persistantes
- Ne pas mettre à jour les permissions IAM après création du secret
- Utiliser GetSecretValue au lieu de BatchGetSecretValue pour plusieurs secrets
Pour aller plus loin
Découvrez nos formations avancées sur la sécurité cloud et AWS : https://learni-group.com/formations