Utiliser des secrets Secrets Manager dans des fonctions Lambda
AWS Secrets Manager vous aide à gérer les informations d’identification, les clés d’API et les autres secrets dont vos fonctions Lambda ont besoin. Vous disposez de deux approches principales pour récupérer des secrets dans vos fonctions Lambda, toutes deux offrant de meilleures performances et des coûts réduits par rapport à la récupération de secrets directement à l’aide du SDK AWS :
-
Extension AWS Parameters and Secrets Lambda : solution indépendante de l’environnement d’exécution qui fournit une interface HTTP simple pour récupérer les secrets
-
Utilitaire de paramètres Powertools pour AWS Lambda : solution intégrée au code qui prend en charge plusieurs fournisseurs (Secrets Manager, Parameter Store, AppConfig) avec des transformations intégrées
Les deux approches conservent des caches locaux de secrets, ce qui évite à votre fonction d’appeler Secrets Manager pour chaque invocation. Lorsque votre fonction demande un secret, le cache est d’abord vérifié. Si le secret est disponible et n’a pas expiré, il est renvoyé immédiatement. Sinon, il est extrait de Secrets Manager, mis en cache et renvoyé. Ce mécanisme de mise en cache permet d’accélérer les temps de réponse et de réduire les coûts en minimisant les appels d’API.
Choix d’une approche
Tenez compte des facteurs suivants lorsque vous choisissez entre l’extension et Powertools :
- Utilisez l’extension Lambda AWS Parameters and Secrets quand :
-
Vous recherchez une solution indépendante de l’environnement d’exécution qui fonctionne avec n’importe quel environnement d’exécution Lambda
Vous préférez ne pas ajouter de dépendances de code à votre fonction
Vous souhaitez seulement récupérer des secrets à partir de Secrets Manager ou de Parameter Store
- Utilisez l’utilitaire de paramètres Powertools pour AWS Lambda quand :
-
Vous souhaitez bénéficier d’une expérience de développement intégrée au code de votre application
Vous avez besoin de la prise en charge de plusieurs fournisseurs (Secrets Manager, Parameter Store, AppConfig)
Vous souhaitez des transformations de données intégrées (analyse JSON, décodage Base64)
Vous utilisez des environnements d’exécution Python, TypeScript, Java ou .NET
Quand utiliser Secrets Manager avec Lambda
Les scénarios courants d’utilisation de Secrets Manager avec Lambda comprennent les suivants :
-
Stockage d’informations d’identification de base de données que votre fonction utilise pour se connecter à Amazon RDS ou d’autres bases de données
-
Gestion des clés d’API pour les services externes appelés par votre fonction
-
Stockage des clés de chiffrement ou d’autres données de configuration sensibles
-
Rotation automatique des informations d’identification sans qu’il soit nécessaire de mettre à jour le code de votre fonction
Utilisation de l’extension Lambda AWS Parameters and Secrets
L’extension Lambda AWS Parameters and Secrets utilise une interface HTTP simple compatible avec n’importe quel environnement d’exécution Lambda. Par défaut, elle met en cache les secrets pendant 300 secondes (5 minutes) et peut contenir jusqu’à 1 000 secrets. Vous pouvez personnaliser ces paramètres à l’aide de variables d’environnement.
Utiliser Secrets Manager dans une fonction Lambda
Cette section part du principe que vous possédez déjà un secret Secrets Manager. Pour créer un secret, consultez Créer un secret AWS Secrets Manager.
Choisissez votre environnement d’exécution préféré et suivez les étapes pour créer une fonction qui récupère les secrets depuis Secrets Manager. L’exemple de fonction extrait un secret dans Secrets Manager et peut être utilisé pour accéder aux informations d’identification de base de données, aux clés d’API ou à d’autres données de configuration sensibles dans vos applications.
Ouvrez la page Functions
(Fonctions) de la console Lambda. -
Choisissez Créer une fonction.
-
Sélectionnez Créer à partir de zéro.
-
Sous Nom de la fonction, saisissez
secret-retrieval-demo. -
Choisissez votre Environnement d’exécution préféré.
-
Choisissez Créer une fonction.
Charger un package de déploiement
-
Dans l’onglet Code de la fonction, choisissez Charger à partir de et sélectionnez Fichier .zip (pour Python et Node.js) ou Fichier .jar (pour Java).
-
Chargez le package de déploiement créé précédemment.
-
Choisissez Enregistrer.
Ajouter l’extension Lambda AWS Parameters and Secrets en tant que couche
-
Dans l’onglet Code de la fonction, faites défiler la page jusqu’à Couches.
-
Choisissez Add a layer (Ajouter une couche).
-
Sélectionnez Couches AWS.
-
Choisissez AWS-Parameters-and-Secrets-Lambda-Extension.
-
Sélectionnez la dernière version.
-
Choisissez Ajouter.
Ajouter des autorisations Secrets Manager à votre rôle d’exécution
-
Choisissez l’onglet Configuration, puis Permissions (Autorisations).
-
Sous Nom du rôle, cliquez sur le lien vers votre rôle d’exécution. Ce lien ouvre le rôle dans la console IAM.
-
Sélectionnez Ajouter des autorisations, puis Ajouter la politique.
-
Choisissez l’onglet JSON et ajoutez la politique suivante. Pour
Resource, saisissez l’ARN de votre secret. -
Choisissez Suivant.
-
Entrez le nom de la politique.
-
Choisissez Créer une politique.
Pour tester la fonction
-
Retournez à la console Lambda.
-
Sélectionnez l’onglet Test.
-
Sélectionnez Tester). Vous devriez voir la réponse suivante :
Variables d’environnement
L’extension Lambda AWS Parameters and Secrets utilise les paramètres par défaut suivants. Vous pouvez remplacer ces paramètres en créant les variables d’environnement correspondantes. Pour afficher les paramètres actuels d’une fonction, réglez PARAMETERS_SECRETS_EXTENSION_LOG_LEVEL sur DEBUG. L’extension enregistre ses informations de configuration dans CloudWatch Logs au début de chaque invocation de fonction.
| Paramètre | Valeur par défaut | Valeurs valides | Variable d'environnement | Détails |
|---|---|---|---|---|
| Port HTTP | 2773 | 1 – 65535 | PARAMETERS_SECRETS_EXTENSION_HTTP_PORT | Port du serveur HTTP local |
| Cache activé | TRUE | TRUE | FALSE | PARAMETERS_SECRETS_EXTENSION_CACHE_ENABLED | Activer ou désactiver le cache |
| Taille du cache | 1 000 | 0 - 1000 | PARAMETERS_SECRETS_EXTENSION_CACHE_SIZE | Définissez cette valeur sur 0 pour désactiver la mise en cache |
| TTL de Secrets Manager | 300 secondes | 0 à 300 secondes | SECRETS_MANAGER_TTL | Durée de vie des secrets mis en cache. Définissez sur 0 pour désactiver la mise en cache. Cette variable est ignorée si la valeur de PARAMETERS_SECRETS_EXTENSION_CACHE_SIZE est de 0. |
| TTL du magasin de paramètres | 300 secondes | 0 à 300 secondes | SSM_PARAMETER_STORE_TTL | Durée de vie des paramètres mis en cache. Définissez sur 0 pour désactiver la mise en cache. Cette variable est ignorée si la valeur de PARAMETERS_SECRETS_EXTENSION_CACHE_SIZE est de 0. |
| Niveau de journalisation | INFO | DEBUG | INFO | WARN | ERROR | NONE | PARAMETERS_SECRETS_EXTENSION_LOG_LEVEL | Le niveau de détail indiqué dans les journaux pour l’extension |
| Nombre maximal de connexions | 3 | 1 ou plus | PARAMETERS_SECRETS_EXTENSION_MAX_CONNECTIONS | Nombre maximum de connexions HTTP pour les requêtes à Parameter Store ou Secrets Manager. |
| Délai d’expiration de Secrets Manager | 0 (n’expire pas) | Tous les nombres entiers | SECRETS_MANAGER_TIMEOUT_MILLIS | Délai d’expiration des requêtes adressées à Secrets Manager (en millisecondes) |
| Délai d’expiration de Parameter Store | 0 (n’expire pas) | Tous les nombres entiers | SSM_PARAMETER_STORE_TIMEOUT_MILLIS | Délai d’expiration des requêtes adressées au Parameter Store (en millisecondes) |
Utilisation d’une rotation des secrets
Si vous alternez fréquemment les secrets, la durée de cache par défaut de 300 secondes peut entraîner l’utilisation de secrets obsolètes par votre fonction. Deux options s’offrent à vous pour vous assurer que votre fonction utilise la dernière valeur de secret :
-
Réduisez le TTL du cache en définissant la variable d’environnement
SECRETS_MANAGER_TTLsur une valeur inférieure (en secondes). Par exemple, configurez-le sur60pour que votre fonction n’utilise jamais un secret vieux de plus d’une minute. -
Utilisez les étiquettes intermédiaires
AWSCURRENTouAWSPREVIOUSdans votre demande de secret pour vous assurer d’obtenir la version spécifique que vous souhaitez :secretsmanager/get?secretId=YOUR_SECRET_NAME&versionStage=AWSCURRENT
Choisissez l’approche qui équilibre le mieux vos besoins en matière de performances et de fraîcheur. Un TTL inférieur signifie des appels plus fréquents à Secrets Manager, mais garantit que vous travaillez avec les valeurs de secret les plus récentes.
Utilisation de l’utilitaire de paramètres Powertools pour AWS Lambda
L’utilitaire de paramètres Powertools pour AWS Lambda fournit une interface unifiée permettant de récupérer des secrets auprès de plusieurs fournisseurs, notamment Secrets Manager, Parameter Store et AppConfig. Il gère la mise en cache, les transformations et fournit une expérience de développement plus intégrée par rapport à l’approche de l’extension.
Avantages de l’utilitaire de paramètres
Fournisseurs multiples : récupérez les paramètres depuis Secrets Manager, Parameter Store et AppConfig à l’aide de la même interface
Transformations intégrées : analyse automatique du JSON, décodage Base64 et autres transformations de données
Mise en cache intégrée : mise en cache configurable avec prise en charge de TTL pour réduire les appels d’API
Sécurité des types : prise en charge du typage fort dans TypeScript et les autres environnements d’exécution pris en charge
Gestion des erreurs : logique de nouvelle tentative et gestion des erreurs intégrées
Exemples de code
Les exemples suivants montrent comment récupérer des secrets à l’aide de l’utilitaire de paramètres dans différents environnements d’exécution :
- Python
-
Note
Pour obtenir des exemples complets et des instructions de configuration, consultez la documentation de l’utilitaire de paramètres
. Récupération de secrets à partir de Secrets Manager avec l’utilitaire de paramètres Powertools pour AWS Lambda.
from aws_lambda_powertools import Logger from aws_lambda_powertools.utilities import parameters logger = Logger() def lambda_handler(event, context): try: # Get secret with caching (default TTL: 5 seconds) secret_value = parameters.get_secret("my-secret-name") # Get secret with custom TTL secret_with_ttl = parameters.get_secret("my-secret-name", max_age=300) # Get secret and transform JSON secret_json = parameters.get_secret("my-json-secret", transform="json") logger.info("Successfully retrieved secrets") return { 'statusCode': 200, 'body': 'Successfully retrieved secrets' } except Exception as e: logger.error(f"Error retrieving secret: {str(e)}") return { 'statusCode': 500, 'body': f'Error: {str(e)}' } - TypeScript
-
Note
Pour obtenir des exemples complets et des instructions de configuration, consultez la documentation de l’utilitaire de paramètres.
Récupération de secrets à partir de Secrets Manager avec l’utilitaire de paramètres Powertools pour AWS Lambda.
import { Logger } from '@aws-lambda-powertools/logger'; import { getSecret } from '@aws-lambda-powertools/parameters/secrets'; import type { Context } from 'aws-lambda'; const logger = new Logger(); export const handler = async (event: any, context: Context) => { try { // Get secret with caching (default TTL: 5 seconds) const secretValue = await getSecret('my-secret-name'); // Get secret with custom TTL const secretWithTtl = await getSecret('my-secret-name', { maxAge: 300 }); // Get secret and transform JSON const secretJson = await getSecret('my-json-secret', { transform: 'json' }); logger.info('Successfully retrieved secrets'); return { statusCode: 200, body: 'Successfully retrieved secrets' }; } catch (error) { logger.error('Error retrieving secret', { error }); return { statusCode: 500, body: `Error: ${error}` }; } }; - Java
-
Note
Pour obtenir des exemples complets et des instructions de configuration, consultez la documentation de l’utilitaire de paramètres
. Récupération de secrets à partir de Secrets Manager avec l’utilitaire de paramètres Powertools pour AWS Lambda.
import software.amazon.lambda.powertools.logging.Logging; import software.amazon.lambda.powertools.parameters.SecretsProvider; import software.amazon.lambda.powertools.parameters.ParamManager; import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestHandler; public class SecretHandler implements RequestHandler<Object, String> { private final SecretsProvider secretsProvider = ParamManager.getSecretsProvider(); @Logging @Override public String handleRequest(Object input, Context context) { try { // Get secret with caching (default TTL: 5 seconds) String secretValue = secretsProvider.get("my-secret-name"); // Get secret with custom TTL (300 seconds) String secretWithTtl = secretsProvider.withMaxAge(300).get("my-secret-name"); // Get secret and transform JSON MySecret secretJson = secretsProvider.get("my-json-secret", MySecret.class); return "Successfully retrieved secrets"; } catch (Exception e) { return "Error retrieving secret: " + e.getMessage(); } } public static class MySecret { // Define your secret structure here } } - .NET
-
Note
Pour obtenir des exemples complets et des instructions de configuration, consultez la documentation de l’utilitaire de paramètres.
Récupération de secrets à partir de Secrets Manager avec l’utilitaire de paramètres Powertools pour AWS Lambda.
using AWS.Lambda.Powertools.Logging; using AWS.Lambda.Powertools.Parameters; using Amazon.Lambda.Core; [assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))] public class Function { private readonly ISecretsProvider _secretsProvider; public Function() { _secretsProvider = ParametersManager.SecretsProvider; } [Logging] public async Task<string> FunctionHandler(object input, ILambdaContext context) { try { // Get secret with caching (default TTL: 5 seconds) var secretValue = await _secretsProvider.GetAsync("my-secret-name"); // Get secret with custom TTL var secretWithTtl = await _secretsProvider.WithMaxAge(TimeSpan.FromMinutes(5)) .GetAsync("my-secret-name"); // Get secret and transform JSON var secretJson = await _secretsProvider.GetAsync<MySecret>("my-json-secret"); return "Successfully retrieved secrets"; } catch (Exception e) { return $"Error retrieving secret: {e.Message}"; } } public class MySecret { // Define your secret structure here } }
Configuration et autorisations
Pour utiliser l’utilitaire de paramètres :
Installez Powertools pour AWS Lambda pour votre environnement d’exécution. Pour en savoir plus, consultez Powertools pour AWS Lambda.
Ajoutez les autorisations IAM nécessaires au rôle d’exécution de votre fonction. Pour plus d'informations, consultez Gestion des autorisations dans AWS Lambda.
Configurez tous les paramètres facultatifs par le biais de variables d’environnement.
Les autorisations IAM requises sont les mêmes que pour l’approche de l’extension. L’utilitaire gère automatiquement la mise en cache et les appels d’API à Secrets Manager en fonction de votre configuration.