全部产品
Search
文档中心

Function Compute:Konfigurasikan pemicu OSS berbasis EventBridge

更新时间:Jul 02, 2025

Jika Anda ingin menentukan beberapa awalan dan akhiran file untuk pemicu Object Storage Service (OSS) atau mengaitkan lebih dari 10 pemicu dengan bucket OSS, Anda dapat membuat pemicu OSS berbasis EventBridge untuk menangani peristiwa seperti unggahan file dengan mudah.

Catatan penggunaan

Pemicu OSS berbasis EventBridge berbeda dari pemicu OSS asli. Perhatikan hal-hal berikut saat membuat pemicu OSS berbasis EventBridge:

  • Anda dapat mengaitkan maksimal 10 pemicu OSS asli dengan sebuah bucket. Jika Anda ingin mengaitkan lebih banyak pemicu OSS dengan sebuah bucket, Anda dapat membuat dan mengaitkan pemicu OSS berbasis EventBridge.

    Catatan

    Kami merekomendasikan agar Anda tidak mengaitkan lebih dari 10 pemicu dengan sebuah bucket. Jika Anda ingin mengaitkan lebih banyak pemicu, buatlah bucket baru dan konfigurasikan pemicu berdasarkan bucket tersebut.

  • Anda dapat membuat hingga 50 pemicu OSS berbasis EventBridge. Batas ini konsisten dengan batas yang berlaku di EventBridge. Untuk informasi lebih lanjut, lihat Batasan.

  • Tidak diperlukan keunikan semantik untuk pemicu OSS berbasis EventBridge. Parameter Event Type, Object Prefix, dan Object Suffix tidak harus unik.

  • Anda dapat mengonfigurasi beberapa entri untuk Object Prefix dan Object Suffix. Namun, pencocokan fuzzy dan ekspresi reguler berdasarkan Object Prefix dan Object Suffix tidak didukung.

  • Pemicu OSS berbasis EventBridge tidak langsung berlaku setelah dibuat. Tunggu sekitar 30 detik sebelum peristiwa OSS terkait dapat memicu fungsi yang terkait.

Contoh skenario

Anda dapat mengonfigurasi pemicu OSS berbasis EventBridge dengan menetapkan source dan test sebagai awalan serta .rar dan .zip sebagai akhiran dalam aturan pemicu. Saat file terkompresi disimpan di direktori source atau test di bucket OSS yang ditentukan dengan akhiran file .rar atau .zip, fungsi akan dieksekusi secara otomatis. Setelah fungsi dieksekusi, file yang telah diekstraksi akan disimpan di direktori lain dalam bucket yang sama.

Prasyarat

  • EventBridge

  • Function Compute

    • Layanan telah dibuat. Untuk informasi lebih lanjut, lihat Buat Layanan.

    • Fungsi telah dibuat. Untuk informasi lebih lanjut, lihat Buat Fungsi.

  • OSS

    • Bucket telah dibuat. Untuk informasi lebih lanjut, lihat Buat Bucket.

Langkah 1: Buat pemicu OSS berbasis EventBridge

  1. Masuk ke Konsol Function Compute. Di bilah navigasi sisi kiri, klik Services & Functions.

  2. Di bilah navigasi atas, pilih wilayah. Pada halaman Services, klik layanan yang diinginkan.

  3. Pada halaman Functions, klik fungsi yang ingin Anda kelola.
  4. Pada halaman detail fungsi, klik tab Triggers, pilih versi atau alias dari daftar drop-down Version or Alias, lalu klik Create Trigger.
  5. Di panel Buat Pemicu, pilih Object Storage Service (OSS) di Event triggers for Alibaba Cloud services dari daftar drop-down Trigger Type, konfigurasikan parameter lainnya, lalu klik OK.

    Parameter

    Deskripsi

    Contoh

    Name

    Masukkan nama pemicu.

    oss-trigger

    Version or Alias

    Pilih alias atau versi. Nilai default: LATEST. Jika Anda ingin membuat pemicu untuk versi atau alias lain, pilih versi atau alias dari daftar drop-down Version or Alias pada halaman detail fungsi. Untuk informasi lebih lanjut tentang versi dan alias, lihat Kelola versi dan Kelola alias.

    LATEST

    Bucket Name

    Pilih bucket yang dibuat di wilayah saat ini.

    bucket-zh****

    Object Prefix

    Masukkan awalan nama objek yang ingin Anda cocokkan. Kami merekomendasikan agar Anda menentukan awalan dan akhiran nama objek di Function Compute untuk menghindari biaya tambahan yang disebabkan oleh loop bersarang.

    Anda dapat mengklik + Add File Prefix untuk menambahkan lebih banyak entri untuk Object Prefix.

    Penting

    Awalan tidak boleh dimulai dengan garis miring (/). Jika tidak, pemicu OSS tidak dapat dipicu.

    • source

    • test

    Object Suffix

    Masukkan akhiran nama objek yang ingin Anda cocokkan. Kami merekomendasikan agar Anda menentukan awalan dan akhiran nama objek di Function Compute untuk menghindari biaya tambahan yang disebabkan oleh loop bersarang.

    Anda dapat mengklik + Add File Suffix untuk menambahkan lebih banyak entri untuk Object Suffix.

    png

    Event Type

    Pilih satu atau lebih peristiwa pemicu dari daftar drop-down. Untuk informasi lebih lanjut tentang tipe peristiwa OSS, lihat Peristiwa OSS.

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

    Event Pattern Content

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

    Penting

    Berhati-hatilah saat Anda memodifikasi Event Pattern Content. Jika tidak, pemicu mungkin gagal dipicu. Pahami aturan pola peristiwa sebelum Anda memutuskan apakah akan memodifikasi pola peristiwa. Untuk informasi lebih lanjut, lihat Pola peristiwa.

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

    Invocation Method

    Pilih metode pemanggilan fungsi. Nilai default: Pemanggilan Sinkron.

    • Sync Invocation: Setelah peristiwa memicu fungsi, Function Compute mengembalikan hasil eksekusi ketika eksekusi selesai. Metode ini cocok untuk berbagai skenario. Untuk informasi lebih lanjut, lihat Pemanggilan sinkron.

    • Async Invocation: Setelah peristiwa memicu fungsi, Function Compute segera mengembalikan respons dan memastikan bahwa fungsi dieksekusi setidaknya sekali. Namun, hasil eksekusi rinci tidak dikembalikan. Metode pemanggilan ini cocok untuk fungsi dengan latensi penjadwalan yang lebih tinggi. Untuk informasi lebih lanjut, lihat Ikhtisar.

    Pemanggilan Sinkron

    Trigger State

    Tentukan apakah akan mengaktifkan pemicu segera setelah dibuat. Secara default, Enable Trigger dipilih, dan pemicu segera diaktifkan setelah dibuat.

    Aktifkan Pemicu

    Push Format

    Tentukan format data parameter input fungsi. Data dilewatkan menggunakan parameter event fungsi. Nilai valid:

    • CloudEvents: spesifikasi yang menjelaskan data peristiwa dalam format umum, termasuk deskripsi peristiwa dan data payload peristiwa. Spesifikasi ini digunakan untuk menyederhanakan deklarasi peristiwa dan transmisi antara layanan dan platform yang berbeda.

    • RawData: spesifikasi yang hanya mengirimkan data payload peristiwa dan tidak mencakup informasi metadata lainnya dalam format CloudEvents.

    Catatan

    Pemicu OSS asli dan pemicu OSS berbasis EventBridge menggunakan push formats yang berbeda. Parameter acara dari pemicu OSS asli mendukung template OSSEvents, yaitu format acara yang dihasilkan oleh OSS.

    CloudEvents

    Setelah pemicu dibuat, pemicu tersebut akan ditampilkan di tab Triggers. Untuk memodifikasi atau menghapus pemicu yang ada, lihat Kelola Pemicu.

Langkah 2: Konfigurasikan parameter input fungsi

Sumber peristiwa pemicu OSS berbasis EventBridge dilewatkan ke fungsi dalam format CloudEvents, yang bertindak sebagai parameter input bernama event. Anda dapat secara manual melewatkan event ke fungsi untuk memicu fungsi.

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

  2. Di panel Configure Test Parameters, klik tab Create New Test Event atau Modify Existing Test Event, konfigurasikan parameter Event Name, tentukan isi peristiwa, lalu klik OK.

    Saat peristiwa tertentu terjadi di bucket OSS yang ditentukan, data peristiwa dikirim ke fungsi terkait dalam format JSON. Data peristiwa dilewatkan dalam parameter event ke Function Compute. 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 dalam event.

    Bidang

    Tipe

    Contoh

    Deskripsi

    datacontenttype

    String

    application/json;charset=utf-8

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

    aliyunaccountid

    String

    143199913****

    ID akun Alibaba Cloud. Anda dapat memperoleh ID akun Alibaba Cloud di bagian References pada halaman Overview di konsol Function Compute.

    data

    Struct

    {}

    Isi peristiwa OSS, yang merupakan objek JSON. CloudEvents berisi konteks yang didefinisikan oleh OSS saat peristiwa terjadi. Informasi ini dienkapsulasi dalam parameter data.

    subject

    String

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

    Subjek peristiwa.

    Format: acs:oss:<region>:<your_account_id>:<your_bucket>. Setel <region> ke wilayah yang Anda pilih saat membuat fungsi. Setel <your_account_id> ke ID akun Alibaba Cloud Anda. Setel <your_bucket> ke nama bucket yang Anda buat di wilayah yang sama.

    aliyunoriginalaccountid

    String

    143199913****

    ID akun Alibaba Cloud.

    source

    String

    acs.oss

    Sumber peristiwa. Nilainya tetap acs.oss.

    type

    String

    oss:ObjectCreated:PutObject

    Tipe peristiwa.

    aliyunpublishtime

    Timestamp

    2023-11-04T08:49:26.745Z

    Waktu ketika peristiwa diterima.

    specversion

    String

    1.0

    Versi spesifikasi CloudEvents.

    aliyuneventbusname

    String

    default

    Nama bus peristiwa yang menerima peristiwa.

    id

    String

    6364D216511B143733C5A67B

    ID peristiwa.

    time

    Timestamp

    2023-11-04T08:49:26Z

    Waktu ketika peristiwa terjadi.

    aliyunregionid

    String

    cn-hangzhou

    Wilayah tempat peristiwa diterima.

    aliyunpublishaddr

    String

    140.205.XX.XX

    Alamat IP server yang menerima peristiwa.

    Konfigurasikan bidang data dari parameter Event berdasarkan kebutuhan bisnis Anda.

    • userIdentity.principalId: ID akun Alibaba Cloud Anda.

    • region: wilayah yang Anda pilih saat membuat fungsi.

    • oss.bucket.name: nama bucket yang dibuat di wilayah yang sama dengan fungsi.

    • oss.bucket.arn: dalam format acs:oss:<region>:<your_account_id>:<your_bucket>. Setel <region> ke wilayah yang Anda pilih saat membuat fungsi. Setel <your_account_id> ke ID akun Alibaba Cloud Anda. Setel <your_bucket> ke nama bucket yang Anda buat di wilayah yang sama.

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

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

      Catatan

      Pastikan objek yang ditentukan ada di bucket yang ditentukan. Jika tidak, fungsi tidak dapat dieksekusi atau eksekusi gagal. Dalam contoh ini, source/a.png digunakan.

Langkah 3: Tulis kode fungsi dan uji fungsi

Setelah Anda membuat pemicu, Anda dapat menulis kode fungsi dan menguji fungsi untuk memverifikasi apakah kode tersebut benar. Saat peristiwa OSS terjadi, fungsi secara otomatis dipicu.

Peringatan

Hindari pemicu loop dalam kode. Jika tidak, biaya yang tidak perlu akan timbul. Misalnya, saat objek diunggah ke bucket OSS, operasi unggah memicu fungsi. Kemudian, fungsi ini menghasilkan satu atau lebih objek yang akan ditulis ke bucket OSS, dan operasi penulisan memicu fungsi ini lagi. Ini mengarah pada loop. Untuk informasi lebih lanjut, lihat Aturan Pemicuan.

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

    Berikut ini menjelaskan persiapan yang harus Anda lakukan dan kode contoh:

    Catatan

    Jika Anda ingin membaca data dari dan menulis data ke sumber daya OSS dalam fungsi Anda, kami merekomendasikan agar Anda menggunakan titik akhir internal OSS untuk mengakses sumber daya OSS. Jika Anda menggunakan titik akhir publik, Anda akan dikenakan biaya untuk data yang ditransfer melalui Internet. Untuk informasi lebih lanjut tentang format titik akhir internal OSS, lihat Wilayah dan Titik Akhir.

    /* Persiapan:
    1. Jalankan perintah berikut di klien untuk membuat file package.json dan menginstal modul jimp. 
      a. Jalankan perintah npm init di klien untuk membuat file package.json. 
      b. Jalankan perintah npm install jimp untuk menginstal modul jimp. 
    2. Pastikan handler 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 dari akun Alibaba Cloud memiliki izin pada semua operasi API. Menggunakan kredensial ini untuk melakukan operasi di Function Compute adalah operasi berisiko tinggi. Kami merekomendasikan agar Anda menggunakan pengguna RAM untuk memanggil operasi API atau melakukan pemeliharaan rutin. 
             Kami merekomendasikan agar Anda tidak menyimpan ID AccessKey dan Rahasia AccessKey ke kode proyek Anda. Jika tidak, pasangan AccessKey mungkin bocor dan keamanan semua sumber daya di akun Anda mungkin terganggu. 
             Dalam contoh ini, ID AccessKey dan Rahasia AccessKey diperoleh dari konteks. 
            */
            accessKeyId: ctx.credentials.accessKeyId,
            accessKeySecret: ctx.credentials.accessKeySecret,
            stsToken: ctx.credentials.securityToken
        });
        // Peroleh nama bucket dari peristiwa. 
        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";
        // Peroleh objek OSS. 
        console.log('Getting object: ', ossEvent.oss.object.key)
        client.get(ossEvent.oss.object.key).then(function (val) {
            // Baca isi objek OSS dari cache. 
            jimp.read(val.content, function (err, image) {
                if (err) {
                    console.error("Gagal membaca gambar");
                    callback(err);
                    return;
                }
                // Ubah ukuran gambar dan simpan ke file tmp. 
                image.resize(128, 128).write(tmpFile, function (err) {
                    if (err) {
                        console.error("Gagal menulis gambar secara lokal");
                        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('Gagal meletakkan objek: %j', err);
                        callback(err);
                        return;
                    });
               });
           });
       }).catch(function (err) {
            console.error('Gagal mendapatkan objek: %j', err);
            callback(err);
            return
        });
    };
    # Persiapan:
    #1. Pastikan bahwa peran RAM yang dikonfigurasi untuk layanan tempat fungsi dimiliki memiliki izin untuk mengakses OSS. Anda dapat masuk ke konsol RAM dan memberikan peran izin untuk mengakses OSS. 
    #2. Pastikan handler 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 OSS sdk
        #Pasangan AccessKey dari akun Alibaba Cloud memiliki izin pada semua operasi API. Menggunakan kredensial ini untuk melakukan operasi di Function Compute adalah operasi berisiko tinggi. Kami merekomendasikan agar Anda menggunakan pengguna RAM untuk memanggil operasi API atau melakukan pemeliharaan rutin. 
        # Kami merekomendasikan agar Anda tidak menyimpan ID AccessKey dan Rahasia AccessKey ke kode proyek Anda. Jika tidak, pasangan AccessKey mungkin bocor dan keamanan semua sumber daya di akun Anda mungkin terganggu. 
        # Dalam contoh ini, ID AccessKey dan Rahasia AccessKey diperoleh 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 bahwa peran RAM yang dikonfigurasi untuk layanan tempat fungsi dimiliki memiliki izin untuk mengakses OSS. Anda dapat masuk ke konsol RAM dan memberikan peran izin untuk mengakses OSS. 
    2. Pastikan handler fungsi adalah index.handler. 
    */
    
    <?php
      use OSS\OssClient;
    function handler($event, $context) {
      $event           = json_decode($event, $assoc = true);
      /*
        Pasangan AccessKey dari akun Alibaba Cloud memiliki izin pada semua operasi API. Menggunakan kredensial ini untuk melakukan operasi di Function Compute adalah operasi berisiko tinggi. Kami merekomendasikan agar Anda menggunakan pengguna RAM untuk memanggil operasi API atau melakukan pemeliharaan rutin. 
        Kami merekomendasikan agar Anda tidak menyimpan ID AccessKey dan Rahasia AccessKey ke kode proyek Anda. Jika tidak, pasangan AccessKey mungkin bocor dan keamanan semua sumber daya di akun Anda mungkin terganggu. 
        Dalam contoh ini, pasangan Access Key diperoleh 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());
      }
    }
  2. Pada tab Code, klik Test Function.

    Setelah eksekusi selesai, Anda dapat melihat hasil eksekusi di tab Code.

FAQ

Referensi

  • Untuk informasi lebih lanjut tentang tipe peristiwa OSS yang dapat Anda konfigurasikan, lihat Peristiwa OSS.

  • Jika Anda ingin memodifikasi atau menghapus pemicu yang ada, lihat Modifikasi Konfigurasi Pemicu.

  • Pemicu

    • Jika Anda ingin memeriksa peristiwa mana yang memicu fungsi, Anda dapat mengonfigurasi sistem untuk mencetak log tipe peristiwa di kode Anda. Untuk informasi lebih lanjut, lihat Manajemen Log.

    • Jika Anda ingin menggunakan fungsi untuk memanggil fungsi lain, Anda dapat menentukan operasi API untuk memanggil fungsi atau menggunakan CloudFlow untuk mengatur fungsi. Jika fungsi yang dipanggil memerlukan waktu lama untuk dieksekusi dan melibatkan pemanggilan asinkron, Anda dapat mengonfigurasi layanan tujuan untuk pemanggilan asinkron. Untuk informasi lebih lanjut, lihat Apakah fungsi dapat saling memanggil? dan Konfigurasikan Tujuan untuk Pemanggilan Asinkron.