Function Compute déclenche des hooks de cycle de vie à des moments précis de l'existence d'une instance de fonction : une fois au démarrage et une fois avant l'arrêt. Cette rubrique explique comment implémenter les hooks Initializer et PreStop dans un runtime personnalisé.
Fonctionnement
Une instance de fonction passe par trois phases distinctes :
Initialisation : Lors de la création ou du dégel d'une instance, Function Compute appelle le hook Initializer (s'il est configuré) avant d'y router le moindre trafic. Exploitez cette phase pour charger des modèles, préparer les pools de connexions ou exécuter toute configuration préalable à la première requête.
Invocation : L'instance traite les invocations de fonction. Le handler principal achemine les requêtes vers votre logique métier.
Arrêt : Avant de geler ou de détruire une instance, Function Compute appelle le hook PreStop (s'il est configuré). Exploitez cette phase pour vider les tampons, fermer les connexions ou libérer des ressources.
Les hooks de cycle de vie sont facturés au même tarif que les invocations classiques. Leurs journaux apparaissent dans les Function Logs et les Advanced Logs, mais pas dans la liste Invocation Requests.
Pour plus d'informations sur la configuration du cycle de vie des instances, consultez Configurer le cycle de vie des instances.
Référence de l'interface des hooks
Votre serveur HTTP de runtime personnalisé doit exposer les endpoints suivants :
| Hook | Chemin | Méthode | Corps de la requête | Succès | Échec |
|---|---|---|---|---|---|
| Initializer | /initialize |
POST |
Aucun | 2xx | Non-2xx |
| PreStop | /pre-stop |
GET |
Aucun | 2xx | Non-2xx |
Ces deux hooks reçoivent les en-têtes de requête communs, y compris x-fc-request-id.
Si le hook Initializer expire ou renvoie un statut non-2xx, le serveur retourne tout de même un code HTTP 200. Vérifiez l'en-tête de réponse X-Fc-Error-Type:InitializationError ou le champ errorMessage dans le corps de la réponse pour détecter les échecs d'initialisation.
Implémenter les hooks de cycle de vie
L'exemple Flask Python 3.10 ci-dessous présente les trois endpoints au sein d'un même serveur HTTP : le hook Initializer, le handler d'invocation principal et le hook PreStop.
import os
from flask import Flask, request
app = Flask(__name__)
# Initializer hook — runs once when the instance starts
@app.route('/initialize', methods=['POST'])
def init_invoke():
rid = request.headers.get('x-fc-request-id')
print("FC Initialize Start RequestId: " + rid)
# Add setup logic here: load models, open connections, etc.
print("FC Initialize End RequestId: " + rid)
return "OK"
# Main invocation handler
@app.route('/', defaults={'path': ''})
@app.route('/<path:path>', methods=['GET', 'POST', 'PUT', 'DELETE'])
def hello_world(path):
rid = request.headers.get('x-fc-request-id')
print("FC invoke Start RequestId: " + rid)
# Add business logic here
print("FC invoke End RequestId: " + rid)
return "Hello, World!", 200, [('Function-Name', os.getenv('FC_FUNCTION_NAME'))]
# PreStop hook — runs before the instance is frozen or destroyed
@app.route('/pre-stop', methods=['GET'])
def prestop_invoke():
rid = request.headers.get('x-fc-request-id')
print("FC PreStop Start RequestId: " + rid)
# Add cleanup logic here: flush buffers, close connections, etc.
print("FC PreStop End RequestId: " + rid)
return "OK"
if __name__ == '__main__':
app.run(host='0.0.0.0', port=9000)
N'implémentez /initialize que si vous avez configuré un Initializer pour la fonction. En l'absence de configuration, Function Compute n'appelle jamais /initialize, même si cet endpoint existe dans votre serveur HTTP.
Le hook PreStop suit le même modèle d'implémentation que le hook Initializer.
Scénarios d'erreur pour le hook Initializer
Si la logique d'initialisation lève une exception ou retourne un statut non-2xx, Function Compute enregistre une erreur d'initialisation :
# Scenario 1: unhandled exception
@app.route('/initialize', methods=['POST'])
def init():
raise Exception("initialization failed")
return "OK", 200, []
# Scenario 2: explicit non-2xx response
@app.route('/initialize', methods=['POST'])
def init():
return "OK", 404, []
Gestion des erreurs
La réaction de Function Compute face aux erreurs varie selon le hook concerné et le code de statut retourné.
Erreurs liées à l'Initializer
| Code de statut | Comportement de la plateforme |
|---|---|
| 400, 404 | Function Compute ne renvoie pas la requête en cours. Il réessaie le hook Initializer jusqu'à ce qu'il réussisse. |
| 500 | Function Compute redémarre l'instance de fonction. |
Erreurs liées au PreStop
| Code de statut | Comportement de la plateforme |
|---|---|
| 400, 404 | L'erreur n'affecte ni le gel ni l'arrêt de l'instance. Function Compute poursuit son exécution normalement. |
Configurer les 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 à configurer.
Cliquez sur l'onglet Configuration. Dans la section Instance Configuration, cliquez sur Modify.
Dans le panneau Instance Configuration, définissez le type de hook et le délai d'expiration, puis cliquez sur Deploy.
Implémentez la logique du hook dans votre code. Cliquez sur Deploy au-dessus de l'éditeur de code, puis sur Test Function.
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.
Sélectionnez une région et cliquez sur la fonction à inspecter.
Cliquez sur l'onglet Test, cliquez sur Test Function, puis choisissez Logs > Function Logs.
Les Function Logs affichent les journaux d'invocation et ceux du hook Initializer par ordre chronologique. L'exemple suivant montre une exécution de l'Initializer suivie d'une invocation de fonction :
2024-06-26 10:59:23FC Initialize Start RequestId: 529eab23-9b3a-4ffc-88c8-9a686*******
2024-06-26 10:59:23FC Initialize End RequestId: 529eab23-9b3a-4ffc-88c8-9a686*******
2024-06-26 10:59:25FC Invoke Start RequestId: 1-667b840c-15c49df0-b7dc1*******
2024-06-26 10:59:25FC Invoke End RequestId: 1-667b840c-15c49df0-b7dc1*******
Les journaux du hook PreStop peuvent ne pas apparaître immédiatement, car Function Compute conserve l'instance en cache pendant un certain temps avant de la détruire. Pour déclencher le hook PreStop à la demande, mettez à jour la configuration ou le code de la fonction, puis vérifiez les Function Logs :
2024-06-26 11:04:33FC PreStop Start RequestId: c4385899-f071-490e-a8b7-e33c5*******
2024-06-26 11:04:33FC PreStop End RequestId: c4385899-f071-490e-a8b7-e33c5*******