Cette rubrique décrit les méthodes d'invocation, les limites et des exemples de code pour les fonctions dans un runtime personnalisé.
Informations générales
Un runtime personnalisé peut héberger votre serveur HTTP. Function Compute convertit les requêtes d'invocation de fonction en requêtes HTTP et les envoie à votre serveur HTTP. Il convertit ensuite les réponses de votre serveur HTTP en réponses d'invocation de fonction et les renvoie au client. Le schéma suivant illustre ce processus.
Vous pouvez invoquer une fonction de l'une des deux manières suivantes :
Appel HTTP (recommandé) : invoquez la fonction via HTTP, par exemple en utilisant un déclencheur HTTP ou un nom de domaine personnalisé.
Appel API : invoquez la fonction en appelant l'API InvokeFunction, par exemple en utilisant un SDK ou en déclenchant la fonction via une source d'événement.
Les différentes méthodes d'invocation entraînent des formats de requête et de réponse différents pour votre serveur HTTP.
Limites
Vous ne pouvez créer qu'un seul déclencheur HTTP pour chaque version ou alias d'une fonction. Pour plus d'informations, consultez Gérer les versions et Gérer les alias.
-
Limites des requêtes HTTP
-
Les en-têtes de requête ne prennent pas en charge les champs personnalisés commençant par
x-fc-ni les champs personnalisés suivants :connection
keep-alive
-
Si une requête dépasse les limites suivantes, un code d'état
400et un code d'erreurInvalidArgumentsont renvoyés.Taille des en-têtes : la taille totale de toutes les clés et valeurs dans les en-têtes ne peut pas dépasser 8 Ko.
Taille du chemin : la taille totale du chemin, y compris tous les paramètres de requête, ne peut pas dépasser 4 Ko.
Taille du corps : la taille totale du corps de la requête pour une invocation synchrone ne peut pas dépasser 32 Mo. La taille totale du corps de la requête pour une invocation asynchrone ne peut pas dépasser 128 Ko.
-
-
Limites des réponses HTTP
-
Les en-têtes de réponse ne prennent pas en charge les champs personnalisés commençant par
x-fc-ni les champs personnalisés suivants :connection
content-length
date
keep-alive
server
-
content-disposition:attachment
RemarquePour des raisons de sécurité, lorsque vous utilisez le domaine par défaut aliyuncs.com de Function Compute, le serveur ajoute systématiquement l'en-tête
content-disposition: attachmentaux en-têtes de réponse. Cet en-tête entraîne le téléchargement de la réponse en tant que pièce jointe dans le navigateur. Pour supprimer cette restriction, configurez un nom de domaine personnalisé.
-
Si une réponse dépasse les limites suivantes, un code d'état
502et un code d'erreurBadResponsesont renvoyés.Taille des en-têtes : la taille totale de toutes les clés et valeurs dans les en-têtes ne peut pas dépasser 8 Ko.
-
-
Autres remarques d'utilisation
Vous pouvez mapper différents chemins d'accès HTTP vers votre fonction en liant un nom de domaine personnalisé. Pour plus d'informations, consultez Configurer un nom de domaine personnalisé.
Appel HTTP (recommandé)
Pour les invocations HTTP, Function Compute utilise le mode de transfert transparent. Il transmet la requête HTTP du client directement à votre serveur HTTP et renvoie la réponse du serveur HTTP directement au client. Certains champs réservés par le système ne sont pas transmis. Pour plus d'informations, consultez la section Limites.
En-têtes de requête
Lorsque vous invoquez une fonction à l'aide d'un déclencheur HTTP ou d'un nom de domaine personnalisé, Function Compute vous permet de configurer des en-têtes de requête pour contrôler le comportement de la requête. Le tableau suivant décrit les en-têtes de requête pris en charge.
|
Nom |
Type |
Obligatoire |
Exemple |
Description |
|
X-Fc-Invocation-Type |
String |
Non |
Sync |
La méthode d'invocation. Pour plus d'informations, consultez Méthodes d'invocation. Valeurs valides :
|
|
X-Fc-Log-Type |
String |
Non |
Tail |
Les journaux à renvoyer dans la réponse. Valeurs valides :
|
En-têtes de réponse
Lorsque vous invoquez une fonction à l'aide d'un déclencheur HTTP ou d'un nom de domaine personnalisé, la réponse contient certains en-têtes de réponse ajoutés par défaut par Function Compute. Le tableau suivant décrit ces en-têtes de réponse.
|
Nom |
Description |
Exemple |
|
X-Fc-Request-Id |
L'ID de la requête d'invocation de la fonction. |
dab25e58-9356-4e3f-97d6-f044c4**** |
Appel API
Pour les invocations utilisant l'API InvokeFunction, Function Compute convertit la requête InvokeFunction en une requête HTTP et l'envoie à votre serveur HTTP. Les règles de conversion sont les suivantes :
Le paramètre
eventde InvokeFunction est converti en corps de message de la requête HTTP.pathest/invoke.methodestPOST.L'en-tête de message
Content-Typeestapplication/octet-stream.
Function Compute convertit la réponse de votre serveur HTTP en réponse InvokeFunction et la renvoie au client. Les règles de conversion sont les suivantes :
Le corps de la réponse HTTP est converti en corps de la réponse InvokeFunction.
Les en-têtes de réponse HTTP et le code d'état sont perdus lors de la conversion.
Exemple de conversion de requête Invoke API
|
Requête Invoke |
Requête HTTP (la requête reçue par le serveur HTTP) |
|
Contenu de la requête Invoke API :
|
|
Exemple de sortie de réponse Invoke API
|
Réponse HTTP |
Réponse Invoke |
|
|
|
|
Codes de réponse et en-têtes de réponse de Function Compute
Un runtime personnalisé est essentiellement un serveur HTTP que vous implémentez. Par conséquent, chaque invocation de fonction est une requête HTTP, et chaque réponse inclut un code de réponse et des en-têtes de réponse.
-
Code de réponse
StatusCode200: succès.404: échec.
-
En-tête de réponse
x-fc-status200: succès.404: échec.
Vous pouvez utiliser l'en-tête de réponse x-fc-status pour indiquer à Function Compute si la fonction a été exécutée avec succès.
-
Si vous ne définissez pas
x-fc-status: Function Compute suppose par défaut que l'invocation a été exécutée avec succès. Cependant, votre fonction peut avoir rencontré une exception qui n'a pas été signalée à Function Compute. Function Compute considère l'exécution comme exempte d'erreur. Cela peut ne pas affecter votre logique métier, mais cela impacte la surveillance et l'observabilité. Le code suivant montre un exemple :print("FC Invoke Start RequestId: " + rid) data = request.stream.read() print("Path: " + path) print("Data: " + str(data)) # Simulate an exception to trigger a runtime error raise Exception("mock exception") print("FC Invoke End RequestId: " + rid) return "Hello, World!" if __name__ == '__main__': app.run(host='0.0.0.0', port=9000) -
Si vous définissez
x-fc-status: si votre fonction rencontre une exception, vous pouvez utiliser l'en-tête de réponsex-fc-statuspour signaler l'échec d'exécution à Function Compute, et les informations de la pile d'erreurs sont imprimées dans les journaux. Comme illustré dans l'exemple suivant, après avoir défini l'en-tête de réponsex-fc-statussur404, Function Compute identifie l'invocation comme une exécution ayant échoué. Le type d'erreur estInvocationErroret le résultat renvoyé estmock exception. L'exemple de code dans app.py est le suivant :@app.route('/', defaults={'path': ''}) @app.route('/<path:path>', methods=['GET', 'POST', 'PUT', 'DELETE']) def hello_world(path): rid = request.headers.get(REQUEST_ID_HEADER) print("FC Invoke Start RequestId: " + rid) try: raise Exception("mock exception") except Exception as e: print("FC Invoke End RequestId: " + rid + ", Error: Unhandled Exception") print(str(e)) return str(e), 404, [{"x-fc-status", "404"}]
Dans la réponse HTTP renvoyée, nous vous recommandons de définir à la fois StatusCode et x-fc-status.
Exemple de code
Si un déclencheur est configuré pour la fonction, vous pouvez implémenter un serveur HTTP dans n'importe quel langage. Cette rubrique utilise Python comme exemple. L'exemple de code est le suivant.
L'exemple de code dépend d'un environnement Python et de la bibliothèque Flask. Nous vous recommandons de sélectionner Web Function pour la méthode de création de fonction et Python 3.10 pour le runtime.
import os
from flask import Flask
from flask import request
REQUEST_ID_HEADER = 'x-fc-request-id'
app = Flask(__name__)
@app.route('/', defaults={'path': ''})
@app.route('/<path:path>', methods=['GET', 'POST', 'PUT', 'DELETE'])
def hello_world(path):
rid = request.headers.get(REQUEST_ID_HEADER)
data = request.stream.read()
print("Path: " + path)
print("Data: " + str(data))
return "Hello, World!", 200, [('Function-Name', os.getenv('FC_FUNCTION_NAME'))]
if __name__ == '__main__':
app.run(host='0.0.0.0', port=9000)
L'exemple de code est expliqué ci-dessous :
@app.route('/', defaults={'path': ''}): la route par défaut, qui correspond au chemin racine.@app.route('/<path:path>', methods=['GET', 'POST', 'PUT', 'DELETE']): une route dynamique avec un paramètre de chemin. Elle peut gérer les requêtes GET, POST, PUT et DELETE. La valeur du paramètre de chemin est transmise à la fonction hello_world en tant qu'argument path.rid = request.headers.get(REQUEST_ID_HEADER): obtient la valeur du champx-fc-request-iddans les en-têtes de requête.data = request.stream.read(): lit le contenu de la requête et l'assigne à la variable data.return "Hello, World!", 200, [('Function-Name', os.getenv('FC_FUNCTION_NAME'))]: renvoie un corps de réponse contenant « Hello, World! », définit le code d'état sur 200 et inclut un en-têteFunction-Name.