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.
CatatanKami 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
Pastikan EventBridge telah diaktifkan dan izin yang diperlukan telah diberikan kepada pengguna Resource Access Management (RAM). Untuk informasi lebih lanjut, lihat Aktifkan EventBridge dan Berikan Izin kepada Pengguna RAM.
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
Masuk ke Konsol Function Compute. Di bilah navigasi sisi 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.
- Pada halaman detail fungsi, klik tab Triggers, pilih versi atau alias dari daftar drop-down Version or Alias, lalu klik Create Trigger.
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.
PentingAwalan 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, danoss:ObjectCreated:CompleteMultipartUploadEvent Pattern Content
Setelah Anda mengonfigurasi Object Prefix, Object Suffix, dan Event Type, sistem secara otomatis mengisi nilai untuk parameter ini.
PentingBerhati-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.
CatatanPemicu 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.
Pada halaman detail fungsi, klik tab Code, klik ikon
di sebelah Test Function, lalu pilih Configure Test Parameters dari daftar drop-down.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
{}
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 formatacs: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.CatatanPastikan 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.
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.
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:
CatatanJika 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()); } }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.