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 transmet à votre serveur HTTP. Il transforme ensuite les réponses de votre serveur HTTP en réponses d'invocation de fonction avant de les renvoyer au client. Le schéma suivant illustre ce processus.
Limites
Vous ne pouvez créer qu'un seul déclencheur HTTP par version ou alias d'une fonction. Pour plus d'informations, consultez les sections 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 suivants :connection
keep-alive
-
Si une requête dépasse les limites suivantes, le système renvoie un code d'état
400et un code d'erreurInvalidArgument.Taille des en-têtes : la taille totale de toutes les clés et valeurs des en-têtes ne doit pas dépasser 8 Ko.
Taille du chemin : la taille totale du chemin, y compris tous les paramètres de requête, ne doit pas dépasser 4 Ko.
Taille du corps : la taille totale du corps de la requête pour une invocation synchrone ne doit pas dépasser 32 Mo. Pour une invocation asynchrone, elle ne doit 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 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 automatiquement l'en-tête
content-disposition: attachmentaux en-têtes de réponse. Cet en-tête force le navigateur à télécharger la réponse sous forme de pièce jointe. Pour lever cette restriction, configurez un nom de domaine personnalisé.
-
Si une réponse dépasse les limites suivantes, le système renvoie un code d'état
502et un code d'erreurBadResponse.Taille des en-têtes : la taille totale de toutes les clés et valeurs des en-têtes ne doit pas dépasser 8 Ko.
-
-
Autres remarques d'utilisation
Vous pouvez mapper différents chemins d'accès HTTP vers votre fonction en associant un nom de domaine personnalisé. Pour plus d'informations, consultez la section 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 au client. Certains champs réservés au système ne sont pas transmis. Pour plus d'informations, consultez la section Limites.
En-têtes de requête
Lorsque vous appelez une fonction via un déclencheur HTTP ou 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 la section 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 appelez une fonction via un déclencheur HTTP ou un nom de domaine personnalisé, la réponse contient certains en-têtes 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 effectuées via l'API InvokeFunction, Function Compute convertit la requête InvokeFunction en 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 du message de la requête HTTP.pathcorrespond à/invoke.methodcorrespond àPOST.L'en-tête de message
Content-Typeest défini surapplication/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 (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 constitue une requête HTTP, et chaque réponse inclut un code de réponse ainsi que 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.
Utilisez l'en-tête de réponse x-fc-status pour indiquer à Function Compute si l'exécution de la fonction a réussi.
-
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. Toutefois, votre fonction peut avoir rencontré une exception non signalée à Function Compute. Ce dernier considère alors l'exécution comme exempte d'erreur. Cela peut ne pas affecter votre logique métier, mais cela impacte la surveillance et l'observabilité. L'exemple de code suivant illustre ce cas :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: en cas d'exception dans votre fonction, vous pouvez utiliser l'en-tête de réponsex-fc-statuspour signaler l'échec d'exécution à Function Compute. Les informations de la pile d'erreurs sont alors imprimées dans les journaux. Comme le montre l'exemple ci-dessous, après avoir défini l'en-tête de réponsex-fc-statussur404, Function Compute identifie l'invocation comme ayant échoué. Le type d'erreur estInvocationErroret le résultat renvoyé estmock exception. Voici l'exemple de code dans app.py :@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 à titre d'exemple. Le code exemple est présenté ci-dessous.
Le code exemple dépend d'un environnement Python et de la bibliothèque Flask. Nous vous recommandons de sélectionner Web Function comme méthode de création de fonction et Python 3.10 comme 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)
Le code exemple est expliqué comme suit :
@app.route('/', defaults={'path': ''}): route par défaut correspondant au chemin racine.@app.route('/<path:path>', methods=['GET', 'POST', 'PUT', 'DELETE']): route dynamique avec un paramètre de chemin. Elle gère 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.