Function Compute mendukung API Gateway sebagai sumber event. Anda dapat mengonfigurasi Function Compute sebagai layanan backend untuk suatu API. Ketika permintaan mencapai API Gateway yang layanan backend-nya diatur ke Function Compute, fungsi terkait akan dipicu. Function Compute kemudian mengembalikan hasil eksekusi ke API Gateway.
Informasi latar belakang
Pemicu API Gateway mirip dengan pemicu HTTP dan dapat digunakan untuk membangun aplikasi web. Dibandingkan dengan pemicu HTTP, API Gateway memungkinkan operasi lanjutan, seperti mengonfigurasi Daftar putih alamat IP atau blacklist.
API Gateway mendukung fungsi event maupun fungsi web sebagai layanan backend-nya. Setelah Anda menghubungkan API Gateway ke Function Compute, Anda dapat mengekspos fungsi secara aman melalui API serta menangani tugas seperti autentikasi, shaping trafik, dan transformasi data.
Buat fungsi event dan hubungkan ke API Gateway
Langkah 1: Buat fungsi berbasis event
Buat fungsi event di Konsol Function Compute 3.0. Untuk informasi selengkapnya, lihat Buat fungsi event.
Langkah 2: Buat API yang layanan backend-nya adalah Function Compute
Definisikan layanan backend di API Gateway dan konfigurasikan titik akhirnya agar terhubung ke Function Compute.
Masuk ke Konsol API Gateway, pilih wilayah, lalu pada panel navigasi kiri, pilih Manage APIs > Backend Services. Di pojok kanan atas, klik Create Backend Service. Konfigurasikan informasi berikut lalu klik Confirm.

Pada halaman Backend Service, klik layanan backend yang baru saja dibuat untuk membuka halaman definisi layanan backend tersebut. Klik tab Production. Pada bagian Basic Information, klik Create. Pilih fungsi event yang telah Anda buat di Langkah 1, lalu klik Publish.

Buat grup.
CatatanBuat grup API di wilayah yang sama dengan fungsi tersebut. Jika berbeda wilayah, API harus mengakses layanan Function Compute Anda melalui jaringan publik, yang akan dikenakan biaya trafik. Jika Anda memiliki persyaratan tinggi terhadap keamanan data dan latensi jaringan, pilih wilayah yang sama untuk API dan fungsi tersebut.
Buat dan publikasikan API.
Atur item konfigurasi utama sebagai berikut. Biarkan pengaturan lainnya tetap default.

Configuration item
Example value
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
Select the backend service for the event function that you just created.
Langkah 3: Tulis kode fungsi
Masuk ke Konsol Function Compute. Pada panel navigasi kiri, pilih .
Pada bilah navigasi atas, pilih wilayah. Di halaman Functions, klik fungsi target.
Pada halaman detail fungsi, klik tab Code. Tulis kode di editor lalu klik Deploy.
Kode contoh berikut disediakan untuk berbagai bahasa:
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
Saat menggunakan Java, Anda harus mengimplementasikan kelas yang mengimplementasikan penanganan (handler) yang telah ditentukan oleh Function Compute. Anda dapat mengimplementasikan salah satu dari dua handler berikut. Untuk informasi lebih lanjut tentang runtime Java Function Compute, lihat Compile and deploy a code package.
(Direkomendasikan) Gunakan handler PojoRequestHandler<I, O>.
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); } }Dua kelas
POJO,ApiRequestdanApiResponse, didefinisikan sebagai berikut.CatatanMetode
set()danget()pada kelasPOJOharus lengkap.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; } }Berkas pom.xml adalah sebagai berikut.
<?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>
Gunakan handler StreamRequestHandler.
Saat menggunakan handler ini, Anda harus mengonversi
InputStreaminput menjadi kelasPOJOyang sesuai. Berikut ini contoh kode-nya.Konfigurasi berkas pom.xml sama dengan handler PojoRequestHandler<I, O>.
import com.aliyun.fc.runtime.Context; import com.aliyun.fc.runtime.StreamRequestHandler; import com.aliyun.fc.runtime.Context; 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; } } }
Langkah 4: Konfigurasikan parameter input untuk fungsi
Saat API Gateway memicu fungsi, informasi tersebut dikirim sebagai event ke parameter input fungsi. Anda dapat menggunakan informasi event dari API Gateway sebagai parameter untuk menguji apakah kode fungsi sudah benar.
Pada tab Code di halaman detail fungsi, klik ikon
di sebelah Test Function lalu pilih Configure Test Parameters dari daftar drop-down.Di panel Configure Test Parameters, pilih Create New Test Event atau Modify Existing Test Event. Masukkan nama dan konten event, lalu klik OK.
Contoh berikut menunjukkan format event:
{ "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-encode" }Tabel berikut menjelaskan bidang-bidang dalam parameter event.
Parameter
Type
Description
path
String
Jalur permintaan API.
httpMethod
String
Nama metode permintaan, seperti GET, POST, PUT, atau DELETE.
headers
Object
Berisi semua informasi header permintaan, termasuk header sistem dan kustom.
queryParameters
Object
Parameter kueri, biasanya muncul sebagai pasangan kunci-nilai setelah tanda tanya (?) dalam URL.
pathParameters
Object
Parameter jalur, biasanya merupakan bagian dari URL dan digunakan untuk mengidentifikasi resource tertentu.
body
String
Badan permintaan.
isBase64Encoded
Boolean
Menunjukkan apakah badan permintaan di-encode Base64.
CatatanJika nilai
isBase64Encodedadalahtrue, konten body yang dikirim dari API Gateway ke Function Compute di-encode Base64. Function Compute harus mendekode Base64 konten body sebelum memprosesnya.Jika nilai
isBase64Encodedadalahfalse, API Gateway tidak meng-encode Base64 konten body. Anda dapat langsung mengambil konten body di dalam fungsi.
Klik Test Function.
Langkah 5: Verifikasi hasil
Setelah eksekusi selesai, Anda dapat melihat hasilnya di atas tab Code.
Function Compute harus mengembalikan hasil eksekusi ke API Gateway dalam format JSON berikut. API Gateway kemudian mengurai hasil tersebut. Contoh berikut menunjukkan format respons:
{
"isBase64Encoded":true|false,
"statusCode":httpStatusCode,
"headers":{response headers},
"body":"..."
} Persyaratan format untuk menghubungkan fungsi event ke API Gateway
Saat API Gateway memanggil Function Compute, data terkait API dikonversi menjadi map dan dikirim ke layanan Function Compute. Setelah diproses, Function Compute mengembalikan data seperti statusCode, headers, dan body dalam format output yang ditentukan. API Gateway kemudian memetakan konten yang dikembalikan oleh Function Compute ke bidang statusCode, headers, dan body lalu mengirimkannya kembali ke klien.

Buat fungsi web dan hubungkan ke API Gateway
Langkah 1: Buat fungsi web
Buat fungsi web di Konsol Function Compute 3.0. Untuk informasi selengkapnya, lihat Buat fungsi web.
Secara default, pemicu HTTP dibuat untuk fungsi web tersebut. Salin titik akhir jaringan internal untuk digunakan nanti.

Langkah 2: Buat layanan backend
Definisikan layanan backend di API Gateway dan konfigurasikan titik akhirnya agar terhubung ke Function Compute.
Masuk ke Konsol API Gateway, pilih Wilayah, lalu pada panel navigasi kiri, pilih Manage APIs > Backend Services. Di pojok kanan atas, klik Create Backend Service. Konfigurasikan informasi berikut, lalu klik Confirm.

Pada halaman Backend Service, klik layanan backend yang baru saja dibuat untuk membuka halaman definisi layanan backend tersebut. Klik tab Production. Pada bagian Basic Information, klik Create. Masukkan titik akhir jaringan internal dari pemicu untuk fungsi web yang Anda buat di Langkah 1, lalu klik Publish.

Langkah 3: Buat dan publikasikan API
Buat API untuk memungkinkan aplikasi eksternal memanggil layanan fungsi web internal dengan cara tertentu. Gunakan grup API untuk mengorganisasi dan mengelola beberapa operasi API terkait, yang menyederhanakan penerapan kebijakan keamanan terpadu dan langkah-langkah shaping trafik.
Masuk ke Konsol API Gateway. Pada panel navigasi kiri, pilih Manage APIs > API Groups lalu klik Create Group untuk mengelola API.
Pada dialog Create Group, pilih Instances:, masukkan
FC-Groupuntuk Group Name, dan atur BasePath ke/. Lalu, klik Confirm.
CatatanBuat grup API di wilayah yang sama dengan fungsi tersebut. Jika berbeda wilayah, API harus mengakses layanan Function Compute Anda melalui jaringan publik, yang akan dikenakan biaya trafik. Jika Anda memiliki persyaratan tinggi terhadap keamanan data dan latensi jaringan, pilih wilayah yang sama untuk API dan fungsi tersebut.
Pada halaman daftar grup, temukan grup target, lalu pada kolom Actions, klik Manage APIs. Kemudian, klik Create API, konfigurasikan informasi berikut, lalu klik Next.

Pada tab konfigurasi Define API Request, atur Request Path ke
/, biarkan pengaturan lainnya tetap default, lalu klik Next.Pada tab konfigurasi Define Backend Service, konfigurasikan pengaturan seperti pada gambar lalu klik Next.

Pada tab konfigurasi Define Response, biarkan konfigurasi default lalu klik Create. Setelah API dibuat, klik Publish pada dialog yang muncul.
Pada dialog Publish API, atur item konfigurasi berikut lalu klik Publish.

Langkah 4: Buat aplikasi dan berikan otorisasi API
Aplikasi (APP) berfungsi sebagai identitas saat Anda memanggil layanan API. Pada Langkah 3: Buat dan publikasikan API, metode autentikasi diatur ke Alibaba Cloud APP. Oleh karena itu, setelah API dipublikasikan, Anda harus membuat APP dan memberikan otorisasi kepada APP tersebut untuk mengakses API.
Masuk ke Konsol API Gateway. Pada panel navigasi kiri, pilih Call APIs > Apps.
Pada halaman Apps, klik Create App di pojok kanan atas. Pada halaman Create App, masukkan
fcAppuntuk App Name: lalu klik Confirm.Klik nama aplikasi
fcAppyang telah dibuat untuk membuka halaman App Details. Anda dapat melihat bahwa terdapat dua metode autentikasi untuk Alibaba Cloud APP:AppKeydanAppCode. MetodeAppKeymenggunakanAppKeydanAppSecret. Anda dapat menganggap ini sebagai akun dan kata sandi. Saat memanggil API,AppKeydikirim sebagai parameter, sedangkanAppSecretdigunakan untuk perhitungan tanda tangan. Gerbang menggunakan pasangan kunci ini untuk mengotentikasi identitas Anda.
Pada panel navigasi kiri, pilih Manage APIs > APIs. Pada halaman daftar API, temukan API yang telah Anda buat. Pada kolom Actions, pilih
> Authorize.Pada halaman otorisasi, atur Stage: ke Production. Cari aplikasi
fcAppyang telah Anda buat, klik Add, lalu klik Confirm. Pesan akan menunjukkan bahwa otorisasi berhasil.
Langkah 5: Verifikasi hasil
Bagian ini menjelaskan cara menggunakan autentikasi AppCode untuk memanggil API yang telah dipublikasikan dalam sistem bisnis Anda. Perintah Curl digunakan sebagai contoh.
Masuk ke Konsol API Gateway. Pada panel navigasi kiri, pilih Call APIs > Apps. Pada halaman Apps, temukan APP yang telah diberi otorisasi lalu klik untuk mendapatkan APPCode. Kemudian, panggil API seperti pada contoh berikut.
curl -i -X GET "http://fd6f8e2b7bf44ab181a56****-cn-hangzhou.alicloudapi.com" -H "Authorization:APPCODE 7d2b7e4945ce44028ab00***"FAQ
Saat pemicu API Gateway mengeksekusi fungsi, muncul error 502. Namun, log fungsi menunjukkan bahwa fungsi dieksekusi dengan sukses. Mengapa hal ini terjadi?
Koneksi antara API Gateway dan Function Compute memiliki persyaratan format tertentu. Jika hasil yang dikembalikan Function Compute ke API Gateway tidak mengikuti format yang ditentukan, API Gateway menganggap layanan backend tidak tersedia. Untuk informasi selengkapnya tentang persyaratan format, lihat Trigger event format dan format parameter return dari Function Compute dalam hasil verifikasi.
Bagaimana cara mengatur content-type respons?
Seperti yang ditunjukkan pada gambar, Anda dapat mengatur content-type respons saat mengonfigurasi API. Untuk informasi selengkapnya, lihat Connect to Function Compute 3.0 (web function) through API Gateway.
Pemicu API Gateway mengeksekusi fungsi Function Compute. Fungsi bekerja dengan benar, tetapi jika tidak dipanggil dalam periode tertentu, pemanggilan berikutnya menghasilkan error 503. Apa penyebabnya?
Jika fungsi tidak dipanggil dalam periode tertentu, lingkungan eksekusi harus dipersiapkan kembali untuk pemanggilan berikutnya. Hal ini menyebabkan cold start delay. Jika pemanggilan tidak selesai dalam periode timeout yang ditetapkan di API Gateway, API Gateway menganggap layanan backend tidak tersedia. Untuk mengatasi masalah ini, perpanjang periode timeout di API Gateway.
Mengapa body yang diterima fungsi dari API Gateway di-encode Base64?
API Gateway tidak meng-encode Base64 body untuk transmisi berbasis FORM. Untuk menggunakan format FORM, Anda harus memilih pemetaan parameter input di API Gateway. Format body lainnya di-encode Base64 untuk mencegah kesalahan atau kehilangan konten saat transmisi. Kami menyarankan Anda terlebih dahulu memeriksa apakah parameter isBase64 dalam event bernilai true. Jika isBase64 bernilai true, body harus didekode di dalam fungsi. Untuk informasi selengkapnya tentang format event yang dikirim API Gateway ke Function Compute, lihat Trigger event format.