Function Compute mendukung penggunaan API Gateway sebagai sumber event. Anda dapat mengonfigurasi Function Compute sebagai layanan backend untuk API. Ketika permintaan diterima oleh instance API Gateway yang dikonfigurasi untuk menggunakan Function Compute sebagai layanan backend-nya, API Gateway memicu fungsi terkait untuk dieksekusi. Setelah fungsi menyelesaikan eksekusinya, Function Compute mengirimkan hasil kembali ke API Gateway.
Latar Belakang
Pemicu API Gateway bekerja mirip dengan Pemicu HTTP dan dapat digunakan untuk membangun aplikasi web. Tidak seperti Pemicu HTTP, Pemicu API Gateway memungkinkan Anda melakukan operasi lanjutan, seperti menetapkan daftar putih atau daftar hitam IP.
API Gateway dapat dikonfigurasi untuk menggunakan baik fungsi event maupun fungsi web sebagai layanan backend-nya. Setelah Function Compute diintegrasikan dengan API Gateway, fungsi-fungsi ini dapat diekspos secara aman kepada klien melalui API. Pengaturan ini memungkinkan pengelolaan efektif berbagai masalah, termasuk otentikasi, kontrol lalu lintas, dan konversi data.
Buat fungsi event dan integrasikan dengan API Gateway
Langkah 1: Buat fungsi event
Buat fungsi event di Konsol Function Compute. Untuk informasi lebih lanjut, lihat Buat Fungsi Event.
Langkah 2: Buat API dengan Function Compute sebagai layanan backend-nya
Anda harus membuat layanan backend di API Gateway dan mengonfigurasi URL untuk layanan backend tersebut agar menunjuk ke layanan Function Compute Anda.
Masuk ke Konsol API Gateway. Di panel navigasi kiri, pilih Manage APIs > Backend Services. Di bilah navigasi atas, pilih wilayah. Kemudian, klik Create Backend Service di pojok kanan atas, konfigurasikan parameter seperti yang ditunjukkan pada gambar berikut, dan klik Confirm:

Di halaman Layanan Backend, klik layanan backend yang baru saja Anda buat. Di halaman Definisi Layanan Backend, klik tab Production. Di bagian Basic Information, klik Create. Pilih fungsi event yang Anda buat di Langkah 1 dan klik Publish.

Buat grup API.
CatatanKami merekomendasikan Anda membuat grup API di wilayah yang sama dengan fungsi Anda. Jika API berada di wilayah berbeda, maka perlu mengakses layanan Function Compute Anda melalui Internet, yang akan menimbulkan biaya lalu lintas. Untuk persyaratan ketat keamanan data dan latensi jaringan, pastikan grup API dibuat di wilayah yang sama dengan fungsi Anda.
Buat dan publikasikan API.
Konfigurasikan parameter yang diperlukan sesuai petunjuk di bawah ini. Anda dapat membiarkan sisanya pada pengaturan default.

Parameter
Instruksi Konfigurasi
Security Authentication
Pilih Tanpa Otentikasi.
Configuration Mode
Pilih Gunakan Layanan Backend yang Ada.
Backend Service Type
Pilih Function Compute.
Version
Pilih Function Compute V3.0.
Function Type
Pilih Fungsi Event.
Backend Service
Pilih layanan backend yang baru saja Anda buat yang menunjuk ke fungsi event.
Langkah 3: Tulis kode fungsi
Masuk ke Konsol Function Compute. Di panel navigasi kiri, klik Functions.
Di bilah navigasi atas, pilih wilayah. Pada halaman Functions, klik fungsi yang ingin Anda kelola.
Pada tab Code di halaman Detail Fungsi, tulis kode di editor kode dan klik Deploy.
Contoh kode untuk berbagai bahasa adalah sebagai berikut:
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 // Anda dapat menulis logika Anda sendiri di sini. } 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'] } # Anda dapat menulis logika Anda sendiri di sini. 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 memprogram dalam Java untuk Function Compute, Anda harus mengimplementasikan sebuah kelas yang menggunakan metode handler yang telah ditentukan sebelumnya. Ada dua metode handler yang tersedia. Untuk informasi lebih lanjut tentang waktu proses Java, lihat Kompilasi dan Penyebaran Paket Kode.
(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) { // Dapatkan informasi permintaan API. 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); // Anda dapat menulis logika Anda sendiri di sini. // Contoh respons API. Map headers = new HashMap(); boolean isBase64Encoded = false; int statusCode = 200; String returnBody = ""; return new ApiResponse(headers,isBase64Encoded,statusCode,returnBody); } }Berikut ini adalah contoh yang mendefinisikan dua kelas
POJO:ApiRequestdanApiResponse.CatatanMetode
set()danget()dari kelasPOJOharus ditentukan.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; } }Kode berikut menunjukkan contoh file 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>
Gunakan handler StreamRequestHandler.
Untuk menggunakan handler ini, Anda harus mengonversi
InputStreammenjadi kelasPOJO. Contoh kode berikut menjelaskan cara menggunakan handler ini.Konfigurasi file pom.xml sama seperti saat menggunakan 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 { // Konversi InputStream menjadi 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))); // Anda dapat menulis logika Anda sendiri di sini. // Hasil yang dikembalikan. 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 mengembalikan respons ke API Gateway dalam format JSON berikut. 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: Konfigurasi parameter input fungsi
Ketika API Gateway memicu sebuah fungsi, informasi dikirim dalam bentuk objek event ke dalam fungsi. Anda dapat menggunakan informasi ini untuk men-debug fungsi Anda.
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, klik tab Create New Test Event atau Modify Existing Test Event. Masukkan nama event dan isi event, lalu klik OK.
Berikut adalah contoh objek event:
{ "path":"jalur permintaan api", "httpMethod":"nama metode permintaan", "headers":{semua header, termasuk header sistem}, "queryParameters":{parameter kueri}, "pathParameters":{parameter jalur}, "body":"string payload permintaan", "isBase64Encoded":"true|false, menunjukkan apakah body di-enkode Base64" }Tabel berikut menjelaskan parameter dalam objek event.
Parameter
Tipe
Deskripsi
path
String
Jalur permintaan API.
httpMethod
String
Metode permintaan. Nilai yang valid: GET, POST, PUT, dan DELETE.
headers
Object
Informasi header permintaan. Ini mencakup semua header permintaan, termasuk header sistem dan header kustom.
queryParameters
Object
Parameter kueri. Biasanya dalam bentuk pasangan kunci-nilai yang muncul setelah tanda tanya di URL.
pathParameters
Object
Parameter jalur. Biasanya merupakan bagian dari URL dan digunakan untuk mengidentifikasi sumber daya tertentu.
body
String
Badan permintaan.
isBase64Encoded
Boolean
Menentukan apakah badan permintaan di-enkode dalam format Base64.
CatatanJika nilai dari
isBase64Encodedadalahtrue, konten body yang dikirim oleh API Gateway ke Function Compute di-enkode dalam Base64. Function Compute mendekode konten body dari format Base64 sebelum memproses konten tersebut.Jika nilai dari
isBase64Encodedadalahfalse, API Gateway tidak melakukan enkode Base64 pada konten body, dan Function Compute dapat langsung memperoleh konten body.
Klik Test Function.
Langkah 5: Lihat hasilnya
Setelah fungsi dijalankan, hasilnya dapat dilihat di tab Code.
Function Compute mengirimkan hasil eksekusi ke API Gateway untuk diuraikan dalam format JSON berikut. Potongan kode berikut menunjukkan contoh hasil yang dikembalikan:
{
"isBase64Encoded":true|false,
"statusCode":httpStatusCode,
"headers":{response headers},
"body":"..."
} Persyaratan format saat fungsi acara diintegrasikan dengan API Gateway
Setelah API Gateway menerima permintaan untuk operasi API dengan Function Compute sebagai layanan backend, API Gateway mengonversi parameter permintaan menjadi pasangan kunci-nilai dalam format peta dan mengirimkannya ke Function Compute. Function Compute memproses permintaan tersebut dan mengembalikan respons dalam format output tertentu ke API Gateway. Respons ini mencakup informasi seperti kode status, header, dan body, sebagaimana ditunjukkan pada gambar berikut. API Gateway kemudian memetakan informasi dari respons Function Compute ke dalam kode status, header, dan body respons API, lalu mengembalikan respons API ke klien.

Buat fungsi web dan integrasikan dengan API Gateway
Langkah 1: Buat fungsi web
Buat fungsi web di Konsol Function Compute. Untuk informasi lebih lanjut, lihat Langkah 1: Buat Fungsi Web.
Pemicu HTTP secara otomatis dibuat untuk fungsi web yang baru saja Anda buat. Salin titik akhir internal untuk digunakan nanti.

Langkah 2: Buat layanan backend
Anda harus membuat layanan backend di API Gateway dan mengonfigurasi URL untuk layanan backend agar menunjuk ke layanan Function Compute Anda.
Masuk ke Konsol API Gateway. Di panel navigasi kiri, pilih Manage APIs > Backend Services. Di bilah navigasi atas, pilih wilayah. Kemudian, klik Create Backend Service di pojok kanan atas, konfigurasikan parameter seperti yang ditunjukkan pada gambar berikut, dan klik Confirm:

Di halaman Layanan Backend, klik layanan backend yang baru saja Anda buat. Di halaman Definisi Layanan Backend, klik tab Production. Di bagian Basic Information, klik Create. Tempel titik akhir internal yang Anda salin di Langkah 1 dan klik Publish.

Langkah 3: Buat dan publikasikan API
Pada langkah ini, Anda membuat API yang memungkinkan aplikasi eksternal memanggil fungsi web internal dengan cara tertentu. Grup API digunakan untuk mengatur dan mengelola beberapa API terkait, memfasilitasi implementasi kebijakan keamanan dan kontrol lalu lintas yang seragam.
Masuk ke Konsol API Gateway. Di panel navigasi kiri, pilih Manage APIs > API Groups. Di halaman Grup API, klik Create Group.
Di kotak dialog Create Group, pilih instance dari daftar drop-down Instances, atur parameter Group Name menjadi
FC-Groupdan parameter BasePath menjadi/, dan klik Confirm.
CatatanKami merekomendasikan Anda membuat grup API di wilayah yang sama dengan fungsi Anda. Jika API berada di wilayah berbeda, maka perlu mengakses layanan Function Compute Anda melalui Internet, yang akan menimbulkan biaya lalu lintas. Untuk persyaratan ketat keamanan data dan latensi jaringan, pastikan grup API dibuat di wilayah yang sama dengan fungsi Anda.
Di halaman Grup API, temukan grup API yang Anda buat, klik Manage APIs di kolom Actions, lalu klik Create API. Konfigurasikan parameter berikut dan klik Next.

Di langkah Define API Request, atur parameter Request Path menjadi
/, gunakan nilai default untuk parameter lainnya, lalu klik Next.Di langkah Define Backend Service, konfigurasikan parameter berikut dan klik Next:

Di langkah Define Response, pertahankan pengaturan default dan klik Create. Di kotak dialog Catatan yang muncul, klik Publish.
Di kotak dialog Publish API, konfigurasikan parameter berikut dan klik Publish.

Langkah 4: Buat aplikasi dan otorisasikan untuk memanggil API
Aplikasi mewakili identitas yang digunakan untuk autentikasi saat membuat permintaan ke layanan API. Dalam contoh ini, Alibaba Cloud App dipilih untuk parameter Otentikasi Keamanan di Langkah 3: Buat dan Publikasikan API. Oleh karena itu, setelah API diterbitkan, Anda harus membuat aplikasi dan memberinya otorisasi untuk memanggil API.
Masuk ke Konsol API Gateway. Di panel navigasi kiri, pilih Call APIs > Apps.
Di halaman Apps, klik Create App di pojok kanan atas. Di kotak dialog Create App, atur App Name menjadi
fcAppdan klik Confirm.Di halaman Aplikasi, klik aplikasi
fcAppyang baru saja Anda buat. Di halaman App Details, Anda dapat melihat bahwa dua metode autentikasi tersedia:AppKeydanAppCode. MetodeAppKeymencakup sepasangAppKeydanAppSecret, yang bekerja mirip dengan pasangan nama pengguna dan kata sandi. Saat Anda memanggil API, Anda harus meneruskanAppKeysebagai parameter.AppSecretdigunakan untuk menghitung tanda tangan. API Gateway memverifikasi pasangan AppKey-AppSecret untuk mengotentikasi identitas Anda.
Di panel navigasi kiri, pilih Manage APIs > APIs. Di halaman API, temukan API yang baru saja Anda buat dan klik
> Authorize di kolom Actions.Di kotak dialog Otorisasi, atur parameter Stage menjadi Production. Masukkan
fcAppdi bilah pencarian bagian Pilih Aplikasi untuk Otorisasi. Di hasil pencarian, pilih aplikasi fcApp, klik Add di kolom Aksi, lalu klik Confirm. Pesan muncul untuk memberi tahu Anda bahwa aplikasi telah diotorisasi untuk memanggil API.
Langkah 5: Verifikasi hasilnya
Bagian berikut menjelaskan cara menggunakan metode autentikasi berbasis AppCode untuk memanggil API yang diterbitkan di sistem bisnis Anda. Contoh ini menggunakan perintah Curl untuk melakukan panggilan API.
Masuk ke Konsol API Gateway. Di panel navigasi kiri, pilih Call APIs > Apps. Di halaman Apps, klik aplikasi yang diotorisasi dan dapatkan AppCode-nya di halaman yang muncul. Kemudian, gunakan potongan kode sampel berikut untuk memanggil API:
curl -i -X GET "http://fd6f8e2b7bf44ab181a56****-cn-hangzhou.alicloudapi.com" -H "Authorization:APPCODE 7d2b7e4945ce44028ab00***"Tanya Jawab Umum
Kode kesalahan 502 dikembalikan saat eksekusi fungsi dipicu oleh API Gateway, tetapi log fungsi menunjukkan bahwa fungsi berhasil dieksekusi. Bagaimana cara menyelesaikan masalah ini?
API Gateway mengharuskan Function Compute mengembalikan respons dalam format tertentu. Jika respons tidak dalam format yang diharapkan, API Gateway menganggap layanan backend tidak tersedia. Untuk informasi lebih lanjut tentang persyaratan format integrasi antara API Gateway dan Function Compute, lihat Format Event untuk Pemicu Berbeda dan Langkah 5: Lihat Hasilnya.
Bagaimana cara menetapkan tipe konten respons yang dikembalikan?
Seperti yang ditunjukkan pada gambar berikut, Anda dapat menentukan tipe konten respons di langkah Definisikan Respons saat Anda membuat API. Untuk informasi lebih lanjut, lihat Gunakan API Gateway untuk memicu fungsi web di Function Compute 3.0.
Kode kesalahan 503 dikembalikan saat saya menggunakan API Gateway untuk memanggil fungsi yang sebelumnya dipanggil tetapi belum dipanggil selama periode waktu tertentu. Bagaimana cara menyelesaikan masalah ini?
Jika fungsi belum dipanggil selama beberapa waktu, lingkungan eksekusi baru harus disiapkan saat pemanggilan berikutnya, yang menghasilkan penundaan cold start. Ini dapat menyebabkan timeout di API Gateway sebelum pemanggilan selesai, sehingga API Gateway menganggap layanan backend tidak tersedia. Untuk menyelesaikan masalah ini, tingkatkan periode timeout API Gateway.
Mengapa parameter body dari permintaan yang dilewatkan dari API Gateway ke Function Compute dienkripsi Base64?
Body permintaan dienkripsi Base64 untuk mencegah kesalahan atau kehilangan transmisi konten, kecuali untuk body yang ditransmisikan dalam format formulir oleh API Gateway, yang tidak dienkripsi Base64. Saat menggunakan format formulir, Anda harus memilih Pemetaan Parameter Input di API Gateway. Kami merekomendasikan Anda memeriksa apakah nilai isBase64 adalah true atau false. Jika nilai isBase64 adalah true, Function Compute mendekode konten body dari format Base64 sebelum memproses konten tersebut. Untuk informasi lebih lanjut tentang format event yang dilewatkan ke Function Compute oleh API Gateway, lihat Format Event untuk Pemicu Berbeda.