All Products
Search
Document Center

Function Compute:Konfigurasikan pemicu OSS native

Last Updated:Apr 01, 2026

Pemicu Object Storage Service (OSS) native secara otomatis memanggil fungsi Anda ketika objek dibuat di bucket OSS tertentu—tanpa memerlukan kode pendengar event. Panduan ini menjelaskan cara membuat pemicu, mengonfigurasi event uji, serta menulis kode fungsi untuk mengubah ukuran gambar yang diunggah.

Cara kerja

  1. Sebuah objek diunggah ke bucket OSS (misalnya, source/a.png).

  2. OSS mendeteksi event tersebut dan memanggil fungsi Function Compute yang terkait, dengan meneruskan muatan event dalam format JSON.

  3. Fungsi memproses objek tersebut—dalam contoh ini, mengubah ukuran gambarnya menjadi 128×128 px dan menyimpannya ke direktori processed/ pada bucket yang sama.

Pilih jenis pemicu

Function Compute mendukung dua implementasi pemicu OSS:

Pemicu OSS NativePemicu OSS berbasis EventBridge
Maks. pemicu per bucket10Lebih dari 10 (direkomendasikan jika batas native terlampaui)
Filtering prefiks/sufiksPrefiks dan sufiks per pemicuBeberapa prefiks dan sufiks
Pencocokan fuzzy/regexTidak didukungTidak didukung
Paling cocok untukAlur kerja sederhana dengan satu eventVolume tinggi atau filtering multi-pola

Gunakan pemicu OSS native untuk kasus penggunaan sederhana. Jika Anda memerlukan lebih dari 10 pemicu pada satu bucket atau ingin melakukan filter berdasarkan beberapa prefiks dan sufiks, gunakan pemicu OSS berbasis EventBridge. Jika Anda memerlukan lebih dari 10 pemicu OSS, kami merekomendasikan membuat bucket baru dan menetapkan pemicu OSS berdasarkan bucket tersebut.

Batasan

  • Satu bucket mendukung maksimal 10 pemicu OSS native.

  • Prefiks objek tidak boleh dimulai dengan garis miring (/). Pemicu dengan prefiks yang diawali / tidak akan pernah aktif.

  • Pencocokan fuzzy dan pencocokan ekspresi reguler pada prefiks dan sufiks objek tidak didukung.

Prasyarat

Sebelum memulai, pastikan Anda telah memiliki:

Langkah 1: Buat pemicu OSS

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

  2. Di bilah navigasi atas, pilih wilayah. Di halaman Services, klik layanan target.

  3. Di halaman Functions, klik fungsi target.

  4. Di halaman detail fungsi, klik tab Triggers. Pilih versi atau alias dari daftar drop-down Version or Alias, lalu klik Create Trigger.

  5. Di panel Create Trigger, konfigurasikan parameter berikut dan klik OK.

    ParameterDeskripsiContoh
    Trigger typePilih OSS.OSS
    NameMasukkan nama untuk pemicu.oss-trigger
    Version or aliasPilih versi atau alias layanan. Nilai default-nya adalah LATEST. Lihat Kelola versi dan Kelola alias.LATEST
    Bucket namePilih bucket yang akan dipantau.testbucket
    Object prefixMasukkan prefiks nama objek yang akan dicocokkan. Konfigurasikan prefiks (dan sufiks) untuk menghindari loop pemicu tak hingga — jika fungsi menulis objek output yang sesuai dengan prefiks yang sama, fungsi tersebut akan memanggil dirinya sendiri secara rekursif. Prefiks tidak boleh dimulai dengan /. Jika Anda menentukan jenis event yang sama di beberapa pemicu pada bucket yang sama, setiap pemicu harus menggunakan prefiks atau sufiks yang berbeda. Lihat Aturan pemicu.source
    Object suffixMasukkan sufiks nama objek yang akan dicocokkan. Terapkan batasan keunikan yang sama seperti untuk prefiks. Lihat Aturan pemicu.png
    Trigger eventPilih satu atau beberapa jenis event OSS dari daftar drop-down. Lihat Event OSS.oss:ObjectCreated:PutObject, oss:ObjectCreated:PostObject, oss:ObjectCreated:CompleteMultipartUpload
    Role namePilih AliyunOSSEventNotificationRole. Jika ini adalah pemicu pertama Anda dengan jenis ini, klik Authorize Now saat diminta.AliyunOSSEventNotificationRole

Setelah pemicu dibuat, pemicu tersebut akan muncul di tab Triggers. Untuk mengubah atau menghapusnya, lihat Kelola pemicu.

Peringatan

Selalu konfigurasikan baik prefiks maupun sufiks. Jika fungsi membaca dari dan menulis kembali ke bucket yang sama dengan nama objek yang tumpang tindih, setiap penulisan akan memicu pemanggilan lain—menciptakan loop tak hingga. Dalam contoh ini, pemicu aktif pada objek dengan prefiks source/, dan fungsi menulis ke processed/, sehingga tidak ada tumpang tindih. Lihat Aturan pemicu.

Langkah 2: Konfigurasikan event uji

Sebelum menguji secara end-to-end, verifikasi bahwa kode fungsi bekerja dengan benar dengan memanggilnya menggunakan event yang dikonstruksi secara manual. Pendekatan ini memungkinkan Anda mengisolasi masalah kode dari masalah konfigurasi pemicu—jika fungsi gagal dengan event manual, masalahnya ada pada kode, bukan pada pengaturan pemicu. OSS meneruskan data event ke fungsi sebagai muatan JSON dalam parameter event.

  1. Di halaman detail fungsi, klik tab Code. Klik ikon drop-down icon di samping Test Function, lalu pilih Configure Test Parameters.

  2. Di panel Configure Test Parameters, pilih tab Create New Test Event atau Modify Existing Test Event. Masukkan Event Name dan tempel JSON event ke editor kode, lalu klik OK. Contoh berikut menunjukkan struktur event yang dikirim OSS saat objek dibuat:

    Field key dalam event harus mengarah ke objek yang benar-benar ada di bucket. Dalam contoh ini, objeknya adalah source/a.png. Jika objek tersebut tidak ada, fungsi akan gagal saat mencoba membacanya.
    FieldTipeContohDeskripsi
    eventNameStringObjectCreated:PutObjectJenis event.
    eventSourceStringacs:ossSumber event. Selalu acs:oss.
    eventTimeString2022-08-13T06:45:43.000ZWaktu terjadinya event, dalam format ISO 8601.
    eventVersionString1.0Versi protokol event.
    ossMapKonten event OSS.
    bucket.nameStringtestbucketNama bucket.
    bucket.arnStringacs:oss:cn-hangzhou:123456789:testbucketNama Sumber Daya Alibaba Cloud (ARN) bucket tersebut.
    bucket.ownerIdentityString164901546557****ID pengguna yang membuat bucket.
    object.sizeInt122539Ukuran objek, dalam byte.
    object.deltaSizeInt122539Perubahan ukuran objek, dalam byte. Untuk objek baru, nilai ini sama dengan ukuran objek. Untuk penimpaan, nilai ini adalah selisih antara ukuran objek baru dan lama.
    object.eTagString688A7BF4F233DC9C88A80BF985AB****ETag objek.
    object.keyStringsource/a.pngNama objek (kunci).
    ossSchemaVersionString1.0Versi skema OSS.
    ruleIdString9adac8e253828f4f7c0466d941fa3db81161****ID aturan pemicu yang cocok dengan event.
    regionStringcn-hangzhouWilayah tempat bucket berada.
    requestParameters.sourceIPAddressString140.205.XX.XXAlamat IP sumber permintaan.
    responseElements.requestIdString58F9FF2D3DF792092E12044CID permintaan.
    userIdentity.principalIdString164901546557****ID Akun Alibaba Cloud yang memulai permintaan.
    {
        "events": [
            {
                "eventName": "ObjectCreated:PutObject",
                "eventSource": "acs:oss",
                "eventTime": "2022-08-13T06:45:43.000Z",
                "eventVersion": "1.0",
                "oss": {
                    "bucket": {
                        "arn": "acs:oss:cn-hangzhou:123456789:testbucket",
                        "name": "testbucket",
                        "ownerIdentity": "164901546557****"
                    },
                    "object": {
                        "deltaSize": 122539,
                        "eTag": "688A7BF4F233DC9C88A80BF985AB****",
                        "key": "source/a.png",
                        "size": 122539
                    },
                    "ossSchemaVersion": "1.0",
                    "ruleId": "9adac8e253828f4f7c0466d941fa3db81161****"
                },
                "region": "cn-hangzhou",
                "requestParameters": {
                    "sourceIPAddress": "140.205.XX.XX"
                },
                "responseElements": {
                    "requestId": "58F9FF2D3DF792092E12044C"
                },
                "userIdentity": {
                    "principalId": "164901546557****"
                }
            }
        ]
    }

    Tabel berikut menjelaskan field-field event tersebut.

Langkah 3: Tulis dan uji kode fungsi

Tulis kode fungsi yang membaca objek yang dipicu, memprosesnya, dan menulis output ke direktori processed/.

Akses OSS menggunakan titik akhir internal (oss-{region}-internal.aliyuncs.com) untuk menghindari biaya transfer melalui internet publik. Lihat Wilayah dan titik akhir.

Ketiga contoh di bawah mengikuti pola yang sama: ekstrak nama bucket, wilayah, dan kunci objek dari event; inisialisasi klien OSS menggunakan kredensial dari context; lalu ubah ukuran gambar menjadi 128×128 px dan simpan ke path processed/.

Node.js

"use strict";

const OSS = require("ali-oss");

exports.handler = async function(event, context, callback) {
    const { accessKeyId, accessKeySecret, securityToken } = context.credentials;

    const events = JSON.parse(event.toString()).events;
    const objectName = events[0].oss.object.key;
    const region = events[0].region;
    const bucketName = events[0].oss.bucket.name;

    // Gunakan titik akhir internal untuk menghindari biaya transfer internet publik.
    const client = new OSS({
        region: region,
        accessKeyId: accessKeyId,
        accessKeySecret: accessKeySecret,
        stsToken: securityToken,
        bucket: bucketName,
        endpoint: "https://oss-" + region + "-internal.aliyuncs.com"
    });

    // Ganti prefiks "source/" dengan "processed/" untuk menentukan path output.
    const targetImage = objectName.replace("source/", "processed/");
    // Ubah ukuran menjadi 128x128 px tetap.
    const processStr = "image/resize,m_fixed,w_128,h_128";

    const result = await client.processObjectSave(
        objectName,
        targetImage,
        processStr,
        bucketName
    );
    console.log(result.res.status);

    callback(null, "done");
};

Python

# -*- coding: utf-8 -*-
import oss2, json
import base64

def handler(event, context):
    # Ambil kredensial temporary dari konteks eksekusi fungsi.
    creds = context.credentials
    auth = oss2.StsAuth(
        creds.access_key_id,
        creds.access_key_secret,
        creds.security_token)

    oss_raw_data = json.loads(event)
    oss_info_map = oss_raw_data['events'][0]['oss']
    bucket_name = oss_info_map['bucket']['name']
    # Gunakan titik akhir internal untuk menghindari biaya transfer internet publik.
    endpoint = 'oss-' + oss_raw_data['events'][0]['region'] + '-internal.aliyuncs.com'
    bucket = oss2.Bucket(auth, endpoint, bucket_name)
    object_name = oss_info_map['object']['key']

    remote_stream = bucket.get_object(object_name)
    if not remote_stream:
        print(f'{object_name} does not exist in bucket {bucket_name}')
        return

    # Ganti prefiks "source/" dengan "processed/" untuk menentukan path output.
    processed_path = object_name.replace('source/', 'processed/')
    # Ubah ukuran menjadi 128x128 px tetap.
    style = 'image/resize,m_fixed,w_128,h_128'
    process = "{0}|sys/saveas,o_{1},b_{2}".format(
        style,
        oss2.compat.to_string(base64.urlsafe_b64encode(oss2.compat.to_bytes(processed_path))),
        oss2.compat.to_string(base64.urlsafe_b64encode(oss2.compat.to_bytes(bucket_name))))
    result = bucket.process_object(object_name, process)
    print(result)

PHP

<?php

use RingCentral\Psr7\Response;
use OSS\OssClient;
use OSS\Core\OssException;

function base64url_encode($data)
{
    return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
}

function handler($event, $context) {
    $event = json_decode($event, $assoc = true);

    // Ambil kredensial temporary dari konteks eksekusi fungsi.
    $accessKeyId     = $context["credentials"]["accessKeyId"];
    $accessKeySecret = $context["credentials"]["accessKeySecret"];
    $securityToken   = $context["credentials"]["securityToken"];

    $evt        = $event['events'][0];
    $bucketName = $evt['oss']['bucket']['name'];
    // Gunakan titik akhir internal untuk menghindari biaya transfer internet publik.
    $endpoint   = 'oss-' . $evt['region'] . '-internal.aliyuncs.com';
    $objectName = $evt['oss']['object']['key'];
    // Ganti prefiks "source/" dengan "processed/" untuk menentukan path output.
    $targetObject = str_replace("source/", "processed/", $objectName);

    try {
        $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint, false, $securityToken);
        // Ubah ukuran menjadi 128x128 px tetap.
        $style = "image/resize,m_fixed,w_128,h_128";
        $process = $style .
            '|sys/saveas' .
            ',o_' . base64url_encode($targetObject) .
            ',b_' . base64url_encode($bucketName);
        $result = $ossClient->processObject($bucketName, $objectName, $process);
        print($result);
    } catch (OssException $e) {
        print_r(__FUNCTION__ . ": FAILED\n");
        printf($e->getMessage() . "\n");
    }

    print(__FUNCTION__ . ": OK" . "\n");

    return $targetObject;
}

Setelah men-deploy kode, klik Test Function di tab Code untuk memanggilnya dengan event uji yang telah Anda konfigurasikan. Periksa output di tab Code untuk memastikan fungsi berjalan sukses dan gambar yang telah diubah ukurannya muncul di direktori processed/ bucket Anda.

FAQ

Apa yang harus saya lakukan jika pemicu tidak memanggil fungsi saya? Lihat Apa yang harus saya lakukan jika pemicu tidak dapat memicu eksekusi fungsi?

Fungsi saya dipanggil beberapa kali untuk satu unggahan. Apa yang terjadi? Lihat Apa yang harus saya lakukan jika fungsi dipicu beberapa kali saat objek diunggah ke OSS?

Bagaimana cara menangani lonjakan tiba-tiba dalam jumlah pemanggilan? Lihat Bagaimana memastikan respons normal fungsi terhadap sejumlah besar pemanggilan?

Langkah selanjutnya

Referensi