Anda dapat membuat dan mengonfigurasi pemicu OSS native di konsol Function Compute. Ketika event tertentu terjadi di OSS, pemicu tersebut secara otomatis memanggil fungsi Anda, sehingga memungkinkan Anda merespons event seperti unggahan file dengan mudah dan langsung menerapkan alur kerja lengkap tanpa perlu menambahkan logika pendengar event ke dalam kode.
Contoh skenario
Anda dapat mengonfigurasi pemicu OSS dengan menetapkan prefiks objek menjadi source. Ketika gambar diunggah ke direktori source di bucket OSS yang ditentukan, pemicu tersebut secara otomatis memanggil fungsi. Fungsi tersebut mengubah ukuran gambar dan menyimpannya ke direktori processed di bucket yang sama. Misalnya, fungsi memproses source/a.png dan menyimpan hasilnya sebagai processed/a.png.
Prasyarat
-
Function Compute
-
Object Storage Service (OSS)
Batasan
-
Satu bucket dapat memiliki maksimal 10 pemicu OSS native.
CatatanJika Anda perlu mengaitkan lebih banyak pemicu OSS ke suatu bucket, Anda dapat membuat pemicu OSS berbasis EventBridge. Namun, kami tidak menyarankan mengaitkan lebih dari 10 pemicu ke satu bucket. Jika diperlukan lebih banyak, pertimbangkan untuk membuat bucket baru dan mengonfigurasi pemicu untuk bucket tersebut.
-
Pemicu OSS native dan pemicu OSS berbasis EventBridge tidak mendukung pencocokan wildcard atau ekspresi reguler untuk prefiks dan sufiks objek.
-
Pemicu OSS native hanya mendukung satu prefiks objek dan satu sufiks objek. Untuk mengonfigurasi beberapa prefiks atau sufiks, gunakan pemicu OSS berbasis EventBridge.
Langkah 1: Buat pemicu OSS
Masuk ke konsol Function Compute. Di panel navigasi sebelah kiri, pilih .
Di bilah navigasi atas, pilih wilayah. Di halaman Functions, klik fungsi target.
-
Di halaman detail fungsi, pilih tab Trigger dan klik Create Trigger. Di panel Create Trigger, konfigurasikan parameter dan klik OK.
Parameter
Tindakan
Contoh
Trigger Type
Pilih OSS.
OSS
Name
Masukkan nama kustom untuk pemicu.
oss-trigger
Version or Alias
Nilai default adalah LATEST. Jika Anda ingin membuat pemicu untuk versi atau alias yang berbeda, Anda harus terlebih dahulu memilihnya 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.
testbucket
Object Prefix
Masukkan prefiks nama objek yang akan dicocokkan. Kami merekomendasikan agar Anda menentukan baik prefiks maupun sufiks objek untuk mencegah pemanggilan pemicu secara rekursif yang dapat menyebabkan biaya tambahan. Selain itu, jika pemicu berbeda dalam bucket yang sama menggunakan jenis event yang sama, prefiks dan sufiksnya tidak boleh identik. Untuk informasi selengkapnya, lihat Triggering rules for OSS triggers.
PentingPrefiks objek tidak boleh diawali dengan garis miring (
/). Jika tidak, pemicu tidak dapat dipanggil.source
Object Suffix
Masukkan sufiks nama objek yang akan dicocokkan. Kami sangat menyarankan agar Anda menentukan baik prefiks maupun sufiks untuk mencegah pemanggilan pemicu secara rekursif yang dapat menyebabkan biaya tambahan. Selain itu, jika pemicu berbeda dalam bucket yang sama menggunakan jenis event yang sama, prefiks dan sufiksnya tidak boleh identik. Untuk informasi selengkapnya, lihat Triggering rules for OSS triggers.
png
Trigger Event
Pilih satu atau beberapa event pemicu. Untuk informasi selengkapnya tentang jenis event untuk OSS, lihat OSS event definitions.
Contoh ini menggunakan oss:ObjectCreated:PutObject.
oss:ObjectCreated:PutObject,oss:ObjectCreated:PostObject,oss:ObjectCreated:CompleteMultipartUpload,oss:ObjectCreated:PutSymlinkRole Name
Pilih AliyunOSSEventNotificationRole.
CatatanJika ini pertama kalinya Anda membuat pemicu jenis ini, klik Authorize Now di kotak dialog yang muncul setelah Anda mengklik OK.
AliyunOSSEventNotificationRole
Setelah pemicu dibuat, pemicu tersebut akan muncul di daftar Trigger Name. Untuk memodifikasi atau menghapus pemicu, lihat Manage triggers.
Langkah 2: (Opsional) Konfigurasikan parameter input fungsi
Sumber event OSS meneruskan data ke fungsi Anda sebagai objek event. Anda dapat mengurai dan memproses objek ini dalam kode Anda. Anda juga dapat secara manual meneruskan contoh event ke fungsi untuk mensimulasikan pemicu dan menguji kode Anda.
Di tab Code halaman detail fungsi, klik ikon
di samping Test Function dan pilih Configure Test Parameters dari daftar drop-down.-
Di panel Configure Test Parameters, pilih tab Create New Test Event atau Modify Existing Test Event. Masukkan nama event dan konten event, lalu klik OK.
CatatanKonfigurasikan konten event berdasarkan informasi yang Anda berikan saat membuat pemicu. Pastikan objek yang ditentukan, yaitu
source/a.pngdalam contoh ini, ada di bucket. Jika tidak, fungsi tidak akan dipanggil atau pemanggilannya akan gagal.Event tersebut merupakan parameter input untuk fungsi Function Compute. Ketika objek dibuat atau dihapus di bucket OSS yang ditentukan, OSS mengirim data event ke fungsi yang terikat dalam format JSON. Berikut ini contohnya:
{ "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", "objectMeta": { "mimeType": "application/zip", "userMeta": { "x-oss-meta-last-modified":"20250213" } }, "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 parameter dalam objek event.
Parameter
Type
Nilai
Deskripsi
eventName
String
ObjectCreated:PutObject
Jenis event.
eventSource
String
acs:oss
Sumber event. Nilainya tetap
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
Berisi detail event OSS.
bucket
Map
Nilai parameter bucket.
name
String
testbucket
Nama bucket.
arn
String
acs:oss:cn-hangzhou:123456789:testbucket
Pengidentifikasi unik bucket.
ownerIdentity
String
164901546557****
ID pengguna yang membuat bucket.
object
Map
Konten parameter object.
size
Int
122539
Ukuran object. Satuan: Byte.
deltaSize
Int
122539
Perubahan ukuran object. Satuan: Byte.
-
Jika objek baru ditambahkan, nilai ini adalah ukuran objek.
-
Jika objek yang sudah ada ditimpa dengan objek bernama sama, nilai ini adalah selisih ukuran antara objek baru dan lama.
eTag
String
688A7BF4F233DC9C88A80BF985AB****
ETag objek.
key
String
source/a.png
Jalur lengkap objek.
objectMeta
Map
Konten parameter objectMeta.
mimeType
String
application/zip
Jenis file objek. Untuk informasi selengkapnya, lihat mimeType.
userMeta
Map
Metadata pengguna yang mengidentifikasi tujuan atau atribut objek.
x-oss-meta-last-modified
String
20250213
Metadata pengguna terdiri dari pasangan kunci-nilai. Kunci metadata harus diawali dengan
x-oss-meta-. Misalnya, pasangan"x-oss-meta-last-modified":"20250213"menunjukkan bahwa file lokal terakhir dimodifikasi pada 13 Februari 2025. Untuk informasi selengkapnya, lihat User metadata.ossSchemaVersion
String
1.0
Versi skema OSS.
ruleId
String
9adac8e253828f4f7c0466d941fa3db81161****
ID aturan pemicu yang cocok dengan event tersebut.
region
String
cn-hangzhou
Wilayah bucket.
requestParameters
Map
Parameter permintaan.
sourceIPAddress
String
140.205.XX.XX
Alamat IP sumber permintaan.
responseElements
Map
Elemen respons.
requestId
String
58F9FF2D3DF792092E12044C
ID permintaan.
userIdentity
Map
Identitas pengguna yang melakukan permintaan.
principalId
String
164901546557****
ID Akun Alibaba Cloud yang menginisiasi permintaan.
-
Langkah 3: Tulis dan uji kode fungsi
Setelah membuat pemicu OSS, Anda dapat menulis dan menguji kode fungsi untuk memverifikasi bahwa fungsinya bekerja dengan benar. Dalam skenario dunia nyata, pemicu secara otomatis memanggil fungsi ketika event OSS yang ditentukan terjadi.
Anda harus mencegah pemanggilan rekursif dalam kode Anda. Skenario rekursif umum terjadi ketika fungsi dipicu oleh unggahan objek ke bucket OSS. Setelah fungsi dijalankan, fungsi tersebut menghasilkan satu atau beberapa objek baru dan menuliskannya kembali ke bucket yang sama. Operasi penulisan ini memicu fungsi lagi, sehingga menciptakan loop tak terbatas. Untuk informasi selengkapnya, lihat Triggering rules for OSS triggers.
-
Di tab Code halaman detail fungsi, masukkan kode Anda di editor dan klik Deploy.
-
Kode contoh berikut ini untuk waktu proses yang mendukung pengeditan daring.
CatatanKami merekomendasikan agar Anda menggunakan titik akhir internal OSS untuk membaca dan menulis data ke bucket OSS dalam fungsi Anda. Jika Anda menggunakan titik akhir publik, Anda akan dikenai biaya transfer data internet. Untuk informasi selengkapnya tentang titik akhir internal, lihat Regions and endpoints.
"use strict"; /* Kode contoh ini menunjukkan cara melakukan operasi berikut: * 1. Mengurai informasi event OSS dari event. * 2. Menginisialisasi klien OSS berdasarkan informasi yang diurai. * 3. Mengubah ukuran gambar sumber dan menyimpannya ke direktori tujuan di bucket yang sama. */ const OSS = require("ali-oss"); exports.handler = async function(event, context, callback) { console.log("The content in context entity is: \n"); console.dir(context); const {accessKeyId, accessKeySecret, securityToken} = context.credentials; const events = JSON.parse(event.toString()).events; console.log("The content in event entity is: \n"); console.dir(events); let objectName = events[0].oss.object.key; let region = events[0].region; let bucketName = events[0].oss.bucket.name; // Menghubungkan ke bucket OSS target. const client = new OSS({ region: region, accessKeyId: accessKeyId, accessKeySecret: accessKeySecret, stsToken: securityToken, bucket: bucketName, endpoint: "https://oss-" + region + "-internal.aliyuncs.com" }); console.log("The client entity is: \n"); console.dir(events); const targetImage = objectName.replace("source/", "processed/") // Mengubah ukuran gambar menjadi lebar dan tinggi tetap 128 px. const processStr = "image/resize,m_fixed,w_128,h_128" // Mengubah ukuran gambar sumber dan menyimpan gambar yang diproses ke jalur tujuan. const result = await client.processObjectSave( objectName, targetImage, processStr, bucketName ); console.log(result.res.status); callback(null, "done"); }""" Kode contoh ini menunjukkan cara melakukan operasi berikut: * Mendapatkan informasi terkait pemrosesan OSS dari event. * Menginisialisasi klien OSS dengan bucket target. * Mengubah ukuran gambar sumber dan menyimpannya ke direktori tujuan. """ # -*- coding: utf-8 -*- import oss2, json import base64 def handler(event, context): # Mendapatkan informasi kunci dari context.credentials. print("The content in context entity is: \n") print(context) creds = context.credentials # Mengonfigurasi autentikasi untuk SDK OSS. auth = oss2.StsAuth( creds.access_key_id, creds.access_key_secret, creds.security_token) print("The content in event entity is: \n") print(event) # Memuat konten event. oss_raw_data = json.loads(event) # Mendapatkan parameter event OSS yang diteruskan oleh pemicu OSS. oss_info_map = oss_raw_data['events'][0]['oss'] # Mendapatkan nama bucket OSS. bucket_name = oss_info_map['bucket']['name'] # Menetapkan titik akhir OSS. endpoint = 'oss-' + oss_raw_data['events'][0]['region'] + '-internal.aliyuncs.com' # Menginisialisasi klien OSS. bucket = oss2.Bucket(auth, endpoint, bucket_name) object_name = oss_info_map['object']['key'] # Mengunduh gambar asli dari bucket OSS. remote_stream = bucket.get_object(object_name) if not remote_stream: print(f'{object_name} does not exist in bucket {bucket_name}') return # Gambar yang diproses disimpan ke direktori processed/. processed_path = object_name.replace('source/', 'processed/') # Mengubah ukuran gambar menjadi lebar dan tinggi tetap 128 px. style = 'image/resize,m_fixed,w_128,h_128' # Menentukan nama gambar yang diproses. Jika gambar tidak berada di direktori root bucket, Anda harus menentukan jalur lengkap gambar tersebut. Contoh: exampledir/example.jpg. 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)/* *Kode contoh ini menunjukkan cara melakukan operasi berikut: * 1. Mengurai titik akhir, bucket, dan objek dari event. * 2. Menginisialisasi klien OSS berdasarkan informasi yang diurai. * 3. Mengubah ukuran gambar sumber dan menyimpan gambar yang diproses ke direktori tujuan di bucket yang sama. */ <?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); /* Pasangan AccessKey dari akun Alibaba Cloud memiliki izin atas semua operasi API. Kami menyarankan agar Anda menggunakan pengguna RAM untuk memanggil operasi API atau melakukan O&M rutin. Jangan hard-code ID AccessKey dan rahasia AccessKey di kode proyek Anda. Jika tidak, pasangan AccessKey dapat bocor, yang membahayakan keamanan semua sumber daya di akun Anda. Contoh ini menunjukkan cara mendapatkan pasangan AccessKey dari konteks. */ $accessKeyId = $context["credentials"]["accessKeyId"]; $accessKeySecret = $context["credentials"]["accessKeySecret"]; $securityToken = $context["credentials"]["securityToken"]; $evt = $event['events']{0}; $bucketName = $evt['oss']['bucket']['name']; $endpoint = 'oss-' . $evt['region'] . '-internal.aliyuncs.com'; $objectName = $evt['oss']['object']['key']; $targetObject = str_replace("source/", "processed/", $objectName); try { // Menghubungkan ke OSS. $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint, false, $securityToken); // Mengubah ukuran gambar menjadi lebar dan tinggi tetap 128 px. $style = "image/resize,m_fixed,w_128,h_128"; $process = $style. '|sys/saveas'. ',o_'.base64url_encode($targetObject). ',b_'.base64url_encode($bucketName); // Mengubah ukuran gambar dan menyimpannya ke objek tujuan. $result = $ossClient->processObject($bucketName, $objectName, $process); // Mencetak hasil pemrosesan. print($result); } catch (OssException $e) { print_r(__FUNCTION__ . ": FAILED\n"); printf($e->getMessage() . "\n"); } print(__FUNCTION__ . ": OK" . "\n"); return $targetObject; }
-
-
Uji fungsi.
Metode 1: Jika Anda mengonfigurasi parameter input
eventuntuk mensimulasikan sumber event, klik Test Function.Metode 2: Di halaman , klik Bucket Name untuk menuju bucket yang sesuai. Unggah gambar yang sesuai dengan prefiks dan sufiks objek yang ditentukan. Setelah fungsi dijalankan, Anda dapat melihat log eksekusi di tab Logs dan memeriksa hasilnya di folder tujuan bucket.
FAQ
Referensi
-
Untuk mempelajari jenis event OSS yang dapat Anda konfigurasi, lihat OSS event definitions.
-
Untuk memodifikasi atau menghapus pemicu, lihat Update a trigger.
-
Jika Anda perlu mengaitkan lebih dari 10 pemicu OSS ke suatu bucket, lihat Configure an EventBridge-based OSS trigger.
-
Isu terkait pemicu:
-
Untuk memeriksa event mana yang memanggil fungsi Anda, Anda dapat mencatat jenis event di kode Anda. 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 destinasi untuk menangani hasil pemanggilan tersebut. Untuk informasi selengkapnya, lihat Can functions invoke each other? dan Configure a destination for an asynchronous invocation.
-