Les environnements d'exécution Custom Container hébergent votre serveur HTTP dans un conteneur. Function Compute convertit chaque invocation de fonction en requête HTTP, la transmet à votre serveur, puis transforme la réponse HTTP en réponse d'invocation de fonction.
Fonctionnement
Function Compute prend en charge deux méthodes d'invocation :
Appels HTTP (recommandé) : invoquez une fonction via un déclencheur HTTP ou un nom de domaine personnalisé. Function Compute transfère les requêtes et réponses HTTP entre le client et votre serveur HTTP avec une transformation minimale.
Appels API : invoquez une fonction en appelant l'opération
InvokeFunction, par exemple via un SDK ou une source d'événement. Function Compute convertit la requêteInvokeFunctionen requête HTTP POST et la transmet au chemin fixe/invokede votre serveur HTTP.
Le format des requêtes et des réponses reçues par votre serveur HTTP dépend de la méthode d'invocation.
Limites
Déclencheur HTTP
Vous ne pouvez créer qu'un seul déclencheur HTTP par fonction HTTP pour chaque version ou alias. Pour plus d'informations, consultez Gérer les versions et Gérer les alias.
Limites des requêtes
Les en-têtes de requête ne doivent pas contenir de champs personnalisés commençant par x-fc-, ni les champs réservés suivants :
connectionkeep-alive
Le système renvoie le code d'état 400 et le code d'erreur InvalidArgument si une requête dépasse l'une des limites suivantes :
| Ressource | Limite |
|---|---|
| Taille des en-têtes | 8 Ko (total des clés et valeurs) |
| Taille du chemin | 4 Ko (paramètres de requête inclus) |
| Taille du corps — invocation synchrone | 32 Mo |
| Taille du corps — invocation asynchrone | 128 Ko |
Limites des réponses
Les en-têtes de réponse ne doivent pas inclure de champs personnalisés commençant par x-fc-, ni les champs réservés suivants :
connectioncontent-lengthdatekeep-aliveservercontent-disposition:attachment
Avec le domaine par défautaliyuncs.com, Function Compute ajoute systématiquementcontent-disposition: attachmentà tous les en-têtes de réponse. Les navigateurs téléchargent alors les réponses sous forme de pièces jointes au lieu de les afficher. Configurez un nom de domaine personnalisé pour lever cette restriction. Pour plus d'informations, consultez Configurer un nom de domaine personnalisé .
Le système renvoie le code d'état 502 et le code d'erreur BadResponse si une réponse dépasse la limite suivante :
| Ressource | Limite |
|---|---|
| Taille des en-têtes | 8 Ko (total des clés et valeurs) |
Routage des chemins
Associez un nom de domaine personnalisé pour mapper différents chemins HTTP aux fonctions. Pour plus d'informations, consultez Configurer un nom de domaine personnalisé.
Appels HTTP (recommandé)
En mode passthrough, Function Compute transmet les requêtes HTTP des clients à votre serveur HTTP et renvoie les réponses HTTP aux clients. Certains champs réservés par le système ne sont pas transmis. Pour plus de détails, consultez Limites.
En-têtes de requête
Pour invoquer une fonction via un déclencheur HTTP ou un nom de domaine personnalisé, utilisez les en-têtes de requête suivants afin de contrôler le comportement de Function Compute :
| Paramètre | Type | Obligatoire | Exemple | Description |
|---|---|---|---|---|
X-Fc-Invocation-Type |
String | Non | Sync |
Mode d'invocation. Valeurs valides : Sync (invocation synchrone) et Async (invocation asynchrone). Pour plus d'informations, consultez Méthodes d'invocation. |
X-Fc-Log-Type |
String | Non | Tail |
Méthode de retour des journaux. Valeurs valides : Tail (renvoie les 4 derniers Ko de journaux pour la requête en cours) et None (aucun journal renvoyé ; valeur par défaut). |
En-têtes de réponse
Function Compute ajoute automatiquement l'en-tête de réponse suivant aux réponses des appels HTTP :
| Paramètre | Description | Exemple |
|---|---|---|
X-Fc-Request-Id |
ID de requête de l'invocation de la fonction. | dab25e58-9356-4e3f-97d6-f044c4**** |
Appels API
Lorsque vous invoquez une fonction à l'aide de l'opération InvokeFunction, Function Compute convertit la requête en requête HTTP et la transmet à votre serveur HTTP sur le chemin fixe /invoke.
Conversion des requêtes (InvokeFunction vers HTTP)
| Champ InvokeFunction | Requête HTTP |
|---|---|
Paramètre event |
Corps de la requête |
| Chemin | /invoke (fixe) |
| Méthode | POST (fixe) |
Content-Type |
application/octet-stream (fixe) |
Conversion des réponses (HTTP vers InvokeFunction)
| Champ de réponse HTTP | Réponse InvokeFunction |
|---|---|
| Corps de la réponse | Corps de la réponse |
| En-têtes de réponse | Perdus lors de la conversion |
| Code d'état | Perdu lors de la conversion |
Exemples de conversion
Requête :
| Requête InvokeFunction | Requête HTTP reçue par le serveur HTTP |
|---|---|
"hello world" |
|
Réponse :
| Réponse HTTP | Réponse InvokeFunction |
|---|---|
|
|
hello world |
|
|
{"errorMessage":"exception"} |
Exemple de code
L'exemple Python (Flask) suivant implémente un serveur HTTP qui gère à la fois les appels HTTP et les appels API. Ce serveur écoute sur le port 9000 et traite les requêtes GET, POST, PUT et DELETE sur n'importe quel chemin.
import os
from flask import Flask, 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):
# Read the request ID injected by Function Compute
rid = request.headers.get(REQUEST_ID_HEADER)
# Read the request body
data = request.stream.read()
print("Path: " + path)
print("Data: " + str(data))
# Return a response body, status code, and a custom header
return "Hello, World!", 200, [('Function-Name', os.getenv('FC_FUNCTION_NAME'))]
if __name__ == '__main__':
app.run(host='0.0.0.0', port=9000)
Points clés :
@app.route('/', defaults={'path': ''}): gère les requêtes vers le chemin racine.@app.route('/<path:path>', methods=['GET', 'POST', 'PUT', 'DELETE']): traite les requêtes vers tout autre chemin et passe la valeur du chemin àhello_worldvia le paramètrepath.request.headers.get(REQUEST_ID_HEADER): lit l'en-têtex-fc-request-idinjecté par Function Compute dans chaque requête.request.stream.read(): lit le corps de la requête.return "Hello, World!", 200, [('Function-Name', os.getenv('FC_FUNCTION_NAME'))]: renvoie un corps de réponse contenant"Hello, World!", le code d'état200ainsi qu'un en-tête de réponseFunction-Nameissu de la variable d'environnementFC_FUNCTION_NAME.