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
Sebuah objek diunggah ke bucket OSS (misalnya,
source/a.png).OSS mendeteksi event tersebut dan memanggil fungsi Function Compute yang terkait, dengan meneruskan muatan event dalam format JSON.
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 Native | Pemicu OSS berbasis EventBridge | |
|---|---|---|
| Maks. pemicu per bucket | 10 | Lebih dari 10 (direkomendasikan jika batas native terlampaui) |
| Filtering prefiks/sufiks | Prefiks dan sufiks per pemicu | Beberapa prefiks dan sufiks |
| Pencocokan fuzzy/regex | Tidak didukung | Tidak didukung |
| Paling cocok untuk | Alur kerja sederhana dengan satu event | Volume 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:
Layanan Function Compute dengan peran layanan yang memiliki izin
AliyunOSSFullAccess. Contoh dalam panduan ini menggunakanAliyunFCDefaultRole. Untuk instruksi penyiapan, lihat Berikan izin Function Compute untuk mengakses layanan Alibaba Cloud lainnya.Fungsi dalam layanan tersebut. Lihat Buat fungsi.
Bucket OSS. Lihat Buat bucket.
Langkah 1: Buat pemicu OSS
Masuk ke Konsol Function Compute. Di panel navigasi kiri, klik Services & Functions.
Di bilah navigasi atas, pilih wilayah. Di halaman Services, klik layanan target.
Di halaman Functions, klik fungsi target.
Di halaman detail fungsi, klik tab Triggers. Pilih versi atau alias dari daftar drop-down Version or Alias, lalu klik Create Trigger.
Di panel Create Trigger, konfigurasikan parameter berikut dan klik OK.
Parameter Deskripsi Contoh Trigger type Pilih OSS. OSS Name Masukkan nama untuk pemicu. oss-trigger Version or alias Pilih versi atau alias layanan. Nilai default-nya adalah LATEST. Lihat Kelola versi dan Kelola alias. LATEST Bucket name Pilih bucket yang akan dipantau. testbucket Object prefix Masukkan 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 suffix Masukkan sufiks nama objek yang akan dicocokkan. Terapkan batasan keunikan yang sama seperti untuk prefiks. Lihat Aturan pemicu. png Trigger event Pilih satu atau beberapa jenis event OSS dari daftar drop-down. Lihat Event OSS. oss:ObjectCreated:PutObject,oss:ObjectCreated:PostObject,oss:ObjectCreated:CompleteMultipartUploadRole name Pilih 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.
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.
Di halaman detail fungsi, klik tab Code. Klik ikon
di samping Test Function, lalu pilih Configure Test Parameters.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
keydalam event harus mengarah ke objek yang benar-benar ada di bucket. Dalam contoh ini, objeknya adalahsource/a.png. Jika objek tersebut tidak ada, fungsi akan gagal saat mencoba membacanya.Field Tipe Contoh Deskripsi eventName String ObjectCreated:PutObject Jenis event. eventSource String acs:oss Sumber event. Selalu acs:oss.eventTime String 2022-08-13T06:45:43.000Z Waktu terjadinya event, dalam format ISO 8601. eventVersion String 1.0 Versi protokol event. oss Map — Konten event OSS. bucket.name String testbucket Nama bucket. bucket.arn String acs:oss:cn-hangzhou:123456789:testbucket Nama Sumber Daya Alibaba Cloud (ARN) bucket tersebut. bucket.ownerIdentity String 164901546557**** ID pengguna yang membuat bucket. object.size Int 122539 Ukuran objek, dalam byte. object.deltaSize Int 122539 Perubahan 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.eTag String 688A7BF4F233DC9C88A80BF985AB**** ETag objek. object.key String source/a.png Nama objek (kunci). ossSchemaVersion String 1.0 Versi skema OSS. ruleId String 9adac8e253828f4f7c0466d941fa3db81161**** ID aturan pemicu yang cocok dengan event. region String cn-hangzhou Wilayah tempat bucket berada. requestParameters.sourceIPAddress String 140.205.XX.XX Alamat IP sumber permintaan. responseElements.requestId String 58F9FF2D3DF792092E12044C ID permintaan. userIdentity.principalId String 164901546557**** 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
Tinjau daftar lengkap jenis event OSS yang dapat dikonfigurasi: Ikhtisar pemicu event OSS
Kelola pemicu Anda setelah dibuat: Ubah konfigurasi pemicu
Konfigurasikan pemicu menggunakan Serverless Devs: Perintah terkait pemicu
Konfigurasikan pemicu menggunakan SDK: SDK
Skalakan melebihi 10 pemicu: Konfigurasikan pemicu OSS berbasis EventBridge
Debug masalah pemanggilan dengan log: Catatan log
Orkestrasikan fungsi: Apakah fungsi bisa saling memanggil? dan Konfigurasikan tujuan untuk pemanggilan asinkron