Untuk menentukan beberapa awalan dan akhiran objek atau mengaitkan lebih dari 10 pemicu ke satu bucket Object Storage Service (OSS), buat pemicu OSS berbasis EventBridge guna merespons event seperti unggahan file.
Catatan
Perhatikan perbedaan berikut antara pemicu OSS berbasis EventBridge dan pemicu OSS native:
Anda dapat mengaitkan maksimal 10 pemicu OSS native ke satu bucket. Jika ingin mengaitkan lebih banyak pemicu OSS ke satu bucket, gunakan pemicu OSS berbasis EventBridge.
CatatanKami menyarankan agar Anda tidak mengaitkan lebih dari 10 pemicu ke satu bucket. Jika memerlukan lebih banyak pemicu, buat bucket baru lalu buat pemicu untuk bucket tersebut.
Anda dapat membuat hingga 50 pemicu OSS berbasis EventBridge, sesuai dengan batas resource EventBridge. Untuk informasi selengkapnya, lihat Batas.
Untuk pemicu OSS berbasis EventBridge, kombinasi Event Type, Object Prefix, dan Object Suffix tidak perlu unik.
Anda dapat mengonfigurasi beberapa nilai untuk Object Prefix dan Object Suffix. Namun, pencocokan kabur (fuzzy matching) dan pencocokan ekspresi reguler tidak didukung untuk Object Prefix dan Object Suffix.
Pemicu OSS berbasis EventBridge tidak aktif secara langsung. Diperlukan sekitar 30 detik setelah pembuatan hingga mulai memicu fungsi terkait.
Contoh
Anda dapat mengonfigurasi pemicu OSS dengan aturan yang menentukan 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 tertentu, sebuah fungsi akan dipicu secara otomatis. Setelah fungsi dieksekusi, file hasil dekompresi disimpan di direktori lain dalam bucket yang sama.
Prasyarat
EventBridge
Function Compute
Object Storage Service (OSS)
Langkah 1: Buat pemicu EventBridge OSS
Login ke Konsol Function Compute. Di panel navigasi kiri, pilih .
Di bilah navigasi atas, pilih wilayah. Pada halaman Functions, klik fungsi target.
Di halaman detail fungsi, klik tab Trigger, lalu klik Create Trigger.
Di panel Trigger Type, atur Event triggers for Alibaba Cloud services ke Object Storage Service (OSS) di bawah OK, konfigurasi parameter lainnya, lalu klik OK.
Parameter
Tindakan
Contoh
Name
Masukkan nama kustom untuk pemicu.
oss-trigger
Version or Alias
Nilai default adalah LATEST. Jika ingin membuat pemicu untuk versi atau alias berbeda, pilih terlebih dahulu versi atau alias 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.
bucket-zh****
Object Prefix
Masukkan awalan nama objek yang ingin Anda cocokkan. Function Compute merekomendasikan mengonfigurasi awalan dan akhiran untuk mencegah pemanggilan melingkar dan biaya tak terduga.
Anda dapat mengklik + Add Object Prefix untuk menambahkan beberapa nilai untuk Object Prefix.
PentingAwalan objek tidak boleh diawali dengan garis miring (
/); jika tidak, pemicu tidak akan aktif.source
test
Object Suffix
Masukkan akhiran nama objek yang ingin Anda cocokkan. Function Compute merekomendasikan mengonfigurasi awalan dan akhiran untuk mencegah pemanggilan melingkar dan biaya tak terduga.
Anda dapat mengklik + Add Object Suffix untuk menambahkan beberapa nilai untuk Object Suffix.
png
Event Type
Pilih satu atau beberapa event pemicu. Untuk informasi selengkapnya tentang jenis event Function Compute, lihat OSS event definitions.
oss:ObjectCreated:PutObject,oss:ObjectCreated:PostObject,oss:ObjectCreated:CompleteMultipartUploadEvent Pattern Content
Setelah Anda mengonfigurasi Object Prefix, Object Suffix, dan Event Type, sistem akan mengisi parameter ini secara otomatis.
PentingUbah Event Pattern Content dengan hati-hati. Modifikasi yang salah dapat menyebabkan pemicu gagal. Sebelum mengubah pola event, pastikan Anda memahami aturannya. Untuk informasi selengkapnya, lihat Event patterns.
{ "source":[ "acs.oss" ] }Invocation Method
Pilih metode untuk memanggil fungsi. Metode default adalah pemanggilan sinkron.
Sync Invocation: Function Compute memicu fungsi dan menunggu eksekusi selesai sebelum mengembalikan hasil. Metode ini cocok untuk berbagai kasus penggunaan. Untuk informasi selengkapnya, lihat Sync invocation.
Async Invocation: Function Compute memicu fungsi dan langsung mengembalikan respons. Layanan ini menjamin bahwa fungsi dieksekusi minimal sekali tetapi tidak mengembalikan hasil eksekusi. Metode ini cocok untuk fungsi dengan waktu eksekusi panjang. Untuk informasi selengkapnya, lihat Async invocation.
Sync Invocation
Trigger State
Menentukan apakah pemicu langsung diaktifkan saat dibuat. Secara default, Enable Trigger dipilih, artinya pemicu langsung diaktifkan setelah dibuat.
N/A
Push Format
Menentukan format data untuk parameter input event fungsi.
CloudEvents: Spesifikasi untuk mendeskripsikan data event dalam format umum. Ini mencakup deskripsi event dan muatannya, sehingga menyederhanakan deklarasi dan pengiriman event lintas layanan dan platform.
RawData: Mengirimkan hanya muatan event, tanpa metadata lain dari format CloudEvents.
Catatanpemicu OSS native berbeda dari EventBridge-based OSS triggers. Parameter event pemicu OSS native hanya mendukung templat OSSEvents, yaitu format event yang dihasilkan oleh OSS.
CloudEvents
Untuk informasi tentang parameter lanjutan, seperti pengaturan ulang percobaan (retry) dan surat mati (dead letter), lihat Advanced trigger features.
Setelah pemicu dibuat, pemicu tersebut muncul dalam daftar Trigger Name. Untuk mengubah atau menghapus pemicu, lihat Manage triggers.
Langkah 2: Konfigurasikan parameter input fungsi
Pemicu OSS berbasis EventBridge meneruskan event ke fungsi sebagai parameter input dalam format CloudEvents. Anda dapat secara manual meneruskan event ke fungsi untuk mensimulasikan pemicu.
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 Create New Test Event atau Modify Existing Test Event. Masukkan nama event dan konten event, lalu klik OK.
Event tersebut merupakan parameter input untuk Function Compute. Saat event tertentu terjadi di bucket OSS target, sistem mengirimkan data event ke fungsi terikat dalam format JSON. 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-bidang dalam parameter event.
Parameter
Tipe
Contoh
Deskripsi
datacontenttype
string
application/json;charset=utf-8
Tipe konten dari parameter data. Parameter datacontenttype hanya mendukung application/json;charset=utf-8.
aliyunaccountid
string
143199913****
ID akun Alibaba Cloud Anda. Anda dapat menemukannya di bagian References pada halaman Overview di Konsol Function Compute.
data
{}
Konten event OSS, berupa objek JSON. CloudEvents berisi konteks yang didefinisikan oleh OSS saat event terjadi. Informasi ini dikemas dalam parameter data.
subject
string
acs:oss:cn-hangzhou:143199913****:bucket-zh****/source/a.png
Subjek event.
Formatnya adalah
acs:oss:<region>:<your_account_id>:<your_bucket>, dengan<region>adalah wilayah fungsi,<your_account_id>adalah ID akun Alibaba Cloud Anda, dan<your_bucket>adalah nama bucket Anda.aliyunoriginalaccountid
string
143199913****
ID akun Alibaba Cloud yang menjadi asal event.
source
string
acs.oss
Sumber event. Untuk pemicu OSS, nilainya tetap
acs.oss.type
string
oss:ObjectCreated:PutObject
Jenis 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 IP server yang menerima event.
Anda harus memperbarui bidang-bidang berikut dalam parameter data agar sesuai dengan konfigurasi Anda:
userIdentity.principalId: Ganti dengan ID akun Alibaba Cloud Anda.region: Ganti dengan wilayah tempat Anda membuat fungsi.oss.bucket.name: Ganti dengan nama bucket Anda, yang harus berada di wilayah yang sama dengan fungsi.oss.bucket.arn: Formatnya adalahacs:oss:<region>:<your_account_id>:<your_bucket>, dengan<region>adalah wilayah fungsi,<your_account_id>adalah ID akun Alibaba Cloud Anda, dan<your_bucket>adalah nama bucket Anda di wilayah yang sama.oss.bucket.ownerIdentity: Ganti dengan ID akun Alibaba Cloud Anda.object.key: Ganti dengan objek yang telah Anda unggah ke bucket tujuan.
PentingSaat mensimulasikan pemicu dengan mengonfigurasi parameter event, pastikan objek yang ditentukan, seperti source/a.png dalam tutorial ini, ada di bucket yang dikonfigurasi. Jika tidak, fungsi tidak akan dipicu atau eksekusinya akan gagal.
Langkah 3: Tulis dan uji kode fungsi
Setelah membuat pemicu OSS, tulis dan uji kode fungsi untuk memverifikasi kebenarannya. Fungsi tersebut kemudian akan dipicu secara otomatis oleh event OSS nyata.
Anda harus menghindari pemicu berulang (loop triggers) dalam kode Anda. Jika tidak, Anda mungkin dikenai biaya tak terduga. Contoh skenario pemicu berulang adalah ketika unggahan objek ke bucket OSS memicu fungsi. Fungsi tersebut lalu menghasilkan satu atau beberapa file dan menulisnya kembali ke bucket yang sama, yang pada gilirannya memicu fungsi lagi. Untuk informasi selengkapnya, lihat OSS trigger rules.
Di tab Code halaman detail fungsi, masukkan kode Anda di editor lalu klik Deploy.
Bagian berikut menjelaskan persiapan dan menyediakan contoh kode.
CatatanJika Anda perlu membaca dari atau menulis ke resource OSS dalam fungsi, kami merekomendasikan menggunakan titik akhir internal OSS untuk menghindari trafik internet dan biaya terkait. Untuk informasi selengkapnya tentang titik akhir internal OSS, lihat Regions and endpoints.
/* Persiapan: 1. Jalankan perintah berikut di terminal untuk membuat file package.json dan menginstal modul jimp. a. Jalankan npm init untuk membuat file 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 diawali dengan "oss-". Contoh: oss-cn-shanghai. var ossRegion = "oss-" + ossEvent.region; // Buat klien OSS. var client = new oss({ region: ossRegion, /* Pasangan AccessKey akun Alibaba Cloud memberikan akses API penuh. Untuk keamanan, gunakan Pengguna RAM untuk panggilan API dan operasi rutin. Jangan hard-code ID AccessKey dan rahasia Anda dalam kode, karena ini dapat menyebabkan kebocoran dan mengompromikan keamanan akun Anda. Contoh ini mengambil kredensial 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); // Gambar yang diproses disimpan ke 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 cache. 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 tmp. image.resize(128, 128).write(tmpFile, function (err) { if (err) { console.error("Failed to write image locally"); 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('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 dikonfigurasi untuk fungsi memiliki izin untuk mengakses OSS. Anda dapat login ke Konsol RAM untuk memberikan izin yang diperlukan kepada peran tersebut. # 2. Pastikan penanganan permintaan 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 # Pasangan AccessKey akun Alibaba Cloud memberikan akses API penuh. Untuk keamanan, gunakan Pengguna RAM untuk panggilan API dan operasi rutin. # Jangan hard-code ID AccessKey dan rahasia Anda dalam kode, karena ini dapat menyebabkan kebocoran dan mengompromikan keamanan akun Anda. # Contoh ini mengambil kredensial 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 dikonfigurasi untuk fungsi memiliki izin untuk mengakses OSS. Anda dapat login ke Konsol RAM dan memberikan izin akses OSS kepada peran tersebut. 2. Pastikan penanganan permintaan fungsi adalah index.handler. */ <?php use OSS\OssClient; function handler($event, $context) { $event = json_decode($event, $assoc = true); /* Pasangan AccessKey akun Alibaba Cloud memberikan akses API penuh. Untuk keamanan, gunakan Pengguna RAM untuk panggilan API dan operasi rutin. Jangan hard-code ID AccessKey dan rahasia Anda dalam kode, karena ini dapat menyebabkan kebocoran dan mengompromikan keamanan akun Anda. Contoh ini mengambil kredensial 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()); } }/* Persiapan: 1. Tambahkan dependensi berikut ke pom.xml. <dependencies> <dependency> <groupId>com.aliyun.fc.runtime</groupId> <artifactId>fc-java-core</artifactId> <version>1.4.1</version> </dependency> <dependency> <groupId>com.aliyun.fc.runtime</groupId> <artifactId>fc-java-event</artifactId> <version>1.2.0</version> </dependency> </dependencies> 2. Pastikan penanganan fungsi adalah example.App::handleRequest. */ package example; import java.io.*; import java.util.Map; import com.aliyun.fc.runtime.Context; import com.aliyun.fc.runtime.StreamRequestHandler; import com.aliyun.fc.runtime.event.OSSEvent.Event; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; public class App implements StreamRequestHandler { private static final ObjectMapper mapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); public static final class CloudEvent { public final String id; public final String source; public final String specversion; public final String type; public final String datacontenttype; public final String dataschema; public final String subject; public final String time; public final Map<String, ?> extensions; public final Event data; @JsonCreator public CloudEvent(@JsonProperty("id") String id, @JsonProperty("source") String source, @JsonProperty("specversion") String specversion, @JsonProperty("type") String type, @JsonProperty("datacontenttype") String datacontenttype, @JsonProperty("dataschema") String dataschema, @JsonProperty("subject") String subject, @JsonProperty("time") String time, @JsonProperty("extensions") Map<String, ?> extensions, @JsonProperty("data") Event data) { this.id = id; this.source = source; this.specversion = specversion; this.type = type; this.datacontenttype = datacontenttype; this.dataschema = dataschema; this.subject = subject; this.time = time; this.extensions = extensions; this.data = data; } public String getId() { return this.id; } public String getSource() { return this.source; } public String getSpecversion() { return this.specversion; } public String getType() { return this.type; } public String getDatacontenttype() { return this.datacontenttype; } public String getDataschema() { return this.dataschema; } public String getSubject() { return this.subject; } public String getTime() { return this.time; } public Map<String, ?> getExtensions() { return this.extensions; } public Event getData() { return this.data; } } @Override public void handleRequest( InputStream inputStream, OutputStream outputStream, Context context) throws IOException { CloudEvent cloudEvents = mapper.readValue(inputStream, new TypeReference<CloudEvent>() {}); Event ossEvent = cloudEvents.getData(); context.getLogger().info(String.format("received %s from %s @ %s", ossEvent.eventName, ossEvent.eventSource, ossEvent.region)); outputStream.write(String.format("received %s from %s @ %s", ossEvent.eventName, ossEvent.eventSource, ossEvent.region).getBytes()); outputStream.write(String.format("received bucket %s", ossEvent.oss.bucket.arn).getBytes()); outputStream.write(String.format("received object %s and it's size is %s", ossEvent.oss.object.key, ossEvent.oss.object.size).getBytes()); } }Klik Test Function.
Setelah eksekusi selesai, Anda dapat melihat hasilnya di atas tab Code.
FAQ
Topik Terkait
Untuk mempelajari jenis event OSS yang dapat dikonfigurasi, lihat OSS event definitions.
Untuk mengubah atau menghapus pemicu yang sudah ada, lihat Update a trigger.
-
Isu terkait pemicu:
-
Untuk memeriksa event mana yang memicu fungsi Anda, Anda dapat mencatat jenis event dalam kode. 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 tujuan untuk menangani hasil pemanggilan. Untuk informasi selengkapnya, lihat Can functions invoke each other? dan Configure a destination for an asynchronous invocation.
-