Tous les produits
Search
Centre de documentation

Function Compute:Hooks du cycle de vie des instances

Dernière mise à jour :Sep 17, 2026

Les hooks du cycle de vie des instances exécutent votre logique personnalisée lors du démarrage ou de l'arrêt d'une instance de fonction. Cette rubrique décrit comment implémenter et configurer les hooks Initializer et PreStop pour les fonctions utilisant des images personnalisées.

Informations générales

Le cycle de vie d'une instance de fonction comprend les hooks Initializer et PreStop. Function Compute appelle le hook correspondant lorsqu'un événement lié au cycle de vie de l'instance se produit.

Un hook Initializer existe en deux types : invoke code et execute instruction. Actuellement, seules les fonctions accélérées par GPU prennent en charge le type execute instruction pour le hook Initializer. Pour plus d'informations, consultez la section Configurer le cycle de vie des instances.

Les règles de facturation applicables aux hooks du cycle de vie des instances sont identiques à celles des requêtes d'appel standard.

Pour plus d'informations sur les journaux des hooks, consultez la section Afficher les journaux des hooks du cycle de vie des instances.

Types de hooks

Les hooks Initializer prennent en charge deux types d'implémentation. Le tableau suivant les compare.

Type de hook

Mécanisme

Champ d'application

invoke code

Function Compute envoie une requête HTTP à votre fonction. Votre code métier répond à la requête.

Hooks Initializer et PreStop

execute instruction

Function Compute exécute une commande shell ou un script que vous configurez. Le code de sortie détermine le succès ou l'échec.

Hooks Initializer uniquement pour les fonctions accélérées par GPU

Vous ne pouvez configurer qu'un seul des deux types pour un hook Initializer.

Implémenter des hooks

Les sections suivantes décrivent comment implémenter chaque type de hook.

Invoke code

Après avoir configuré un hook de type invoke code, Function Compute envoie une requête HTTP POST /initialize ou GET /pre-stop à votre fonction lorsque l'instance démarre ou s'arrête. Vous devez répondre à la requête dans votre code métier.

Chemin

Requête

Réponse attendue

(Facultatif) POST /initialize

Corps de la requête : Aucun. En-têtes de requête : en-têtes de requête communs. Pour plus d'informations, consultez la section En-têtes de requête communs de Function Compute.

Corps de la réponse : valeur renvoyée par l'Initializer de la fonction. Code d'état : 2xx : succès. Non-2xx : échec. Lorsqu'un hook Initializer expire ou échoue, le serveur renvoie toujours le code d'état HTTP 200. Utilisez 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éterminer si l'erreur est due à un échec d'initialisation. Pour le comportement système de chaque code d'erreur, consultez la section Codes d'erreur des hooks.

(Facultatif) GET /pre-stop

Corps de la requête : Aucun. En-têtes de requête : en-têtes de requête communs. Pour plus d'informations, consultez la section En-têtes de requête communs de Function Compute.

Corps de la réponse : valeur renvoyée par le PreStop de la fonction.

  • 2xx : Succès.

  • Non-2xx : Échec.

La colonne Path est marquée (Optional) car chaque hook est une configuration facultative. Si vous ne définissez pas d'Initializer pour la fonction que vous créez, vous n'avez pas besoin d'implémenter /initialize. Dans ce cas, même si votre serveur HTTP implémente /initialize, la logique /initialize de votre code n'est jamais appelée. Il en va de même pour PreStop.

Pour utiliser la méthode de hook Initializer dans une image personnalisée, implémentez la logique pour le chemin /initialize avec la méthode POST dans votre serveur HTTP. Il en va de même pour la méthode de hook PreStop. L'exemple de programme suivant utilise le runtime personnalisé Python 3.10.

import os
from flask import Flask
from flask import request
app = Flask(__name__)
@app.route('/initialize', methods=['POST'])
def init_invoke():
    rid = request.headers.get('x-fc-request-id')
    print("FC Initialize Start RequestId: " + rid)
    # do your things
    print("FC Initialize End RequestId: " + rid)
    return "OK"
@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)
    # do your things
    print("FC invoke End RequestId: " + rid)
    return "Hello, World!", 200, [('Function-Name', os.getenv('FC_FUNCTION_NAME'))]
@app.route('/pre-stop', methods=['GET'])
def prestop_invoke():
    rid = request.headers.get('x-fc-request-id')
    print("FC PreStop Start RequestId: " + rid)
    # do your things
    print("FC PreStop End RequestId: " + rid)
    return "OK"
if __name__ == '__main__':
    app.run(host='0.0.0.0', port=9000)

Votre code de hook peut également échouer à l'exécution. Les exemples suivants pour /initialize illustrent deux échecs typiques et la manière dont Function Compute y répond. Pour le comportement système de chaque code d'erreur, consultez la section Codes d'erreur des hooks.

Dans l'exemple suivant, le gestionnaire lève une exception. Function Compute traite l'échec comme une erreur 500 et redémarre l'instance.

@app.route('/initialize', methods=['POST'])
def init():
    raise Exception("hahaha")
    return "OK", 200, []

Dans l'exemple suivant, le gestionnaire renvoie un code d'état 404. Function Compute ne renvoie pas la requête.

@app.route('/initialize', methods=['POST'])
def init():
    return "OK", 404, []

Execute instruction (fonctions accélérées par GPU uniquement)

Important

Le type execute instruction est disponible uniquement pour les fonctions accélérées par GPU.

Avec le type execute instruction, Function Compute exécute la commande shell ou le script que vous configurez après le démarrage de l'instance de fonction. Un code de sortie de 0 indique que l'instruction du hook a été exécutée avec succès. Tout autre code de sortie indique un échec.

Vous pouvez utiliser une implémentation shell personnalisée, telle que /bin/bash, /bin/sh, /bin/csh ou /bin/zsh. Assurez-vous que l'environnement d'exécution de la fonction prend en charge l'implémentation shell que vous utilisez.

La console Function Compute propose /bin/bash et /bin/sh comme options prédéfinies. L'exemple suivant utilise /bin/sh. Le script effectue un contrôle d'intégrité de l'initialisation : il utilise curl pour envoyer une requête à un service local et jq pour formater la sortie. Assurez-vous que ces deux outils sont disponibles dans votre environnement d'exécution.

#!/bin/sh
URL="http://localhost:7860"
REQUEST_PATH="sdapi/v1/txt2img"
JSON_DATA='{
    "prompt": "",
    "steps": 1,
    "height": 8,
    "width": 8
}'
temp_file=$(mktemp)
trap 'rm -f "$temp_file"' EXIT
if ! http_code=$(curl -s -w "%{http_code}" \
    -H "Content-Type: application/json" \
    -d "$JSON_DATA" \
    -o "$temp_file" \
    -X POST "$URL"/"$REQUEST_PATH"); then
    echo "{\"status\": \"curl_error\", \"code\": $curl_exit_code}" \
| jq . >&2
    exit 1
fi
response=$(<"$temp_file")
echo "http code $http_code"
if [ "$http_code" -eq 200 ]; then
    echo "$response" | jq -r '.' || printf "%s\n" "$response"
    exit 0
else
    echo "$response_body" \
| jq -c 'if type == "object" then . else {raw: .} end' 2>/dev/null \
| jq -s '{status: "http_error", code: $code, response: .[0]}' \
        --arg code "$http_code" \
        >&2
    exit 1
fi

Écrivez les informations d'erreur sur la sortie d'erreur standard (stderr) dans votre script pour aider à identifier la cause d'une erreur. Par exemple, l'extrait de code suivant écrit les informations d'erreur lorsque la requête curl échoue et définit le code de sortie sur 1. Le même comportement d'échec s'applique : si l'instruction renvoie un code de sortie non nul, l'instruction n'est pas réexécutée et le système renvoie l'erreur correspondante. Pour plus d'informations, consultez la section Codes d'erreur des hooks.

if ! http_code=$(curl -s -w "%{http_code}" \
    -H "Content-Type: application/json" \
    -d "$JSON_DATA" \
    -o "$temp_file" \
    -X POST "$URL"/"$REQUEST_PATH"); then
    echo "{\"status\": \"curl_error\", \"code\": $curl_exit_code}" \
| jq . >&2
    exit 1
fi

Configurer les hooks du cycle de vie

  1. Connectez-vous à la console Function Compute. Dans le volet de navigation de gauche, choisissez Function Management > Functions.

  2. Dans la barre de navigation supérieure, sélectionnez une région. Sur la page Functions, cliquez sur la fonction cible.

  3. Sur la page des détails de la fonction, cliquez sur l'onglet Configuration. Dans la section Instance Configuration, cliquez sur Modify.

  4. Dans le panneau Instance Configuration, configurez le hook Initializer. Activez l'interrupteur Initializer hook, puis définissez Initializer timeout selon vos besoins métier. Dans cet exemple, le délai d'expiration est défini sur 300 secondes. Pour hook type, sélectionnez l'un des types suivants :

    • invoke code

      Une fois le hook activé, Function Compute envoie une requête HTTP POST /initialize à la fonction lorsque l'instance démarre. Votre code métier doit répondre à la requête et renvoyer le code d'état 200.

    • execute instruction

      Le type execute instruction est disponible uniquement pour les fonctions accélérées par GPU.

      Sélectionnez execute instruction comme type de hook, puis choisissez une instruction shell, telle que /bin/sh. Dans l'éditeur de code, écrivez le script d'initialisation. Pour un exemple complet, consultez la section Execute instruction (fonctions accélérées par GPU uniquement).

  5. (Facultatif) Configurez le hook PreStop. Activez l'interrupteur PreStop hook, puis définissez PreStop timeout selon vos besoins métier. Dans cet exemple, le délai d'expiration est défini sur 3 secondes.

  6. Cliquez sur Deploy.

  7. Vérifiez que les hooks prennent effet. Appelez la fonction ou mettez à jour la configuration ou le code de la fonction pour déclencher la création et la destruction d'instances. Ensuite, vérifiez les journaux des hooks en suivant les instructions de la section Afficher les journaux des hooks du cycle de vie des instances.

Afficher les journaux des hooks du cycle de vie des instances

Vous pouvez interroger les journaux d'exécution des hooks dans Real-time Log, Function Logs ou Advanced Logs. La liste Invocation Request List n'affiche pas les journaux des hooks.

Important

Les journaux générés par les hooks execute instruction ne peuvent pas être écrits dans Function Logs.

Vous pouvez afficher les journaux des hooks à l'aide de la fonctionnalité Function Logs.

  1. Connectez-vous à la console Function Compute. Dans le volet de navigation de gauche, choisissez Function Management > Functions.

  2. Dans la barre de navigation supérieure, sélectionnez une région. Sur la page Functions, cliquez sur la fonction cible.

  3. Sur la page des détails de la fonction, cliquez sur l'onglet Test, cliquez sur Test Function, puis choisissez Logs > Function Logs.

    Sur l'onglet Function Logs, vous pouvez afficher les journaux d'appel et les journaux du hook Initializer de la fonction. L'exemple suivant montre les journaux.

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*******

Chaque instance de fonction est mise en cache pendant une certaine période et n'est pas détruite immédiatement ; les journaux du hook PreStop ne sont donc pas disponibles immédiatement. Pour déclencher rapidement le hook PreStop, mettez à jour la configuration ou le code de la fonction. Une fois la mise à jour terminée, vérifiez à nouveau Function Logs pour afficher les journaux du hook PreStop. L'exemple suivant montre les journaux.

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*******

Codes d'erreur des hooks

Invoke code

Code d'erreur

Description

400

Si un hook Initializer de fonction échoue et renvoie 400 ou 404, la requête n'est pas renvoyée, mais le système continue de réessayer jusqu'à ce que l'appel réussisse. Si un hook PreStop de fonction échoue et renvoie 400 ou 404, la mise en pause et l'arrêt de l'instance de fonction ne sont pas affectés.

404

500

Function Compute redémarre l'instance.

Execute instruction

Si l'instruction renvoie un code de sortie non nul, l'instruction n'est pas réexécutée et le système renvoie l'erreur correspondante. Si votre script écrit des informations d'erreur sur stderr, vous pouvez utiliser cette sortie pour identifier la cause de l'échec.