Function Compute, olay kaynağı olarak API Gateway'i destekler. Function Compute'ü bir API'nin arka uç hizmeti olarak yapılandırın; API Gateway gelen istekleri ilgili işleve iletir ve çalıştırma sonucunu çağırana döndürür.
API Gateway tetikleyicilerini ne zaman kullanmalısınız?
Hem API Gateway tetikleyicileri hem de HTTP tetikleyicileri işlevleri HTTP uç noktaları olarak sunar. İhtiyaçlarınıza göre seçim yapın:
| Yetenek | API Gateway tetikleyicisi | HTTP tetikleyicisi |
|---|---|---|
| IP izin ve engelleme listeleri | Desteklenir | Desteklenmez |
| Kimlik doğrulama (AppKey, AppCode) | Desteklenir | Desteklenmez |
| Trafik şekillendirme | Desteklenir | Desteklenmez |
| Veri dönüştürme | Desteklenir | Desteklenmez |
Gelişmiş erişim kontrolü, kimlik doğrulama veya trafik yönetimine ihtiyacınız varsa API Gateway tetikleyicisini kullanın. Basit HTTP sunumu için HTTP tetikleyicisi yeterlidir.
API Gateway, arka uç olarak hem olay işlevlerini hem de web işlevlerini destekler. Entegrasyon modeli farklılık gösterir:
Olay işlevi: API Gateway, HTTP isteğini yapılandırılmış bir JSON olayına dönüştürür ve işlevinize iletir. İşlevinizin belirli bir formatta JSON yanıtı döndürmesi gerekir.
Web işlevi: API Gateway, ham HTTP isteğini işlevinizin dahili ağ uç noktasına iletir. İşleviniz isteği doğrudan bir HTTP sunucusu olarak ele alır.
Olay işlevini API Gateway'e bağlama
Ön koşullar
Başlamadan önce şunlara sahip olduğunuzdan emin olun:
Function Compute ve API Gateway erişimi olan bir Alibaba Cloud hesabı
Her iki hizmet için seçilmiş bir bölge (genel ağ trafiği ücretlerinden kaçınmak için hizmetleri aynı bölgede konumlandırın)
Adım 1: Olay işlevi oluşturma
Function Compute 3.0 konsolunda bir olay işlevi oluşturun. Daha fazla bilgi için bkz. Olay işlevi oluşturma.
Adım 2: API Gateway arka uç hizmeti oluşturma
API Gateway'de bir arka uç hizmeti tanımlayın ve bunu işlevinize bağlayın.
-
API Gateway konsoluna giriş yapın, bir bölge seçin ve sol gezinme bölmesinde Manage APIs > Backend Services seçeneklerini belirleyin. Sağ üst köşede Create Backend Service öğesine tıklayın. Gerekli bilgileri yapılandırın ve Confirm öğesine tıklayın.

-
Backend Services sayfasında, az önce oluşturduğunuz arka uç hizmetine tıklayın. Production sekmesine tıklayın. Basic Information bölümünde Create öğesine tıklayın, 1. Adımdaki olay işlevini seçin ve ardından Publish öğesine tıklayın.

Adım 3: API oluşturma ve yayınlama
-
API Gateway konsolunda bir API grubu oluşturun. Grubu işlevinizle aynı bölgeye yerleştirin.
API grubu ve işlev farklı bölgelerde bulunuyorsa API Gateway, Function Compute'e genel ağ üzerinden erişir ve bu durum trafik ücretlerine neden olur. Daha düşük gecikme süresi ve daha iyi veri güvenliği için aynı bölgeyi kullanın.
-
Aşağıdaki temel ayarlarla bir API oluşturun ve yayınlayın. Diğer tüm alanlar için varsayılan değerleri koruyun.
Yapılandırma öğesi Değer 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 2. Adımda oluşturduğunuz arka uç hizmetini seçin 
Adım 4: İşlev kodunu yazma
Function Compute konsoluna giriş yapın. Sol taraftaki gezinme bölmesinde Functions öğesine tıklayın.
Üst gezinme çubuğundan bölgeyi seçin. Functions sayfasında yönetmek istediğiniz işleve tıklayın.
İşlev ayrıntıları sayfasında Code sekmesine tıklayın. Kodunuzu düzenleyiciye yazın ve Deploy öğesine tıklayın.
Tüm örnekler istek olayını okur, anahtar alanları çıkarır ve gerekli JSON formatında bir yanıt döndürür.
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, Java için iki işleyici arayüzü sağlar. Java çalışma zamanı hakkında daha fazla bilgi için bkz. Kod paketi derleme ve dağıtma.
Seçenek 1 (önerilen): PojoRequestHandler
PojoRequestHandler<I, O> ile ham akışlar yerine türü belirtilmiş istek ve yanıt nesneleriyle çalışabilirsiniz.
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);
}
}
ApiRequest ve ApiResponse Plain Old Java Object (POJO) sınıflarını aşağıda gösterildiği gibi tanımlayın. set() ve get() yöntemlerinin eksiksiz olması gerekir.
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; }
}
pom.xml dosyanıza aşağıdaki Maven bağımlılığını ekleyin:
<?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>
Seçenek 2: StreamRequestHandler
StreamRequestHandler size ham giriş ve çıkış akışlarına doğrudan erişim imkanı tanır. InputStream öğesini karşılık gelen POJO sınıfına manuel olarak dönüştürün. pom.xml yapılandırması PojoRequestHandler ile aynıdır.
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;
}
}
}
Adım 5: İşlevi test etme
API Gateway, istek verilerini yapılandırılmış bir JSON olayı olarak işlevinize iletir. Canlı trafiği bağlamadan önce işlevinizin girişi doğru şekilde işlediğini doğrulamak için bir test olayı kullanın.
İşlev ayrıntıları sayfasının Code sekmesinde, Test function yanındaki
simgesine tıklayın ve açılır listeden Configure test parameters seçeneğini belirleyin.-
Configure test parameters panelinde Create new test event veya Modify existing test event seçeneğini belirleyin. Olay adını ve içeriğini girin, ardından OK öğesine tıklayın. Aşağıdaki olay formatını kullanın:
{ "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" } Test function öğesine tıklayın ve sonucu Code sekmesinin üzerinde doğrulayın.
Olay ve yanıt formatı referansı
API Gateway olay işlevinizi çağırdığında HTTP istek verilerini bir JSON olayına dönüştürür ve işleve iletir. İşlem tamamlandıktan sonra Function Compute bir JSON yanıtı döndürür. API Gateway, yanıt alanlarını bir HTTP yanıtına eşler ve istemciye gönderir.

İstek olayı alanları
| Alan | Tür | Açıklama |
|---|---|---|
path |
String | API isteğinin yolu |
httpMethod |
String | HTTP yöntemi: GET, POST, PUT, DELETE vb. |
headers |
Object | Sistem ve özel başlıklar dahil tüm istek başlıkları |
queryParameters |
Object | Sorgu dizesindeki anahtar-değer çiftleri (URL'deki ? işaretinden sonra) |
pathParameters |
Object | URL içindeki belirli bir kaynağı tanımlayan yol parametreleri |
body |
String | İstek gövdesi |
isBase64Encoded |
Boolean | İstek gövdesinin Base64 ile kodlanmış olup olmadığı |
isBase64Encoded davranışı:
true: Gövde Base64 ile kodlanmıştır. İşlemeden önce kodu çözün.false: Gövde kodlanmamıştır. Doğrudan okuyun.
Yanıt formatı
Çalıştırma sonucunu aşağıdaki JSON formatında döndürün. API Gateway bu alanları istemciye gönderilen HTTP yanıtına eşler.
{
"isBase64Encoded": true|false,
"statusCode": httpStatusCode,
"headers": {response headers},
"body": "..."
}
Yanıt bu formatı takip etmezse API Gateway arka ucu kullanılamaz olarak değerlendirir ve 502 hatası döndürür.
Web işlevini API Gateway'e bağlama
Web işlevi ile API Gateway, ham HTTP trafiğini işlevinizin dahili ağ uç noktasına iletir. İşleviniz bir HTTP sunucusu gibi davranır ve istekleri doğrudan işler; JSON olay dönüşümü gerekmez.
Ön koşullar
Başlamadan önce şunlara sahip olduğunuzdan emin olun:
Function Compute ve API Gateway erişimi olan bir Alibaba Cloud hesabı
Her iki hizmet için seçilmiş bir bölge (genel ağ trafiği ücretlerinden kaçınmak için hizmetleri aynı bölgede konumlandırın)
Adım 1: Web işlevi oluşturma
Function Compute 3.0 konsolunda bir web işlevi oluşturun. Daha fazla bilgi için bkz. Web işlevi oluşturma.
Web işlevi için varsayılan olarak bir HTTP tetikleyicisi oluşturulur. 2. Adımda kullanmak üzere dahili ağ uç noktasını kopyalayın.

Adım 2: Arka uç hizmeti oluşturma
-
API Gateway konsoluna giriş yapın, bir bölge seçin ve sol gezinme bölmesinde Manage APIs > Backend Services seçeneklerini belirleyin. Sağ üst köşede Create Backend Service öğesine tıklayın. Gerekli bilgileri yapılandırın ve Confirm öğesine tıklayın.

-
Backend Services sayfasında, az önce oluşturduğunuz arka uç hizmetine tıklayın. Production sekmesine tıklayın. Basic Information bölümünde Create öğesine tıklayın, web işlevinin HTTP tetikleyicisinin dahili ağ uç noktasını girin ve ardından Publish öğesine tıklayın.

Adım 3: API oluşturma ve yayınlama
İlgili API'leri düzenlemek ve birleşik güvenlik ile trafik yönetimi ilkelerini uygulamak için API gruplarını kullanın.
API Gateway konsoluna giriş yapın. Sol gezinme bölmesinde Manage APIs > API groups seçeneklerini belirleyin ve Create group öğesine tıklayın.
-
Create group iletişim kutusunda bir örnek seçin, Group name için
FC-Groupdeğerini girin, BasePath değerini/olarak ayarlayın ve Confirm öğesine tıklayın.API grubunu işlevinizle aynı bölgeye yerleştirin. Farklı bölgelerde bulunurlarsa API Gateway, Function Compute'e genel ağ üzerinden erişir ve bu durum trafik ücretlerine neden olur.

-
Grup listesi sayfasında hedef grubu bulun ve Actions sütunundaki Manage APIs seçeneğine tıklayın. Create API öğesine tıklayın, gerekli ayarları yapılandırın ve Next öğesine tıklayın.

Define API request sekmesinde Request path değerini
/olarak ayarlayın ve Next öğesine tıklayın.-
Define backend service sekmesinde, şekilde gösterildiği gibi ayarları yapılandırın ve Next öğesine tıklayın.

Define response sekmesinde varsayılan ayarları koruyun ve Create öğesine tıklayın. İstendiğinde Publish öğesine tıklayın.
-
Publish API iletişim kutusunda yayınlama ayarlarını yapılandırın ve Publish öğesine tıklayın.

Adım 4: Uygulama oluşturma ve yetkilendirme
3. Adımda yayınlanan API Alibaba Cloud APP kimlik doğrulamasını kullanır. Bir uygulama oluşturun ve API'ye erişim izni verin.
API Gateway konsoluna giriş yapın. Sol gezinme bölmesinde Call APIs > Apps seçeneklerini belirleyin.
Apps sayfasında sağ üst köşede Create app öğesine tıklayın. App name için
fcAppdeğerini girin ve Confirm öğesine tıklayın.-
fcAppuygulamasına tıklayarak ayrıntılar sayfasını açın. Uygulamanın iki kimlik doğrulama yöntemi vardır:
AppKey: Bir AppKey ve AppSecret çifti kullanır (hesap adı ve şifreye benzer). AppKey'i istek parametresi olarak iletin; AppSecret, istek imzasını hesaplamak için kullanılır.
AppCode: API çağrılarında doğrudan kullanım için daha basit bir kimlik doğrulama yöntemi.
Sol gezinme bölmesinde Manage APIs > APIs seçeneklerini belirleyin. Oluşturduğunuz API'yi bulun. Actions sütununda
> Authorize seçeneğine tıklayın.-
Yetkilendirme sayfasında Stage değerini Production olarak ayarlayın.
fcAppöğesini arayın, Add öğesine tıklayın ve ardından Confirm öğesine tıklayın.
Adım 5: Sonucu doğrulama
Yayınlanan API'yi AppCode kimlik doğrulaması kullanarak çağırın. Aşağıdaki örnekte curl kullanılmaktadır:
API Gateway konsolunda Call APIs > Apps seçeneklerini belirleyin. AppCode'u almak için
fcAppuygulamasının ayrıntılar sayfasını açın.-
API'yi çağırın:
curl -i -X GET "http://fd6f8e2b7bf44ab181a56****-cn-hangzhou.alicloudapi.com" \ -H "Authorization:APPCODE 7d2b7e4945ce44028ab00***"
SSS
API Gateway tarafından tetiklenen bir işlev 502 hatası döndürüyor ancak işlev günlükleri başarıyla tamamlandığını gösteriyor. Neden?
Function Compute'ten gelen yanıt gerekli formatla eşleşmedi. API Gateway, JSON yanıtında isBase64Encoded, statusCode, headers ve body alanlarını bekler. Herhangi bir alan eksik veya hatalı biçimlendirilmişse API Gateway arka ucu kullanılamaz olarak değerlendirir. Olay ve yanıt formatı referansını kontrol edin ve işlevinizin dönüş değerinin beklenen yapıyla eşleştiğini doğrulayın.
Yanıtın Content-Type değerini nasıl ayarlarım?
API Gateway'de API'yi yapılandırırken Content-Type değerini ayarlayın. Ayrıntılar için bkz. API Gateway üzerinden Function Compute 3.0'a (web işlevi) bağlanma.
Bir işlev düzgün çalışıyor ancak bir süre hareketsiz kaldıktan sonra 503 hatası döndürüyor. Neden?
İşlevin yürütme ortamı boşta kalma süresi sırasında geri dönüştürüldü. Bir sonraki istek geldiğinde Function Compute'in yeni bir ortamı başlatması için zamana ihtiyacı olur; buna soğuk başlatma denir. Başlatma süresi API Gateway'de yapılandırılan zaman aşımını aşarsa API Gateway arka ucu kullanılamaz olarak değerlendirir ve 503 hatası döndürür. Bunu çözmek için API Gateway yapılandırmasındaki zaman aşımı süresini uzatın.
İşlev neden API Gateway'den Base64 ile kodlanmış bir gövde alıyor?
API Gateway yalnızca FORM tabanlı iletimler için (API Gateway'de giriş parametresi eşlemesini seçtiğinizde) Base64 kodlamasını atlar. Diğer tüm gövde formatları, iletim sırasında veri kaybını önlemek için Base64 ile kodlanır. Olaydaki isBase64Encoded alanını kontrol edin: değer true ise gövdeyi işlemeden önce kodunu çözün. Olay formatı hakkında daha fazla ayrıntı için bkz. Tetikleyici olayı formatı.