Function Compute prend en charge deux hooks de cycle de vie pour les instances de fonction Node.js : un Initializer hook qui s'exécute une seule fois après le démarrage d'une instance, et un PreStop hook qui s'exécute avant la destruction d'une instance. Utilisez ces hooks pour gérer les ressources, telles que les connexions à une base de données, devant être initialisées une fois par instance puis libérées lors de l'arrêt de celle-ci.
Fonctionnement des hooks de cycle de vie
Une instance de fonction passe par les étapes suivantes :
Démarrage de l'instance
Exécution du Initializer hook (une fois maximum par instance)
Exécution du Handler pour chaque requête d'invocation
Planification de la destruction de l'instance
Exécution du PreStop hook
Destruction de l'instance
Les journaux d'exécution des hooks sont facturés au même tarif que les requêtes d'invocation standard. Toutefois, ces journaux n'apparaissent que dans les sections Function Logs, Real-time Logs et Advanced Logs, mais pas dans la liste des requêtes d'invocation. Pour plus d'informations, consultez la section Consulter les journaux des hooks de cycle de vie.
Initializer hook
L'Initializer hook s'exécute après le démarrage d'une instance de fonction et avant que le handler ne traite toute requête. Function Compute garantit que ce hook s'exécute au maximum une fois durant le cycle de vie de l'instance. En cas d'échec, Function Compute réessaie automatiquement jusqu'à réussite avant d'acheminer toute requête vers l'instance.
Utilisez l'Initializer hook pour configurer des ressources partagées. Par exemple, ouvrez une connexion à une base de données réutilisable par toutes les invocations ultérieures plutôt que de vous reconnecter lors de chaque appel.
Signature de la méthode
| Aspect | Détails |
|---|---|
| Entrée | Uniquement context — fournit le contexte d'exécution au moment de l'invocation |
| Retour | Aucune valeur de retour. Appelez return (ESM) ou callback (CommonJS) pour signaler la fin de l'exécution |
Exemples de code
Les deux exemples suivants utilisent initialize comme nom de fonction de hook. Ce nom doit correspondre à celui configuré pour l'Initializer hook dans la console Function Compute.
Modules ECMAScript (Node.js 18 et versions ultérieures)
export const initialize = async (context) => {
console.log('initializer');
return "";
}
Modules CommonJS
exports.initialize = function(context, callback) {
console.log('initializer');
callback(null, "");
};
PreStop hook
Le PreStop hook s'exécute avant la destruction d'une instance de fonction. Sa signature de méthode est identique à celle de l'Initializer hook : il accepte uniquement context en entrée et nécessite un appel à return ou callback pour se terminer.
Utilisez le PreStop hook pour libérer les ressources détenues par l'instance, notamment en fermant les connexions aux bases de données avant l'arrêt de l'instance.
Les instances de fonction restent mises en cache pendant un certain temps après l'arrêt du traitement ; le PreStop hook ne s'exécute donc pas immédiatement après la fin d'une invocation. Pour déclencher rapidement le PreStop à des fins de test, mettez à jour la configuration ou le code de la fonction afin de forcer le remplacement de l'instance existante et ainsi déclencher le PreStop hook.
Exemples de code
Les deux exemples ci-dessous utilisent preStop comme nom de fonction de hook. Ce nom doit correspondre à celui configuré pour le PreStop hook dans la console.
Modules ECMAScript (Node.js 18 et versions ultérieures)
export const preStop = async (context) => {
console.log('preStop');
return "";
}
Modules CommonJS
module.exports.preStop = function(context, callback) {
console.log('preStop');
callback(null, "");
}
Configurer les hooks de cycle de vie
Via la console Function Compute
Dans la console Function Compute, configurez l'Initializer hook et le PreStop hook dans les paramètres de la fonction. Pour plus de détails, consultez Configurer les cycles de vie des instances.
Spécifiez le nom de chaque hook au format [nomfichier.nomméthode] :
| Hook | Valeur | Description |
|---|---|---|
| Initializer hook | index.initialize |
Méthode initialize dans index.js |
| PreStop hook | index.preStop |
Méthode preStop dans index.js |

Avec Serverless Devs
Ajoutez instanceLifecycleConfig sous props dans votre fichier s.yaml. Chaque hook nécessite un handler (au format nomfichier.nomméthode) ainsi qu'un paramètre timeout (en secondes).
edition: 3.0.0
name: hello-world-app
access: default
resources:
hello_world:
component: fc3
props:
region: cn-hangzhou
functionName: nodejs-fc-hooks
description: "Node.js lifecycle hooks by serverless devs"
runtime: nodejs20
code: ./code
handler: index.handler
memorySize: 128
timeout: 30
instanceLifecycleConfig:
preStop:
handler: index.preStop
timeout: 3
initializer:
handler: index.initialize
timeout: 3
internetAccess: true
logConfig: auto
Pour consulter la liste complète des champs YAML pris en charge, reportez-vous à la rubrique Commandes courantes de Serverless Devs.
Consulter les journaux des hooks de cycle de vie
Connectez-vous à la console Function Compute. Dans le volet de navigation de gauche, cliquez sur Functions.
Dans la barre de navigation supérieure, sélectionnez une région. Sur la page Functions, cliquez sur la fonction cible.
Sur la page de détails de la fonction, cliquez sur l'onglet Test Function, puis sur Test Function, et enfin choisissez Logs > Function Logs.
L'onglet Logs affiche à la fois les journaux d'invocation et ceux de l'Initializer. Exemple :
2023-09-06 11:18:10 FC Initialize Start RequestId: 1-64f7ef72-64caf1ff0046194d9a26bbd7
2023-09-06 11:18:10 load code for handler:index.initialize
2023-09-06 11:18:10 2023-09-06 11:18:10 1-64f7ef72-64caf1ff0046194d9a26bbd7 [verbose] initializer
2023-09-06 11:18:10 FC Initialize End RequestId: 1-64f7ef72-64caf1ff0046194d9a26bbd7
2023-09-06 11:18:10 FC Invoke Start RequestId: 1-64f7ef72-64caf1ff0046194d9a26bbd7
2023-09-06 11:18:10 load code for handler:index.handler
2023-09-06 11:18:10 FC Invoke End RequestId: 1-64f7ef72-64caf1ff0046194d9a26bbd7
Pour afficher les journaux du PreStop hook, mettez à jour la configuration ou le code de la fonction afin de forcer le remplacement de l'instance. Une fois la mise à jour terminée, les journaux PreStop apparaissent dans Function Logs. Exemple :
2023-09-06 11:08:10 FC PreStop Start RequestId: 944bca62-b209-47a1-9e48-2723647bce0a
2023-09-06 11:08:10 load code for handler:index.preStop
2023-09-06 11:08:10 2023-09-06 11:08:10 944bca62-b209-47a1-9e48-2723647bce0a [verbose] preStop
2023-09-06 11:08:10 FC PreStop End RequestId: 944bca62-b209-47a1-9e48-2723647bce0a
Programme d'exemple
Un exemple complet en Node.js utilisant les deux hooks avec une base de données MySQL est disponible à l'adresse suivante : nodejs14-mysql. L'Initializer hook lit la configuration MySQL depuis les variables d'environnement, crée une connexion et teste la connectivité. Le PreStop hook ferme ensuite cette connexion.