Untuk menetapkan beberapa awalan dan akhiran file pada pemicu OSS atau mengaitkan lebih dari 10 pemicu ke satu bucket OSS, Anda dapat membuat pemicu OSS berbasis EventBridge guna menangani event seperti unggahan file.
Catatan penting
Pemicu OSS berbasis EventBridge berbeda dari pemicu OSS native. Perhatikan poin-poin berikut:
Pemicu OSS native mendukung hingga 10 pemicu per bucket. Jika Anda memerlukan lebih dari 10 pemicu OSS dalam satu bucket, gunakan pemicu OSS berbasis EventBridge.
CatatanSecara umum, hindari mengaitkan lebih dari 10 pemicu ke satu bucket. Jika diperlukan lebih banyak pemicu, buat bucket baru dan konfigurasikan pemicu tersebut untuk bucket tersebut.
Pemicu OSS berbasis EventBridge mengikuti batas resource yang sama seperti EventBridge. Anda dapat membuat hingga 50 pemicu OSS berbasis EventBridge. Untuk informasi selengkapnya, lihat Batas.
Pemicu OSS berbasis EventBridge tidak memerlukan keunikan semantik. Kombinasi event type, file prefix, dan file suffix tidak perlu unik.
Pemicu OSS berbasis EventBridge mendukung beberapa file prefixes dan file suffixes. Namun, file prefixes dan file suffixes tidak mendukung pencocokan kabur (fuzzy matching) atau pencocokan ekspresi reguler.
Setelah Anda membuat pemicu OSS berbasis EventBridge, pemicu tersebut membutuhkan waktu sekitar 30 detik untuk menjadi aktif. Operasi Object Storage Service (OSS) hanya dapat memicu fungsi setelah pemicu aktif.
Contoh skenario
Contoh ini menunjukkan cara mengonfigurasi pemicu OSS dengan 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 yang ditentukan, fungsi akan dieksekusi secara otomatis. Setelah fungsi dieksekusi, file yang didekompresi disimpan ke direktori lain dalam bucket yang sama.
Prasyarat
EventBridge
Function Compute
Object Storage Service (OSS)
Langkah 1: Buat pemicu OSS berbasis EventBridge
Masuk ke Konsol Function Compute. Di panel navigasi sebelah kiri, klik Services & Functions.
Di bilah navigasi atas, pilih wilayah. Pada halaman Services, klik layanan yang diinginkan.
- Pada halaman Functions, klik fungsi yang ingin Anda kelola.
- 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, atur Trigger Type ke Object Storage Service (OSS) di bawah Cloud Service Event Trigger. Konfigurasikan pengaturan lainnya dan klik OK.
Item konfigurasi
Aksi
Contoh dalam topik ini
Name
Masukkan nama pemicu kustom.
oss-trigger
Version or Alias
Nilai default adalah LATEST. Untuk membuat pemicu untuk versi atau alias lain, pilih terlebih dahulu dari daftar drop-down Version or Alias di halaman detail fungsi. Untuk informasi selengkapnya tentang versi dan alias, lihat Kelola versi dan Kelola alias.
LATEST
Bucket name
Pilih bucket OSS yang dibuat di wilayah saat ini.
bucket-zh****
File prefix
Masukkan awalan nama file yang akan dicocokkan. Function Compute merekomendasikan mengonfigurasi awalan dan akhiran sekaligus untuk menghindari loop bersarang yang menyebabkan biaya tambahan.
Untuk menambahkan beberapa file prefixes, klik + Add File Prefix di konsol.
PentingAwalan file tidak boleh dimulai dengan
/. Jika tidak, pemicu OSS tidak akan aktif.source
test
File suffix
Masukkan akhiran nama file yang akan dicocokkan. Function Compute merekomendasikan mengonfigurasi awalan dan akhiran sekaligus untuk menghindari loop bersarang yang menyebabkan biaya tambahan.
Untuk menambahkan beberapa file suffixes, klik + Add File Suffix di konsol.
png
Event type
Pilih satu atau beberapa event pemicu. Untuk tipe event Object Storage Service (OSS), lihat Definisi Event OSS.
oss:ObjectCreated:PutObject,oss:ObjectCreated:PostObject,oss:ObjectCreated:CompleteMultipartUploadEvent pattern
Field ini terisi otomatis setelah Anda mengonfigurasi file prefix, file suffix, dan triggering event.
PentingJangan mengubah event pattern kecuali diperlukan. Perubahan yang salah dapat menyebabkan pemicu gagal. Pahami aturan pola event sebelum melakukan perubahan. Untuk informasi selengkapnya, lihat Pola event.
{ "source":[ "acs.oss" ] }Invocation method
Pilih metode pemanggilan fungsi. Nilai default adalah panggilan sinkron.
Synchronous call: Event memicu fungsi dan menunggu hasilnya. Metode ini cocok untuk sebagian besar skenario. Untuk informasi selengkapnya, lihat Pemanggilan sinkron.
Asynchronous call: Event memicu fungsi dan langsung mengembalikan respons. Function Compute memastikan fungsi dieksekusi setidaknya sekali tetapi tidak mengembalikan hasilnya. Gunakan metode ini untuk fungsi dengan penundaan lama. Untuk informasi selengkapnya, lihat Ikhtisar.
Synchronous call
Trigger status
Pilih apakah akan mengaktifkan pemicu segera setelah dibuat. Secara default, Enable trigger dipilih.
Enable trigger
Payload format
Tentukan format data parameter input fungsi. Data dilewatkan melalui parameter Event fungsi.
CloudEvents: Format standar untuk mendeskripsikan data event. Format ini mencakup metadata event dan muatan (payload) untuk menyederhanakan deklarasi dan transmisi event lintas layanan dan platform.
RawData: Hanya mengirimkan muatan event tanpa metadata CloudEvents.
CatatanFormat payload berbeda antara pemicu OSS native dan pemicu OSS berbasis EventBridge. Pemicu OSS native mendukung templat OSSEvents, yaitu format event yang dihasilkan oleh Alibaba Cloud Object Storage Service (OSS).
CloudEvents
Setelah pemicu dibuat, pemicu tersebut ditampilkan di tab Triggers. Untuk mengubah atau menghapus pemicu yang sudah ada, lihat Kelola pemicu.
Langkah 2: Konfigurasikan parameter input fungsi
Pemicu OSS berbasis EventBridge meneruskan data event ke fungsi menggunakan templat CloudEvents. Anda dapat secara manual meneruskan event ke fungsi untuk mensimulasikan event pemicu.
Di halaman detail fungsi, klik tab Function Code. Lalu, klik ikon
di sebelah kanan Test Function, dan pilih Configure Test Parameters dari daftar drop-down.Di panel Configure Test Parameters, pilih tab Create New Test Event atau tab Edit Existing Test Event. Masukkan event name dan konten event. Lalu klik OK.
Event tersebut merupakan parameter input untuk Function Compute. Saat event tertentu terjadi di bucket OSS, data event dikirim ke fungsi yang terikat dalam format JSON. Formatnya sebagai berikut:
{ "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 field-field dalam parameter event.
Parameter
Type
Nilai contoh
Deskripsi
datacontenttype
String
application/json;charset=utf-8
Tipe konten dari parameter data. datacontenttype hanya mendukung application/json;charset=utf-8.
aliyunaccountid
String
143199913****
ID akun Alibaba Cloud. Anda dapat menemukan ID akun Alibaba Cloud Anda di bagian General Information pada halaman Overview di Konsol Function Compute.
data
{}
Konten event OSS sebagai objek JSON. CloudEvents membungkus konteks yang ditentukan OSS dalam field data.
subject
String
acs:oss:cn-hangzhou:143199913****:bucket-zh****/source/a.png
Subjek event.
Format:
acs:oss:<region>:<your_account_id>:<your_bucket>. Ganti<region>dengan wilayah yang dipilih saat membuat fungsi,<your_account_id>dengan ID akun Alibaba Cloud Anda, dan<your_bucket>dengan nama bucket aktual di wilayah yang sama.aliyunoriginalaccountid
String
143199913****
ID akun Alibaba Cloud.
source
String
acs.oss
Sumber event. Untuk pemicu OSS, nilai ini selalu
acs.oss.type
String
oss:ObjectCreated:PutObject
Tipe 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 server yang menerima event.
Perbarui field-field berikut di bagian data parameter event sesuai konfigurasi Anda.
userIdentity.principalId: Ganti dengan ID akun Alibaba Cloud Anda.region: Ganti dengan wilayah yang Anda pilih saat membuat fungsi.oss.bucket.name: Ganti dengan nama bucket di wilayah yang sama.oss.bucket.arn: Formatnya adalahacs:oss:<region>:<your_account_id>:<your_bucket>. Ganti<region>dengan wilayah yang Anda pilih saat membuat fungsi,<your_account_id>dengan ID akun Alibaba Cloud Anda, dan<your_bucket>dengan nama bucket di wilayah yang sama.oss.bucket.ownerIdentity: Ganti dengan ID akun Alibaba Cloud Anda.object.key: Ganti dengan file aktual yang diunggah ke bucket target.CatatanPastikan file yang ditentukan ada di bucket yang dikonfigurasi. Dalam contoh ini, file tersebut adalah source/a.png. Jika tidak, fungsi tidak akan dipicu atau gagal dieksekusi.
Langkah 3: Tulis dan uji kode fungsi
Setelah Anda membuat pemicu OSS, Anda dapat menulis dan menguji kode fungsi untuk memverifikasi kebenarannya. Fungsi akan dieksekusi secara otomatis ketika event OSS terjadi.
Untuk mencegah biaya yang tidak perlu, hindari pemicu melingkar (circular triggers) dalam kode Anda. Skenario pemicu melingkar yang umum terjadi ketika unggahan file ke bucket OSS memicu fungsi, dan fungsi tersebut kemudian menulis satu atau beberapa file kembali ke bucket yang sama. Tindakan ini memicu fungsi lagi dan menciptakan loop. Untuk informasi selengkapnya, lihat Aturan pemicu OSS.
Di halaman detail fungsi, klik tab Code. Tulis kode Anda di editor, lalu klik Deploy Code.
Bagian berikut menjelaskan persiapan dan memberikan contoh kode.
CatatanJika fungsi Anda perlu membaca data dari atau menulis data ke resource OSS, kami merekomendasikan menggunakan titik akhir internal OSS untuk menghindari biaya jaringan publik. Untuk informasi selengkapnya tentang format titik akhir internal OSS, lihat Wilayah dan titik akhir.
/* Persiapan: 1. Jalankan perintah berikut di terminal Anda untuk menginstal package.json dan modul pemrosesan gambar jimp. a. Jalankan npm init untuk membuat 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 menggunakan awalan "oss-", misalnya, "oss-cn-shanghai". var ossRegion = "oss-" + ossEvent.region; // Buat klien OSS. var client = new oss({ region: ossRegion, /* AccessKey akun Alibaba Cloud memberikan akses API penuh. Kami merekomendasikan menggunakan Pengguna RAM untuk panggilan API atau O&M rutin. Jangan simpan ID AccessKey dan Rahasia AccessKey Anda di kode. Hal ini dapat menyebabkan kebocoran AccessKey dan membahayakan semua resource di bawah akun Anda. Contoh ini mengambil AccessKeyId dan AccessKeySecret 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); // Simpan gambar yang diproses di 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 buffer. 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 sementara. image.resize(128, 128).write(tmpFile, function (err) { if (err) { console.error("Failed to write image locally"); callback(err); return; } // Unggah gambar yang telah diproses ke OSS dengan nama baru. 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 dilampirkan ke layanan fungsi memiliki izin akses OSS. Masuk ke konsol RAM untuk memberikan izin OSS ke peran tersebut. # 2. Pastikan penanganan 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 # AccessKey akun Alibaba Cloud memberikan akses API penuh. Kami merekomendasikan menggunakan Pengguna RAM untuk panggilan API atau O&M rutin. # Jangan simpan ID AccessKey dan Rahasia AccessKey Anda di kode. Hal ini dapat menyebabkan kebocoran AccessKey dan membahayakan semua resource di bawah akun Anda. # Contoh ini mengambil AccessKeyId dan AccessKeySecret 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 dilampirkan ke layanan fungsi memiliki izin akses OSS. Masuk ke konsol RAM untuk memberikan izin OSS ke peran tersebut. 2. Pastikan penanganan fungsi adalah index.handler. */ <?php use OSS\OssClient; function handler($event, $context) { $event = json_decode($event, $assoc = true); /* AccessKey akun Alibaba Cloud memberikan akses API penuh. Kami merekomendasikan menggunakan Pengguna RAM untuk panggilan API atau O&M rutin. Jangan simpan ID AccessKey dan Rahasia AccessKey Anda di kode. Hal ini dapat menyebabkan kebocoran AccessKey dan membahayakan semua resource di bawah akun Anda. Contoh ini mengambil AccessKey dan AccessSecretKey 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()); } }Klik tombol Test Function di tab Code.
Setelah eksekusi, lihat hasilnya di atas tab Code.
FAQ
Referensi
Untuk mempelajari tipe event OSS yang dapat dikonfigurasi, lihat Definisi event OSS.
Untuk mengubah atau menghapus pemicu, lihat Perbarui konfigurasi pemicu.
Pertanyaan terkait pemicu
Untuk mengidentifikasi event mana yang memicu eksekusi fungsi, Anda dapat mencatat tipe event di kode Anda. Untuk informasi selengkapnya, lihat Catatan log.
Untuk memanggil fungsi lain dari dalam fungsi Anda, Anda dapat menggunakan panggilan API atau mengoordinasikan fungsi dengan CloudFlow. Untuk operasi asinkron yang memakan waktu lama, Anda dapat mengonfigurasi tujuan pemanggilan asinkron. Untuk informasi selengkapnya, lihat Apakah fungsi dapat saling memanggil? dan Konfigurasikan tujuan pemanggilan asinkron.