Function Compute prend en charge API Gateway comme source d'événements. Configurez Function Compute comme service backend d'une API pour qu'API Gateway transfère les requêtes entrantes vers la fonction associée et retourne le résultat d'exécution à l'appelant.
Cas d'utilisation des déclencheurs API Gateway
Les déclencheurs API Gateway et HTTP exposent tous deux les fonctions sous forme d'endpoints HTTP. Choisissez l'option adaptée à vos besoins :
| Fonctionnalité | Déclencheur API Gateway | Déclencheur HTTP |
|---|---|---|
| Listes d'autorisation et de blocage IP | Pris en charge | Non pris en charge |
| Authentification (AppKey, AppCode) | Pris en charge | Non pris en charge |
| Mise en forme du trafic | Pris en charge | Non pris en charge |
| Transformation des données | Pris en charge | Non pris en charge |
Optez pour un déclencheur API Gateway si vous avez besoin d'un contrôle d'accès avancé, d'une authentification ou d'une gestion du trafic. Pour une simple exposition HTTP, un déclencheur HTTP suffit.
API Gateway prend en charge les fonctions d'événement et les fonctions web comme backend. Le modèle d'intégration diffère selon le type :
Fonction d'événement : API Gateway convertit la requête HTTP en un événement JSON structuré et le transmet à votre fonction. Celle-ci doit retourner une réponse JSON dans un format spécifique.
Fonction web : API Gateway transfère la requête HTTP brute vers l'endpoint réseau interne de votre fonction. Cette dernière traite directement la requête en tant que serveur HTTP.
Connecter une fonction d'événement à API Gateway
Prérequis
Avant de commencer, assurez-vous de disposer des éléments suivants :
Un compte Alibaba Cloud avec accès à Function Compute et API Gateway
Une région sélectionnée pour les deux services (placez-les dans la même région afin d'éviter les frais de trafic sur le réseau public)
Étape 1 : Créer une fonction d'événement
Créez une fonction d'événement dans la console Function Compute 3.0. Pour plus d'informations, consultez Créer une fonction d'événement.
Étape 2 : Créer un service backend API Gateway
Définissez un service backend dans API Gateway et liez-le à votre fonction.
-
Connectez-vous à la console API Gateway, sélectionnez une région, puis dans le volet de navigation de gauche, choisissez Manage APIs > Backend Services. Dans le coin supérieur droit, cliquez sur Create Backend Service. Configurez les informations requises et cliquez sur Confirm.

-
Sur la page Backend Services, cliquez sur le service backend que vous venez de créer. Cliquez sur l'onglet Production. Dans la section Basic Information, cliquez sur Create, sélectionnez la fonction d'événement créée à l'étape 1, puis cliquez sur Publish.

Étape 3 : Créer et publier une API
-
Dans la console API Gateway, créez un groupe d'API. Placez ce groupe dans la même région que votre fonction.
Si le groupe d'API et la fonction se trouvent dans des régions différentes, API Gateway accède à Function Compute via le réseau public, ce qui engendre des frais de trafic. Pour réduire la latence et améliorer la sécurité des données, utilisez la même région.
-
Créez et publiez une API avec les paramètres clés suivants. Conservez les valeurs par défaut pour tous les autres champs.
Élément de configuration Valeur Security authentication No authentication Configuration mode Use an existing backend service Backend service type Function Compute Version Function Compute 3.0 Function type Event function Backend services Sélectionnez le service backend créé à l'étape 2 
Étape 4 : Écrire le code de la fonction
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 la région. Sur la page Functions, cliquez sur la fonction à gérer.
Sur la page de détails de la fonction, cliquez sur l'onglet Code. Écrivez votre code dans l'éditeur et cliquez sur Deploy.
Tous les exemples lisent l'événement de requête, extraient les champs clés et retournent une réponse au format JSON requis.
Node.js
module.exports.handler = function(event, context, callback) {
var event = JSON.parse(event);
var content = {
path: event.path,
method: event.method,
headers: event.headers,
queryParameters: event.queryParameters,
pathParameters: event.pathParameters,
body: event.body
// You can write your own logic here.
}
var response = {
isBase64Encoded: false,
statusCode: '200',
headers: {
'x-custom-header': 'header value'
},
body: content
};
callback(null, response)
};
Python
# -*- coding: utf-8 -*-
import json
def handler(event, context):
event = json.loads(event)
content = {
'path': event['path'],
'method': event['httpMethod'],
'headers': event['headers'],
'queryParameters': event['queryParameters'],
'pathParameters': event['pathParameters'],
'body': event['body']
}
# You can write your own logic here.
rep = {
"isBase64Encoded": "false",
"statusCode": "200",
"headers": {
"x-custom-header": "no"
},
"body": content
}
return json.dumps(rep)
PHP
<?php
function handler($event, $context) {
$event = json_decode($event, $assoc = true);
$content = [
'path' => $event['path'],
'method' => $event['httpMethod'],
'headers' => $event['headers'],
'queryParameters' => $event['queryParameters'],
'pathParameters' => $event['pathParameters'],
'body' => $event['body'],
];
$rep = [
"isBase64Encoded" => "false",
"statusCode" => "200",
"headers" => [
"x-custom-header" => "no",
],
"body" => $content,
];
return json_encode($rep);
}
Java
Function Compute fournit deux interfaces de handler pour Java. Pour plus d'informations sur le runtime Java, consultez Compiler et déployer un package de code.
Option 1 (recommandée) : PojoRequestHandler
PojoRequestHandler<I, O> permet de travailler avec des objets de requête et de réponse typés plutôt qu'avec des flux bruts.
import com.aliyun.fc.runtime.Context;
import com.aliyun.fc.runtime.PojoRequestHandler;
import java.util.HashMap;
import java.util.Map;
public class ApiTriggerDemo implements PojoRequestHandler<ApiRequest, ApiResponse> {
public ApiResponse handleRequest(ApiRequest request, Context context) {
// Obtain API request information.
context.getLogger().info(request.toString());
String path = request.getPath();
String httpMethod = request.getHttpMethod();
String body = request.getBody();
context.getLogger().info("path: " + path);
context.getLogger().info("httpMethod: " + httpMethod);
context.getLogger().info("body: " + body);
// You can write your own logic here.
// Sample API response.
Map headers = new HashMap();
boolean isBase64Encoded = false;
int statusCode = 200;
String returnBody = "";
return new ApiResponse(headers, isBase64Encoded, statusCode, returnBody);
}
}
Définissez les classes Plain Old Java Object (POJO) ApiRequest et ApiResponse comme suit. Les méthodes set() et get() doivent être complètes.
import java.util.Map;
public class ApiRequest {
private String path;
private String httpMethod;
private Map headers;
private Map queryParameters;
private Map pathParameters;
private String body;
private boolean isBase64Encoded;
@Override
public String toString() {
return "Request{" +
"path='" + path + '\'' +
", httpMethod='" + httpMethod + '\'' +
", headers=" + headers +
", queryParameters=" + queryParameters +
", pathParameters=" + pathParameters +
", body='" + body + '\'' +
", isBase64Encoded=" + isBase64Encoded +
'}';
}
public String getPath() { return path; }
public void setPath(String path) { this.path = path; }
public String getHttpMethod() { return httpMethod; }
public void setHttpMethod(String httpMethod) { this.httpMethod = httpMethod; }
public Map getHeaders() { return headers; }
public void setHeaders(Map headers) { this.headers = headers; }
public Map getQueryParameters() { return queryParameters; }
public void setQueryParameters(Map queryParameters) { this.queryParameters = queryParameters; }
public Map getPathParameters() { return pathParameters; }
public void setPathParameters(Map pathParameters) { this.pathParameters = pathParameters; }
public String getBody() { return body; }
public void setBody(String body) { this.body = body; }
public boolean getIsBase64Encoded() { return this.isBase64Encoded; }
public void setIsBase64Encoded(boolean base64Encoded) { this.isBase64Encoded = base64Encoded; }
}
import java.util.Map;
public class ApiResponse {
private Map headers;
private boolean isBase64Encoded;
private int statusCode;
private String body;
public ApiResponse(Map headers, boolean isBase64Encoded, int statusCode, String body) {
this.headers = headers;
this.isBase64Encoded = isBase64Encoded;
this.statusCode = statusCode;
this.body = body;
}
public Map getHeaders() { return headers; }
public void setHeaders(Map headers) { this.headers = headers; }
public boolean getIsBase64Encoded() { return isBase64Encoded; }
public void setIsBase64Encoded(boolean base64Encoded) { this.isBase64Encoded = base64Encoded; }
public int getStatusCode() { return statusCode; }
public void setStatusCode(int statusCode) { this.statusCode = statusCode; }
public String getBody() { return body; }
public void setBody(String body) { this.body = body; }
}
Ajoutez la dépendance Maven suivante dans votre fichier pom.xml :
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>apiTrigger</groupId>
<artifactId>apiTrigger</artifactId>
<version>1.0-SNAPSHOT</version>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>com.aliyun.fc.runtime</groupId>
<artifactId>fc-java-core</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
</project>
Option 2 : StreamRequestHandler
StreamRequestHandler offre un accès direct aux flux d'entrée et de sortie bruts. Convertissez manuellement l'InputStream en la classe POJO correspondante. La configuration du fichier pom.xml est identique à celle de PojoRequestHandler.
import com.aliyun.fc.runtime.Context;
import com.aliyun.fc.runtime.StreamRequestHandler;
import com.google.gson.Gson;
import java.io.*;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;
public class ApiTriggerDemo2 implements StreamRequestHandler {
public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) {
try {
// Convert the InputStream to a string.
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
StringBuffer stringBuffer = new StringBuffer();
String string = "";
while ((string = bufferedReader.readLine()) != null) {
stringBuffer.append(string);
}
String input = stringBuffer.toString();
context.getLogger().info("inputStream: " + input);
Request req = new Gson().fromJson(input, Request.class);
context.getLogger().info("input req: ");
context.getLogger().info(req.toString());
String bodyReq = req.getBody();
Base64.Decoder decoder = Base64.getDecoder();
context.getLogger().info("body: " + new String(decoder.decode(bodyReq)));
// You can process your own logic here.
// Return structure.
Map headers = new HashMap();
headers.put("x-custom-header", " ");
boolean isBase64Encoded = false;
int statusCode = 200;
Map body = new HashMap();
Response resp = new Response(headers, isBase64Encoded, statusCode, body);
String respJson = new Gson().toJson(resp);
context.getLogger().info("outputStream: " + respJson);
outputStream.write(respJson.getBytes());
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
outputStream.close();
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
class Request {
private String path;
private String httpMethod;
private Map headers;
private Map queryParameters;
private Map pathParameters;
private String body;
private boolean isBase64Encoded;
@Override
public String toString() {
return "Request{" +
"path='" + path + '\'' +
", httpMethod='" + httpMethod + '\'' +
", headers=" + headers +
", queryParameters=" + queryParameters +
", pathParameters=" + pathParameters +
", body='" + body + '\'' +
", isBase64Encoded=" + isBase64Encoded +
'}';
}
public String getBody() {
return body;
}
}
// Function Compute must return the response to API Gateway in the following JSON format.
class Response {
private Map headers;
private boolean isBase64Encoded;
private int statusCode;
private Map body;
public Response(Map headers, boolean isBase64Encoded, int statusCode, Map body) {
this.headers = headers;
this.isBase64Encoded = isBase64Encoded;
this.statusCode = statusCode;
this.body = body;
}
}
}
Étape 5 : Tester la fonction
API Gateway transmet les données de requête à votre fonction sous forme d'événement JSON structuré. Utilisez un événement de test pour vérifier que votre fonction traite correctement l'entrée avant de connecter le trafic réel.
Dans l'onglet Code de la page de détails de la fonction, cliquez sur l'icône
située à côté de Test function et sélectionnez Configure test parameters dans la liste déroulante.-
Dans le panneau Configure test parameters, sélectionnez Create new test event ou Modify existing test event. Saisissez le nom et le contenu de l'événement, puis cliquez sur OK. Utilisez le format d'événement suivant :
{ "path": "api request path", "httpMethod": "request method name", "headers": {all headers, including system headers}, "queryParameters": {query parameters}, "pathParameters": {path parameters}, "body": "string of request payload", "isBase64Encoded": "true|false, indicate if the body is Base64-encoded" } Cliquez sur Test function et vérifiez le résultat au-dessus de l'onglet Code.
Référence des formats d'événement et de réponse
Lorsque API Gateway appelle votre fonction d'événement, il convertit les données de requête HTTP en un événement JSON et les transmet à la fonction. Après traitement, Function Compute retourne une réponse JSON. API Gateway mappe ensuite les champs de cette réponse vers une réponse HTTP et l'envoie au client.

Champs de l'événement de requête
| Champ | Type | Description |
|---|---|---|
path |
String | Chemin de la requête API |
httpMethod |
String | Méthode HTTP : GET, POST, PUT, DELETE, etc. |
headers |
Object | Tous les en-têtes de requête, y compris les en-têtes système et personnalisés |
queryParameters |
Object | Paires clé-valeur issues de la chaîne de requête (après le ? dans l'URL) |
pathParameters |
Object | Paramètres de chemin identifiant une ressource spécifique dans l'URL |
body |
String | Corps de la requête |
isBase64Encoded |
Boolean | Indique si le corps de la requête est encodé en Base64 |
Comportement de isBase64Encoded :
true: Le corps est encodé en Base64. Décodez-le avant de le traiter.false: Le corps n'est pas encodé. Lisez-le directement.
Format de réponse
Retournez le résultat d'exécution au format JSON suivant. API Gateway mappe ces champs vers la réponse HTTP envoyée au client.
{
"isBase64Encoded": true|false,
"statusCode": httpStatusCode,
"headers": {response headers},
"body": "..."
}
Si la réponse ne respecte pas ce format, API Gateway considère le backend comme indisponible et retourne une erreur 502.
Connecter une fonction web à API Gateway
Avec une fonction web, API Gateway transfère le trafic HTTP brut vers l'endpoint réseau interne de votre fonction. Celle-ci agit comme un serveur HTTP et traite directement les requêtes, sans nécessiter de conversion en événement JSON.
Prérequis
Avant de commencer, assurez-vous de disposer des éléments suivants :
Un compte Alibaba Cloud avec accès à Function Compute et API Gateway
Une région sélectionnée pour les deux services (placez-les dans la même région afin d'éviter les frais de trafic sur le réseau public)
Étape 1 : Créer une fonction web
Créez une fonction web dans la console Function Compute 3.0. Pour plus d'informations, consultez Créer une fonction web.
Un déclencheur HTTP est créé par défaut pour la fonction web. Copiez l'endpoint réseau interne pour l'utiliser à l'étape 2.

Étape 2 : Créer un service backend
-
Connectez-vous à la console API Gateway, sélectionnez une région, puis dans le volet de navigation de gauche, choisissez Manage APIs > Backend Services. Dans le coin supérieur droit, cliquez sur Create Backend Service. Configurez les informations requises et cliquez sur Confirm.

-
Sur la page Backend Services, cliquez sur le service backend que vous venez de créer. Cliquez sur l'onglet Production. Dans la section Basic Information, cliquez sur Create, saisissez l'endpoint réseau interne du déclencheur HTTP de la fonction web, puis cliquez sur Publish.

Étape 3 : Créer et publier une API
Utilisez les groupes d'API pour organiser les API connexes et appliquer des politiques de sécurité et de gestion du trafic unifiées.
Connectez-vous à la console API Gateway. Dans le volet de navigation de gauche, choisissez Manage APIs > API groups et cliquez sur Create group.
-
Dans la boîte de dialogue Create group, sélectionnez une instance, saisissez
FC-Grouppour Group name, définissez BasePath sur/, puis cliquez sur Confirm.Placez le groupe d'API dans la même région que votre fonction. S'ils se trouvent dans des régions différentes, API Gateway accède à Function Compute via le réseau public, ce qui engendre des frais de trafic.

-
Sur la page de liste des groupes, localisez le groupe cible et cliquez sur Manage APIs dans la colonne Actions. Cliquez sur Create API, configurez les paramètres requis, puis cliquez sur Next.

Dans l'onglet Define API request, définissez Request path sur
/et cliquez sur Next.-
Dans l'onglet Define backend service, configurez les paramètres comme illustré dans la figure et cliquez sur Next.

Dans l'onglet Define response, conservez les paramètres par défaut et cliquez sur Create. Lorsque vous y êtes invité, cliquez sur Publish.
-
Dans la boîte de dialogue Publish API, configurez les paramètres de publication et cliquez sur Publish.

Étape 4 : Créer une application et accorder une autorisation
L'API publiée à l'étape 3 utilise l'authentification Alibaba Cloud APP. Créez une application et accordez-lui l'accès à l'API.
Connectez-vous à la console API Gateway. Dans le volet de navigation de gauche, choisissez Call APIs > Apps.
Sur la page Apps, cliquez sur Create app dans le coin supérieur droit. Saisissez
fcApppour App name et cliquez sur Confirm.-
Cliquez sur l'application
fcApppour ouvrir sa page de détails. L'application dispose de deux méthodes d'authentification :
AppKey : Utilise une paire AppKey et AppSecret (similaire à un compte et un mot de passe). Transmettez l'AppKey comme paramètre de requête ; l'AppSecret sert à calculer la signature de la requête.
AppCode : Méthode d'authentification simplifiée pour une utilisation directe dans les appels d'API.
Dans le volet de navigation de gauche, choisissez Manage APIs > APIs. Localisez l'API que vous avez créée. Dans la colonne Actions, cliquez sur
> Authorize.-
Sur la page d'autorisation, définissez Stage sur Production. Recherchez
fcApp, cliquez sur Add, puis sur Confirm.
Étape 5 : Vérifier le résultat
Appelez l'API publiée en utilisant l'authentification AppCode. L'exemple suivant utilise curl :
Dans la console API Gateway, choisissez Call APIs > Apps. Ouvrez la page de détails de l'application
fcApppour obtenir l'AppCode.-
Appelez l'API :
curl -i -X GET "http://fd6f8e2b7bf44ab181a56****-cn-hangzhou.alicloudapi.com" \ -H "Authorization:APPCODE 7d2b7e4945ce44028ab00***"
FAQ
Une fonction déclenchée par API Gateway retourne une erreur 502, mais les journaux indiquent qu'elle s'est exécutée avec succès. Pourquoi ?
La réponse de Function Compute ne correspondait pas au format requis. API Gateway attend les champs isBase64Encoded, statusCode, headers et body dans la réponse JSON. Si un champ est manquant ou mal formé, API Gateway considère le backend comme indisponible. Consultez la référence des formats d'événement et de réponse et vérifiez que la valeur de retour de votre fonction respecte la structure attendue.
Comment définir le Content-Type de la réponse ?
Définissez le Content-Type lors de la configuration de l'API dans API Gateway. Pour plus de détails, consultez Se connecter à Function Compute 3.0 (fonction web) via API Gateway.
Une fonction fonctionne correctement mais retourne une erreur 503 après une période d'inactivité. Pourquoi ?
L'environnement d'exécution de la fonction a été recyclé pendant la période d'inactivité. Lorsqu'une nouvelle requête arrive, Function Compute a besoin de temps pour initialiser un nouvel environnement : c'est le démarrage à froid. Si l'initialisation dépasse le délai d'expiration configuré dans API Gateway, celui-ci considère le backend comme indisponible et retourne une erreur 503. Pour résoudre ce problème, augmentez le délai d'expiration dans la configuration d'API Gateway.
Pourquoi la fonction reçoit-elle un corps encodé en Base64 de la part d'API Gateway ?
API Gateway n'ignore l'encodage Base64 que pour les transmissions basées sur FORM (lorsque vous sélectionnez le mappage des paramètres d'entrée dans API Gateway). Tous les autres formats de corps sont encodés en Base64 pour éviter toute perte de données pendant la transmission. Vérifiez le champ isBase64Encoded dans l'événement : s'il est défini sur true, décodez le corps avant de le traiter. Pour plus de détails sur le format de l'événement, consultez Format de l'événement de déclenchement.