All Products
Search
Document Center

Function Compute:Pemicu API Gateway

Last Updated:Mar 15, 2026

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.

  1. 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.

    image

  2. 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.

    image

  3. Buat grup.

    Catatan

    Buat 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.

  4. Buat dan publikasikan API.

    Atur item konfigurasi utama sebagai berikut. Biarkan pengaturan lainnya tetap default.

    image

    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

  1. Masuk ke Konsol Function Compute. Pada panel navigasi kiri, pilih Function Management > Functions.

  2. Pada bilah navigasi atas, pilih wilayah. Di halaman Functions, klik fungsi target.

  3. 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, ApiRequest dan ApiResponse, didefinisikan sebagai berikut.

        Catatan

        Metode set() dan get() pada kelas POJO harus 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 InputStream input menjadi kelas POJO yang 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.

  1. Pada tab Code di halaman detail fungsi, klik ikon image.png di sebelah Test Function lalu pilih Configure Test Parameters dari daftar drop-down.

  2. 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.

    Catatan
    • Jika nilai isBase64Encoded adalah true, konten body yang dikirim dari API Gateway ke Function Compute di-encode Base64. Function Compute harus mendekode Base64 konten body sebelum memprosesnya.

    • Jika nilai isBase64Encoded adalah false, API Gateway tidak meng-encode Base64 konten body. Anda dapat langsung mengambil konten body di dalam fungsi.

  3. 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.

principle

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.

image

Langkah 2: Buat layanan backend

Definisikan layanan backend di API Gateway dan konfigurasikan titik akhirnya agar terhubung ke Function Compute.

  1. 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.

    image

  2. 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.

    image

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.

  1. Masuk ke Konsol API Gateway. Pada panel navigasi kiri, pilih Manage APIs > API Groups lalu klik Create Group untuk mengelola API.

  2. Pada dialog Create Group, pilih Instances:, masukkan FC-Group untuk Group Name, dan atur BasePath ke /. Lalu, klik Confirm.

    image

    Catatan

    Buat 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.

  3. Pada halaman daftar grup, temukan grup target, lalu pada kolom Actions, klik Manage APIs. Kemudian, klik Create API, konfigurasikan informasi berikut, lalu klik Next.

    image

  4. Pada tab konfigurasi Define API Request, atur Request Path ke /, biarkan pengaturan lainnya tetap default, lalu klik Next.

  5. Pada tab konfigurasi Define Backend Service, konfigurasikan pengaturan seperti pada gambar lalu klik Next.

    image

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

  7. Pada dialog Publish API, atur item konfigurasi berikut lalu klik Publish.

    image

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.

  1. Masuk ke Konsol API Gateway. Pada panel navigasi kiri, pilih Call APIs > Apps.

  2. Pada halaman Apps, klik Create App di pojok kanan atas. Pada halaman Create App, masukkan fcApp untuk App Name: lalu klik Confirm.

  3. Klik nama aplikasi fcApp yang telah dibuat untuk membuka halaman App Details. Anda dapat melihat bahwa terdapat dua metode autentikasi untuk Alibaba Cloud APP: AppKey dan AppCode. Metode AppKey menggunakan AppKey dan AppSecret. Anda dapat menganggap ini sebagai akun dan kata sandi. Saat memanggil API, AppKey dikirim sebagai parameter, sedangkan AppSecret digunakan untuk perhitungan tanda tangan. Gerbang menggunakan pasangan kunci ini untuk mengotentikasi identitas Anda.

    image

  4. Pada panel navigasi kiri, pilih Manage APIs > APIs. Pada halaman daftar API, temukan API yang telah Anda buat. Pada kolom Actions, pilih image > Authorize.

  5. Pada halaman otorisasi, atur Stage: ke Production. Cari aplikasi fcApp yang telah Anda buat, klik Add, lalu klik Confirm. Pesan akan menunjukkan bahwa otorisasi berhasil.

    image

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.content-type

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.