Lorsqu'une instance de fonction démarre ou s'arrête, vous pouvez avoir besoin d'exécuter une logique personnalisée, par exemple pour ouvrir une connexion à une base de données avant la première requête ou libérer correctement les ressources avant la destruction de l'instance. Les hooks de cycle de vie permettent d'enregistrer des fonctions Python que Function Compute appelle automatiquement à ces deux moments clés du cycle de vie d'une instance.
Deux types de hooks sont disponibles pour les environnements d'exécution Python :
Initializer hook : s'exécute une seule fois après le démarrage de l'instance, avant que le handler ne traite la moindre requête.
PreStop hook : s'exécute avant la destruction de l'instance et laisse le temps nécessaire pour libérer les ressources.
Fonctionnement des hooks de cycle de vie
Une instance de fonction passe par trois phases distinctes :
| Phase | Moment d'exécution | Hook |
|---|---|---|
| Init | Démarrage de l'instance | Initializer hook (si configuré) |
| Invoke | Traitement des requêtes par le handler | — |
| Shutdown | Destruction de l'instance | PreStop hook (si configuré) |
L'exécution des hooks de cycle de vie est facturée au même tarif que les invocations classiques. Les journaux apparaissent dans Function Logs, Real-time Logs et Advanced Logs, mais pas dans la liste des requêtes d'invocation.
Initializer hook
Le hook Initializer s'exécute une fois par instance, après son démarrage et avant la première invocation du handler. Function Compute garantit une exécution unique pour chaque instance.
Comportement en cas d'échec : si le hook échoue, l'invocation renvoie une erreur. Lors de l'invocation suivante, Function Compute crée une nouvelle instance et exécute à nouveau le hook Initializer.
Signature de la méthode :
| Paramètre | Description |
|---|---|
context |
Fournit les métadonnées d'exécution pour l'invocation en cours. |
| Valeur de retour | Aucune. |
Exemple : initialiser une connexion à une base de données
Une pratique courante consiste à ouvrir les ressources partagées dans le hook Initializer afin que chaque invocation du handler les réutilise, plutôt que de se reconnecter à chaque requête.
import os
import pymysql
db_connection = None
def initialize(context):
global db_connection
host = os.environ.get("DB_HOST")
user = os.environ.get("DB_USER")
password = os.environ.get("DB_PASSWORD")
database = os.environ.get("DB_NAME")
db_connection = pymysql.connect(
host=host,
user=user,
password=password,
database=database,
)
print("Database connection established")
Le nom de la méthode (initialize dans cet exemple) doit correspondre à la valeur définie dans le champ Initializer Hook. Par exemple, définir Initializer Hook sur index.initialize indique à Function Compute d'appeler la méthode initialize située dans index.py.
PreStop hook
Le hook PreStop s'exécute avant la destruction d'une instance de fonction. Sa signature de méthode est identique à celle du hook Initializer : un paramètre context et aucune valeur de retour.
Exemple : fermer une connexion à une base de données
def preStop(context):
global db_connection
if db_connection:
db_connection.close()
print("Database connection closed")
Les instances de fonction sont mises en cache et ne sont pas détruites immédiatement après la dernière invocation. Les journaux PreStop peuvent donc ne pas apparaître tout de suite. Pour déclencher rapidement un hook PreStop à des fins de test, mettez à jour la configuration ou le code de la fonction. Cette opération recycle les instances existantes et permet ensuite de consulter les journaux PreStop dans Function Logs .
Configurer les hooks de cycle de vie
Utiliser la console Function Compute
Connectez-vous à la console Function Compute. Dans le volet de navigation de gauche, cliquez sur Functions.
Sélectionnez la fonction à configurer.
Dans les paramètres de la fonction, renseignez les champs Initializer Hook et PreStop Hook en respectant le format
<filename>.<method>, par exempleindex.initializeouindex.preStop.
Pour connaître la procédure détaillée, consultez Configurer les cycles de vie des instances.

Utiliser Serverless Devs
Ajoutez instanceLifecycleConfig sous la ressource de fonction dans le fichier s.yaml. Chaque hook nécessite un handler (au format <filename>.<method>) ainsi qu'un timeout (en secondes).
edition: 3.0.0
name: fcDeployApp
access: "default"
vars: # The global variables
region: "cn-hangzhou"
resources:
hello_world:
component: fc3 # The name of the component
props:
region: ${vars.region}
functionName: "emojipy"
description: 'this is emoji'
runtime: "python3"
code: ./
handler: index.handler
memorySize: 128
timeout: 30
environmentVariables:
PYTHONPATH: /code:/code/python:/opt/python
instanceLifecycleConfig:
initializer:
handler: index.initialize
timeout: 60 # Timeout in seconds for the Initializer hook
preStop:
handler: index.preStop
timeout: 60 # Timeout in seconds for the PreStop hook
Définissez une valeur de timeout suffisamment longue pour couvrir votre logique d'initialisation ou de nettoyage. Pour plus de détails sur la syntaxe YAML, consultez 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 concernée.
Sur la page de détails de la fonction, cliquez sur l'onglet Test Function, puis cliquez sur Test Function et choisissez Logs > Function Logs.
L'onglet Logs affiche à la fois les journaux d'invocation et ceux des hooks de cycle de vie. Chaque exécution de hook est encadrée par les marqueurs Start et End qui incluent le RequestId :
2024-03-04 17:57:28FC Initialize Start RequestId: 1-65e59b07-1520da26-bf73bbb91b69
2024-03-04 17:57:282024-03-04 09:57:28.192 1-65e59b07-1520da26-bf73bbb91b69 [info] initializer
2024-03-04 17:57:28FC Initialize End RequestId: 1-65e59b07-1520da26-bf73bbb91b69
2024-03-04 17:57:28FC Invoke Start RequestId: 1-65e59b07-1520da26-bf73bbb91b69
2024-03-04 17:57:28FC Invoke End RequestId: 1-65e59b07-1520da26-bf73bbb91b69
Les journaux du hook PreStop suivent le même format :
2024-03-04 18:33:26FC PreStop Start RequestId: 93c93603-9fbe-4576-9458-193c8b213031
2024-03-04 18:33:262024-03-04 10:33:26.077 93c93603-9fbe-4576-9458-193c8b213031 [info] preStop
2024-03-04 18:33:26FC PreStop End RequestId: 93c93603-9fbe-4576-9458-193c8b213031
Étapes suivantes
Configurer les cycles de vie des instances : référence complète pour tous les paramètres du cycle de vie des instances.
Exemple python3-mysql : exemple complet utilisant les hooks Initializer et PreStop pour gérer les connexions à une base de données MySQL.