All Products
Search
Document Center

Function Compute:Konfigurasikan pemicu EventBridge OSS

Last Updated:Apr 24, 2026

Untuk menentukan beberapa awalan dan akhiran objek atau mengaitkan lebih dari 10 pemicu ke satu bucket Object Storage Service (OSS), buat pemicu OSS berbasis EventBridge guna merespons event seperti unggahan file.

Catatan

Perhatikan perbedaan berikut antara pemicu OSS berbasis EventBridge dan pemicu OSS native:

  • Anda dapat mengaitkan maksimal 10 pemicu OSS native ke satu bucket. Jika ingin mengaitkan lebih banyak pemicu OSS ke satu bucket, gunakan pemicu OSS berbasis EventBridge.

    Catatan

    Kami menyarankan agar Anda tidak mengaitkan lebih dari 10 pemicu ke satu bucket. Jika memerlukan lebih banyak pemicu, buat bucket baru lalu buat pemicu untuk bucket tersebut.

  • Anda dapat membuat hingga 50 pemicu OSS berbasis EventBridge, sesuai dengan batas resource EventBridge. Untuk informasi selengkapnya, lihat Batas.

  • Untuk pemicu OSS berbasis EventBridge, kombinasi Event Type, Object Prefix, dan Object Suffix tidak perlu unik.

  • Anda dapat mengonfigurasi beberapa nilai untuk Object Prefix dan Object Suffix. Namun, pencocokan kabur (fuzzy matching) dan pencocokan ekspresi reguler tidak didukung untuk Object Prefix dan Object Suffix.

  • Pemicu OSS berbasis EventBridge tidak aktif secara langsung. Diperlukan sekitar 30 detik setelah pembuatan hingga mulai memicu fungsi terkait.

Contoh

Anda dapat mengonfigurasi pemicu OSS dengan aturan yang menentukan awalan source dan test serta akhiran .rar dan .zip. Ketika file terkompresi dengan akhiran .rar atau .zip diunggah ke direktori source atau test dalam bucket OSS tertentu, sebuah fungsi akan dipicu secara otomatis. Setelah fungsi dieksekusi, file hasil dekompresi disimpan di direktori lain dalam bucket yang sama.

Prasyarat

Langkah 1: Buat pemicu EventBridge OSS

  1. Login ke Konsol Function Compute. Di panel navigasi kiri, pilih Function Management > Functions.

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

  3. Di halaman detail fungsi, klik tab Trigger, lalu klik Create Trigger.

  4. Di panel Trigger Type, atur Event triggers for Alibaba Cloud services ke Object Storage Service (OSS) di bawah OK, konfigurasi parameter lainnya, lalu klik OK.

    Parameter

    Tindakan

    Contoh

    Name

    Masukkan nama kustom untuk pemicu.

    oss-trigger

    Version or Alias

    Nilai default adalah LATEST. Jika ingin membuat pemicu untuk versi atau alias berbeda, pilih terlebih dahulu versi atau alias dari daftar drop-down Version or Alias di halaman detail fungsi. Untuk informasi selengkapnya tentang versi dan alias, lihat Manage versions dan Manage aliases.

    LATEST

    Bucket Name

    Pilih bucket OSS yang telah Anda buat.

    bucket-zh****

    Object Prefix

    Masukkan awalan nama objek yang ingin Anda cocokkan. Function Compute merekomendasikan mengonfigurasi awalan dan akhiran untuk mencegah pemanggilan melingkar dan biaya tak terduga.

    Anda dapat mengklik + Add Object Prefix untuk menambahkan beberapa nilai untuk Object Prefix.

    Penting

    Awalan objek tidak boleh diawali dengan garis miring (/); jika tidak, pemicu tidak akan aktif.

    • source

    • test

    Object Suffix

    Masukkan akhiran nama objek yang ingin Anda cocokkan. Function Compute merekomendasikan mengonfigurasi awalan dan akhiran untuk mencegah pemanggilan melingkar dan biaya tak terduga.

    Anda dapat mengklik + Add Object Suffix untuk menambahkan beberapa nilai untuk Object Suffix.

    png

    Event Type

    Pilih satu atau beberapa event pemicu. Untuk informasi selengkapnya tentang jenis event Function Compute, lihat OSS event definitions.

    oss:ObjectCreated:PutObject, oss:ObjectCreated:PostObject, oss:ObjectCreated:CompleteMultipartUpload

    Event Pattern Content

    Setelah Anda mengonfigurasi Object Prefix, Object Suffix, dan Event Type, sistem akan mengisi parameter ini secara otomatis.

    Penting

    Ubah Event Pattern Content dengan hati-hati. Modifikasi yang salah dapat menyebabkan pemicu gagal. Sebelum mengubah pola event, pastikan Anda memahami aturannya. Untuk informasi selengkapnya, lihat Event patterns.

    {
        "source":[
            "acs.oss"
        ]
    }

    Invocation Method

    Pilih metode untuk memanggil fungsi. Metode default adalah pemanggilan sinkron.

    • Sync Invocation: Function Compute memicu fungsi dan menunggu eksekusi selesai sebelum mengembalikan hasil. Metode ini cocok untuk berbagai kasus penggunaan. Untuk informasi selengkapnya, lihat Sync invocation.

    • Async Invocation: Function Compute memicu fungsi dan langsung mengembalikan respons. Layanan ini menjamin bahwa fungsi dieksekusi minimal sekali tetapi tidak mengembalikan hasil eksekusi. Metode ini cocok untuk fungsi dengan waktu eksekusi panjang. Untuk informasi selengkapnya, lihat Async invocation.

    Sync Invocation

    Trigger State

    Menentukan apakah pemicu langsung diaktifkan saat dibuat. Secara default, Enable Trigger dipilih, artinya pemicu langsung diaktifkan setelah dibuat.

    N/A

    Push Format

    Menentukan format data untuk parameter input event fungsi.

    • CloudEvents: Spesifikasi untuk mendeskripsikan data event dalam format umum. Ini mencakup deskripsi event dan muatannya, sehingga menyederhanakan deklarasi dan pengiriman event lintas layanan dan platform.

    • RawData: Mengirimkan hanya muatan event, tanpa metadata lain dari format CloudEvents.

    Catatan

    pemicu OSS native berbeda dari EventBridge-based OSS triggers. Parameter event pemicu OSS native hanya mendukung templat OSSEvents, yaitu format event yang dihasilkan oleh OSS.

    CloudEvents

    Untuk informasi tentang parameter lanjutan, seperti pengaturan ulang percobaan (retry) dan surat mati (dead letter), lihat Advanced trigger features.

    Setelah pemicu dibuat, pemicu tersebut muncul dalam daftar Trigger Name. Untuk mengubah atau menghapus pemicu, lihat Manage triggers.

Langkah 2: Konfigurasikan parameter input fungsi

Pemicu OSS berbasis EventBridge meneruskan event ke fungsi sebagai parameter input dalam format CloudEvents. Anda dapat secara manual meneruskan event ke fungsi untuk mensimulasikan pemicu.

  1. Di tab Code halaman detail fungsi, klik ikon image.png di samping Test Function dan 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 event dan konten event, lalu klik OK.

    Event tersebut merupakan parameter input untuk Function Compute. Saat event tertentu terjadi di bucket OSS target, sistem mengirimkan data event ke fungsi terikat dalam format JSON. Kode berikut memberikan contoh:

    {
        "datacontenttype": "application/json;charset=utf-8",
        "aliyunaccountid": "143199913****",
        "data": {
            "eventVersion": "1.0",
            "responseElements": {
                "requestId": "6364D216511B143733C5A67B"
            },
            "eventSource": "acs:oss",
            "eventTime": "2023-11-04T08:49:26.000Z",
            "requestParameters": {
                "sourceIPAddress": "140.205.XX.XX"
            },
            "eventName": "ObjectCreated:PutObject",
            "userIdentity": {
                "principalId": "143199913****"
            },
            "region": "cn-hangzhou",
            "oss": {
                "bucket": {
                    "name": "bucket-zh***",
                    "arn": "acs:oss:cn-hangzhou:143199913****:bucket-zh***",
                    "virtualBucket": "",
                    "ownerIdentity": "143199913****"
                },
                "ossSchemaVersion": "1.0",
                "object": {
                    "size": 13,
                    "objectMeta": {
                        "mimeType": "text/plain"
                    },
                    "deltaSize": 13,
                    "eTag": "59CA0EFA9F5633CB0371BBC0355478D8",
                    "key": "source/a.png"
                }
            }
        },
        "subject": "acs:oss:cn-hangzhou:143199913****:bucket-zh***/source/a.png",
        "aliyunoriginalaccountid": "143199913****",
        "source": "acs.oss",
        "type": "oss:ObjectCreated:PutObject",
        "aliyunpublishtime": "203-11-04T08:49:26.745Z",
        "specversion": "1.0",
        "aliyuneventbusname": "default",
        "id": "6364D216511B143733C5A67B",
        "time": "2023-11-04T08:49:26Z",
        "aliyunregionid": "cn-hangzhou"
    }

    Tabel berikut menjelaskan bidang-bidang dalam parameter event.

    Parameter

    Tipe

    Contoh

    Deskripsi

    datacontenttype

    string

    application/json;charset=utf-8

    Tipe konten dari parameter data. Parameter datacontenttype hanya mendukung application/json;charset=utf-8.

    aliyunaccountid

    string

    143199913****

    ID akun Alibaba Cloud Anda. Anda dapat menemukannya di bagian References pada halaman Overview di Konsol Function Compute.

    data

    struct

    {}

    Konten event OSS, berupa objek JSON. CloudEvents berisi konteks yang didefinisikan oleh OSS saat event terjadi. Informasi ini dikemas dalam parameter data.

    subject

    string

    acs:oss:cn-hangzhou:143199913****:bucket-zh****/source/a.png

    Subjek event.

    Formatnya adalah acs:oss:<region>:<your_account_id>:<your_bucket>, dengan <region> adalah wilayah fungsi, <your_account_id> adalah ID akun Alibaba Cloud Anda, dan <your_bucket> adalah nama bucket Anda.

    aliyunoriginalaccountid

    string

    143199913****

    ID akun Alibaba Cloud yang menjadi asal event.

    source

    string

    acs.oss

    Sumber event. Untuk pemicu OSS, nilainya tetap acs.oss.

    type

    string

    oss:ObjectCreated:PutObject

    Jenis event.

    aliyunpublishtime

    timestamp

    2023-11-04T08:49:26.745Z

    Waktu event diterima.

    specversion

    string

    1.0

    Versi protokol CloudEvents.

    aliyuneventbusname

    string

    default

    Nama event bus yang menerima event.

    id

    string

    6364D216511B143733C5A67B

    ID event.

    time

    timestamp

    2023-11-04T08:49:26Z

    Waktu event terjadi.

    aliyunregionid

    string

    cn-hangzhou

    Wilayah tempat event diterima.

    aliyunpublishaddr

    string

    140.205.XX.XX

    Alamat IP server yang menerima event.

    Anda harus memperbarui bidang-bidang berikut dalam parameter data agar sesuai dengan konfigurasi Anda:

    • userIdentity.principalId: Ganti dengan ID akun Alibaba Cloud Anda.

    • region: Ganti dengan wilayah tempat Anda membuat fungsi.

    • oss.bucket.name: Ganti dengan nama bucket Anda, yang harus berada di wilayah yang sama dengan fungsi.

    • oss.bucket.arn: Formatnya adalah acs:oss:<region>:<your_account_id>:<your_bucket>, dengan <region> adalah wilayah fungsi, <your_account_id> adalah ID akun Alibaba Cloud Anda, dan <your_bucket> adalah nama bucket Anda di wilayah yang sama.

    • oss.bucket.ownerIdentity: Ganti dengan ID akun Alibaba Cloud Anda.

    • object.key: Ganti dengan objek yang telah Anda unggah ke bucket tujuan.

    Penting

    Saat mensimulasikan pemicu dengan mengonfigurasi parameter event, pastikan objek yang ditentukan, seperti source/a.png dalam tutorial ini, ada di bucket yang dikonfigurasi. Jika tidak, fungsi tidak akan dipicu atau eksekusinya akan gagal.

Langkah 3: Tulis dan uji kode fungsi

Setelah membuat pemicu OSS, tulis dan uji kode fungsi untuk memverifikasi kebenarannya. Fungsi tersebut kemudian akan dipicu secara otomatis oleh event OSS nyata.

Peringatan

Anda harus menghindari pemicu berulang (loop triggers) dalam kode Anda. Jika tidak, Anda mungkin dikenai biaya tak terduga. Contoh skenario pemicu berulang adalah ketika unggahan objek ke bucket OSS memicu fungsi. Fungsi tersebut lalu menghasilkan satu atau beberapa file dan menulisnya kembali ke bucket yang sama, yang pada gilirannya memicu fungsi lagi. Untuk informasi selengkapnya, lihat OSS trigger rules.

  1. Di tab Code halaman detail fungsi, masukkan kode Anda di editor lalu klik Deploy.

    Bagian berikut menjelaskan persiapan dan menyediakan contoh kode.

    Catatan

    Jika Anda perlu membaca dari atau menulis ke resource OSS dalam fungsi, kami merekomendasikan menggunakan titik akhir internal OSS untuk menghindari trafik internet dan biaya terkait. Untuk informasi selengkapnya tentang titik akhir internal OSS, lihat Regions and endpoints.

    /* Persiapan:
    1. Jalankan perintah berikut di terminal untuk membuat file package.json dan menginstal modul jimp.
      a. Jalankan npm init untuk membuat file package.json.
      b. Jalankan npm install jimp untuk menginstal modul jimp.
    2. Pastikan penanganan fungsi adalah index.handler.
    */
    
    'use strict';
     console.log('Loading function ...');
     var oss = require('ali-oss');
     var fs = require('fs');
     var jimp = require("jimp");
     module.exports.handler = function (eventBuf, ctx, callback) {
         console.log('Received event:', eventBuf.toString());
         var event = JSON.parse(eventBuf);
    
         var ossEvent = event.data;
    
         // Wilayah OSS diawali dengan "oss-". Contoh: oss-cn-shanghai.
         var ossRegion = "oss-" + ossEvent.region;
         // Buat klien OSS.
         var client = new oss({
             region: ossRegion,
             /*
             Pasangan AccessKey akun Alibaba Cloud memberikan akses API penuh. Untuk keamanan, gunakan Pengguna RAM untuk panggilan API dan operasi rutin.
             Jangan hard-code ID AccessKey dan rahasia Anda dalam kode, karena ini dapat menyebabkan kebocoran dan mengompromikan keamanan akun Anda.
             Contoh ini mengambil kredensial dari konteks.
             */
             accessKeyId: ctx.credentials.accessKeyId,
             accessKeySecret: ctx.credentials.accessKeySecret,
             stsToken: ctx.credentials.securityToken
         });
         // Dapatkan nama bucket dari event.
         client.useBucket(ossEvent.oss.bucket.name);
         // Gambar yang diproses disimpan ke direktori processed/.
         var newKey = ossEvent.oss.object.key.replace("source/", "processed/");
         var tmpFile = "/tmp/processed.png";
         // Dapatkan objek OSS.
         console.log('Getting object: ', ossEvent.oss.object.key)
         client.get(ossEvent.oss.object.key).then(function (val) {
             // Baca konten objek OSS dari cache.
             jimp.read(val.content, function (err, image) {
                 if (err) {
                     console.error("Failed to read image");
                     callback(err);
                     return;
                 }
                 // Ubah ukuran gambar dan simpan ke file tmp.
                 image.resize(128, 128).write(tmpFile, function (err) {
                     if (err) {
                         console.error("Failed to write image locally");
                         callback(err);
                         return;
                     }
                     // Unggah objek OSS yang dibaca ke bucket OSS dan ubah nama objek.
                     console.log('Putting object: ', newKey);
                     client.put(newKey, tmpFile).then(function (val) {
                         console.log('Put object:', val);
                         callback(null, val);
                         return;
                     }).catch(function (err) {
                         console.error('Failed to put object: %j', err);
                         callback(err);
                         return
                     });
                 });
             });
         }).catch(function (err) {
             console.error('Failed to get object: %j', err);
             callback(err);
             return
         });
     };
    # Persiapan:
    # 1. Pastikan peran yang dikonfigurasi untuk fungsi memiliki izin untuk mengakses OSS. Anda dapat login ke Konsol RAM untuk memberikan izin yang diperlukan kepada peran tersebut.
    # 2. Pastikan penanganan permintaan fungsi adalah index.handler.
    
    # -*- coding: utf-8 -*-
    import oss2, json
    from wand.image import Image
    def handler(event, context):
        evt = json.loads(event)
        creds = context.credentials
        # Diperlukan oleh SDK OSS
        # Pasangan AccessKey akun Alibaba Cloud memberikan akses API penuh. Untuk keamanan, gunakan Pengguna RAM untuk panggilan API dan operasi rutin.
        # Jangan hard-code ID AccessKey dan rahasia Anda dalam kode, karena ini dapat menyebabkan kebocoran dan mengompromikan keamanan akun Anda.
        # Contoh ini mengambil kredensial dari konteks.
        auth=oss2.StsAuth(
            creds.access_key_id,
            creds.access_key_secret,
            creds.security_token)
        evt = evt['data']
        bucket_name = evt['oss']['bucket']['name']
        endpoint = 'oss-' +  evt['region'] + '-internal.aliyuncs.com'
        bucket = oss2.Bucket(auth, endpoint, bucket_name)
        objectName = evt['oss']['object']['key']
        # Gambar yang diproses akan disimpan ke processed/
        newKey = objectName.replace("source/", "processed/")
        remote_stream = bucket.get_object(objectName)
        if not remote_stream:
            return
        remote_stream = remote_stream.read()
        with Image(blob=remote_stream)  as img:
            with img.clone() as i:
                i.resize(128, 128)
                new_blob = i.make_blob()
                bucket.put_object(newKey, new_blob)
    /* Persiapan:
    1. Pastikan peran yang dikonfigurasi untuk fungsi memiliki izin untuk mengakses OSS. Anda dapat login ke Konsol RAM dan memberikan izin akses OSS kepada peran tersebut.
    2. Pastikan penanganan permintaan fungsi adalah index.handler.
    */
    
    <?php
      use OSS\OssClient;
    function handler($event, $context) {
      $event           = json_decode($event, $assoc = true);
      /*
        Pasangan AccessKey akun Alibaba Cloud memberikan akses API penuh. Untuk keamanan, gunakan Pengguna RAM untuk panggilan API dan operasi rutin.
        Jangan hard-code ID AccessKey dan rahasia Anda dalam kode, karena ini dapat menyebabkan kebocoran dan mengompromikan keamanan akun Anda.
        Contoh ini mengambil kredensial dari konteks.
      */
      $accessKeyId     = $context["credentials"]["accessKeyId"];
      $accessKeySecret = $context["credentials"]["accessKeySecret"];
      $securityToken   = $context["credentials"]["securityToken"];
      $evt        = $event['data'];
      $bucketName = $evt['oss']['bucket']['name'];
      $endpoint   = 'oss-' . $evt['region'] . '-internal.aliyuncs.com';
      $objectName = $evt['oss']['object']['key'];
      $newKey = str_replace("source/", "processed/", $objectName);
      try {
        $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint, false, $securityToken);
        $content = $ossClient->getObject($bucketName , $objectName);
        if ($content == null || $content == "") {
          return;
        }
        $imagick = new Imagick();
        $imagick->readImageBlob($content);
        $imagick->resizeImage(128, 128, Imagick::FILTER_LANCZOS, 1);
        $ossClient->putObject($bucketName, $newKey, $imagick->getImageBlob());
      } catch (OssException $e) {
        print($e->getMessage());
      }
    }
    /* Persiapan:
    1. Tambahkan dependensi berikut ke pom.xml.
    <dependencies>
        <dependency>
          <groupId>com.aliyun.fc.runtime</groupId>
          <artifactId>fc-java-core</artifactId>
          <version>1.4.1</version>
        </dependency>
        <dependency>
          <groupId>com.aliyun.fc.runtime</groupId>
          <artifactId>fc-java-event</artifactId>
          <version>1.2.0</version>
        </dependency>
    </dependencies>
    2. Pastikan penanganan fungsi adalah example.App::handleRequest.
    */
    
    package example;
    
    import java.io.*;
    import java.util.Map;
    
    import com.aliyun.fc.runtime.Context;
    import com.aliyun.fc.runtime.StreamRequestHandler;
    import com.aliyun.fc.runtime.event.OSSEvent.Event;
    
    import com.fasterxml.jackson.annotation.JsonCreator;
    import com.fasterxml.jackson.annotation.JsonProperty;
    import com.fasterxml.jackson.core.type.TypeReference;
    import com.fasterxml.jackson.databind.DeserializationFeature;
    import com.fasterxml.jackson.databind.ObjectMapper;
    
    
    
    public class App implements StreamRequestHandler {
    
        private static final ObjectMapper mapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        public static final class CloudEvent {
            public final String id;
    
            public final String source;
            public final String specversion;
    
            public final String type;
            public final String datacontenttype;
    
            public final String dataschema;
    
            public final String subject;
    
            public final String time;
    
            public final Map<String, ?> extensions;
    
            public final Event data;
    
            @JsonCreator
            public CloudEvent(@JsonProperty("id") String id, @JsonProperty("source") String source, @JsonProperty("specversion") String specversion, @JsonProperty("type") String type, @JsonProperty("datacontenttype") String datacontenttype, @JsonProperty("dataschema") String dataschema, @JsonProperty("subject") String subject, @JsonProperty("time") String time, @JsonProperty("extensions") Map<String, ?> extensions, @JsonProperty("data") Event data) {
                this.id = id;
                this.source = source;
                this.specversion = specversion;
                this.type = type;
                this.datacontenttype = datacontenttype;
                this.dataschema = dataschema;
                this.subject = subject;
                this.time = time;
                this.extensions = extensions;
                this.data = data;
            }
    
            public String getId() {
                return this.id;
            }
    
            public String getSource() {
                return this.source;
            }
    
            public String getSpecversion() {
                return this.specversion;
            }
    
            public String getType() {
                return this.type;
            }
    
            public String getDatacontenttype() {
                return this.datacontenttype;
            }
    
            public String getDataschema() {
                return this.dataschema;
            }
    
            public String getSubject() {
                return this.subject;
            }
    
            public String getTime() {
                return this.time;
            }
    
            public Map<String, ?> getExtensions() {
                return this.extensions;
            }
    
            public Event getData() {
                return this.data;
            }
        }
        @Override
        public void handleRequest(
                InputStream inputStream, OutputStream outputStream, Context context) throws IOException {
            CloudEvent cloudEvents = mapper.readValue(inputStream, new TypeReference<CloudEvent>() {});
            Event ossEvent = cloudEvents.getData();
            context.getLogger().info(String.format("received %s from %s @ %s", ossEvent.eventName, ossEvent.eventSource, ossEvent.region));
            outputStream.write(String.format("received %s from %s @ %s", ossEvent.eventName, ossEvent.eventSource, ossEvent.region).getBytes());
            outputStream.write(String.format("received bucket %s", ossEvent.oss.bucket.arn).getBytes());
            outputStream.write(String.format("received object %s and it's size is %s", ossEvent.oss.object.key, ossEvent.oss.object.size).getBytes());
        }
    }
  2. Klik Test Function.

    Setelah eksekusi selesai, Anda dapat melihat hasilnya di atas tab Code.

FAQ

Topik Terkait

  • Untuk mempelajari jenis event OSS yang dapat dikonfigurasi, lihat OSS event definitions.

  • Untuk mengubah atau menghapus pemicu yang sudah ada, lihat Update a trigger.

  • Isu terkait pemicu:

    • Untuk memeriksa event mana yang memicu fungsi Anda, Anda dapat mencatat jenis event dalam kode. Untuk informasi selengkapnya, lihat Log management.

    • Untuk memanggil satu fungsi dari fungsi lain, Anda dapat melakukan panggilan API langsung atau menggunakan CloudFlow untuk mengoordinasikannya. Jika Anda memanggil fungsi secara asinkron yang menjalankan tugas berdurasi panjang, Anda dapat mengonfigurasi tujuan untuk menangani hasil pemanggilan. Untuk informasi selengkapnya, lihat Can functions invoke each other? dan Configure a destination for an asynchronous invocation.