全部产品
Search
文档中心

Function Compute:Konfigurasikan pemicu OSS asli

更新时间:Jul 06, 2025

Anda dapat membuat pemicu Object Storage Service (OSS) asli di konsol Function Compute untuk secara otomatis memicu eksekusi fungsi ketika peristiwa tertentu terjadi di OSS. Hal ini memungkinkan Anda dengan mudah menanggapi peristiwa seperti unggahan file tanpa perlu menambahkan logika pemantauan peristiwa ke dalam kode Anda.

Contoh skenario

Anda dapat mengonfigurasi pemicu OSS dan mengatur parameter Object Prefix menjadi source dalam aturan pemicu. Dalam hal ini, ketika gambar disimpan di direktori source dari bucket OSS yang ditentukan, fungsi akan dipicu secara otomatis. Fungsi kemudian mengubah ukuran gambar dan menyimpan gambar yang telah diproses di direktori processed dari bucket yang sama. Sebagai contoh, gambar source/a.png diproses menjadi processed/a.png.

Prasyarat

  • Function Compute telah diaktifkan.

  • OSS telah diaktifkan dan sebuah bucket telah dibuat.

Kuota Layanan

  • Anda dapat mengaitkan hingga 10 pemicu OSS asli dengan satu bucket.

    Catatan

    Jika Anda ingin mengaitkan lebih banyak pemicu OSS dengan bucket yang sama, pertimbangkan untuk menggunakan pemicu OSS berbasis EventBridge. Meskipun secara teknis dimungkinkan untuk melebihi 10 pemicu per bucket dengan EventBridge, kami sarankan Anda membuat bucket baru dan mengonfigurasi pemicu di sana.

  • Baik pemicu OSS asli maupun pemicu OSS berbasis EventBridge tidak mendukung pencocokan fuzzy atau pencocokan ekspresi reguler untuk awalan objek dan akhiran yang dikonfigurasi.

  • Pemicu OSS asli hanya mendukung satu awalan objek dan satu konfigurasi akhiran. Untuk menentukan beberapa awalan atau akhiran, gunakan pemicu OSS berbasis EventBridge.

Langkah 1: Buat pemicu OSS

  1. Masuk ke Konsol Function Compute. Di panel navigasi di sebelah kiri, klik Functions.

  2. Di bilah navigasi atas, pilih wilayah. Pada halaman Functions, klik fungsi yang ingin Anda kelola.

  3. Di halaman Detail Fungsi, klik tab Configurations. Di panel navigasi di sebelah kiri, klik Triggers. Lalu, klik Create Trigger.

  4. Di panel Buat Pemicu, konfigurasikan parameter seperti yang diuraikan di bawah ini. Lalu, klik OK.

    Parameter

    Instruksi Konfigurasi

    Contoh

    Trigger Type

    Pilih OSS.

    OSS

    Name

    Kustomisasi nama pemicu.

    oss-trigger

    Version or Alias

    Tentukan versi atau alias fungsi. Nilai default adalah LATEST. Jika Anda ingin membuat pemicu untuk versi atau alias lainnya, 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 telah Anda buat.

    testbucket

    Object Prefix

    Tentukan awalan objek untuk menentukan objek mana dalam bucket yang harus memicu eksekusi fungsi. Untuk menghindari biaya tak terduga yang disebabkan oleh loop rekursif, kami sarankan Anda mengonfigurasi baik Awalan Objek maupun Akhiran Objek. Jika Anda menentukan jenis peristiwa yang sama untuk pemicu yang berbeda dalam bucket, Anda harus mengonfigurasi awalan dan akhiran yang berbeda untuk masing-masing. Untuk informasi lebih lanjut, lihat Aturan Pemicuan.

    Penting

    Awalan tidak boleh dimulai dengan garis miring (/). Jika tidak, pemicu OSS tidak akan berfungsi.

    source

    Object Suffix

    Tentukan akhiran objek untuk menentukan objek mana dalam bucket yang harus memicu eksekusi fungsi. Untuk menghindari biaya tak terduga yang disebabkan oleh pemicuan rekursif, kami sarankan Anda mengonfigurasi baik Awalan Objek maupun Akhiran Objek. Jika Anda menentukan jenis peristiwa yang sama untuk pemicu yang berbeda dalam bucket, Anda harus mengonfigurasi awalan dan akhiran yang berbeda untuk masing-masing. Untuk informasi lebih lanjut, lihat Aturan Pemicuan.

    png

    Trigger Event

    Pilih satu atau lebih peristiwa pemicu dari daftar drop-down. Untuk informasi lebih lanjut tentang jenis-jenis peristiwa OSS, lihat Peristiwa OSS.

    Dalam contoh ini, oss:ObjectCreated:PutObject dipilih.

    oss:ObjectCreated:PutObject, oss:ObjectCreated:PostObject, oss:ObjectCreated:CompleteMultipartUpload, oss:ObjectCreated:PutSymlink

    Role Name

    Tentukan peran yang digunakan OSS untuk memicu Function Compute. Dalam contoh ini, AliyunOSSEventNotificationRole dipilih.

    Catatan

    Setelah Anda mengonfigurasi parameter di atas, klik OK. Jika ini adalah pertama kalinya Anda membuat pemicu jenis ini, klik Authorize Now di pesan yang muncul.

    AliyunOSSEventNotificationRole

    Setelah pemicu dibuat, pemicu tersebut akan ditampilkan di tab Triggers. Untuk memodifikasi atau menghapus pemicu, lihat Manajemen Pemicu.

Langkah 2: (Opsional) Konfigurasikan parameter input

Ketika OSS memicu fungsi, ia meneruskan informasi dalam bentuk objek peristiwa ke dalam fungsi. Anda dapat menggunakan kode untuk mengurai dan memproses peristiwa. Untuk menguji apakah kode Anda berfungsi sesuai harapan, Anda dapat secara manual meneruskan event ke dalam fungsi Anda untuk mensimulasikan peristiwa pemicu.

  1. Di tab Code halaman detail fungsi, klik ikon image.png di sebelah Test Function dan pilih Configure Test Parameters dari daftar drop-down.

  2. Di panel Configure Test Parameters, klik tab Create New Test Event atau Modify Existing Test Event, masukkan nama peristiwa dan konten peristiwa, lalu klik OK.

    Catatan

    Konfigurasikan konten peristiwa berdasarkan informasi dari pembuatan pemicu. Pastikan bahwa objek yang ditentukan ada di bucket OSS. Jika tidak, fungsi tidak dapat dipicu, atau eksekusi akan gagal. Dalam contoh ini, objeknya adalah source/a.png.

    Objek peristiwa berfungsi sebagai parameter input ke Function Compute. Ketika objek file dibuat atau dihapus di bucket OSS yang ditentukan, data peristiwanya dikirim ke fungsi yang terikat dalam format JSON. Contoh objek peristiwa adalah sebagai berikut:

    {
        "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 peristiwa.

    Parameter

    Tipe

    Contoh

    Deskripsi

    eventName

    String

    ObjectCreated:PutObject

    Jenis peristiwa.

    eventSource

    String

    acs:oss

    Sumber peristiwa. Nilainya tetap acs.oss.

    eventTime

    String

    2022-08-13T06:45:43.000Z

    Waktu terjadinya peristiwa. Nilainya dalam format waktu standar ISO 8601.

    eventVersion

    String

    1.0

    Nomor versi protokol peristiwa.

    oss

    Map

    Konten peristiwa.

    bucket

    Map

    Rincian bucket.

    name

    String

    testbucket

    Nama bucket.

    arn

    String

    acs:oss:cn-hangzhou:123456789:testbucket

    ARN (Alibaba Cloud Resource Name) bucket.

    ownerIdentity

    String

    164901546557****

    ID pengguna yang membuat bucket.

    object

    Map

    Rincian objek.

    size

    Int

    122539

    Ukuran objek. Satuan: byte.

    deltaSize

    Int

    122539

    Variasi ukuran objek. Satuan: byte.

    • Jika objek baru ditambahkan, nilai parameter ini menunjukkan ukuran objek.

    • Jika objek yang ada ditimpa dengan objek dengan nama yang sama, nilai parameter ini menunjukkan selisih ukuran antara objek baru dan lama.

    eTag

    String

    688A7BF4F233DC9C88A80BF985AB****

    Tag objek.

    key

    String

    source/a.png

    Nama objek.

    objectMeta

    Map

    Rincian parameter objectMeta.

    mimeType

    String

    application/zip

    Tipe objek. Untuk informasi lebih lanjut, lihat Bagaimana cara mengonfigurasi header Content-Type?

    userMeta

    Map

    Metadata pengguna. Ini mengidentifikasi tujuan atau atribut objek.

    x-oss-meta-last-modified

    String

    20250213

    Metadata pengguna terdiri dari satu set pasangan kunci-nilai. Nama header metadata pengguna harus dimulai dengan x-oss-meta-. Dalam contoh ini, pasangan kunci-nilai "x-oss-meta-last-modified":"20250213" menunjukkan bahwa objek terakhir diubah pada 13 Februari 2025, di mesin lokal. Untuk informasi lebih lanjut, lihat Metadata Pengguna.

    ossSchemaVersion

    String

    1.0

    Nomor versi skema OSS.

    ruleId

    String

    9adac8e253828f4f7c0466d941fa3db81161****

    ID aturan yang cocok dengan peristiwa.

    region

    String

    cn-hangzhou

    Wilayah tempat bucket berada.

    requestParameters

    Map

    Parameter permintaan.

    sourceIPAddress

    String

    140.205.XX.XX

    Alamat IP dari mana permintaan dikirim.

    responseElements

    Map

    Rincian respons.

    requestId

    String

    58F9FF2D3DF792092E12044C

    ID permintaan.

    userIdentity

    Map

    Atribut pengguna.

    principalId

    String

    164901546557****

    ID akun Alibaba Cloud yang memulai permintaan.

Langkah 3: Tulis dan uji kode fungsi

Setelah membuat pemicu OSS, Anda dapat melanjutkan untuk menulis dan menguji kode fungsi Anda. Ketika peristiwa OSS terjadi, eksekusi fungsi dipicu.

Peringatan

Anda harus mencegah loop rekursif dalam kode Anda. Skenario tipikal melibatkan fungsi yang dipicu oleh unggahan objek ke bucket OSS. Setelah dieksekusi, fungsi tersebut menghasilkan objek baru dan mengunggahnya kembali ke bucket yang sama, yang memicu fungsi lagi, menciptakan loop tak terbatas. Untuk informasi lebih lanjut, lihat Aturan Pemicuan.

  1. Di tab Code pada halaman Detail Fungsi, tulis kode di editor kode, lalu klik Deploy.

    • Kode contoh untuk runtime yang mendukung pengeditan kode online adalah sebagai berikut:

      Catatan

      Kami sarankan Anda menggunakan titik akhir internal OSS untuk membaca data dari dan menulis data ke bucket OSS dalam fungsi Anda. Jika Anda menggunakan titik akhir publik untuk mengakses sumber daya OSS, Anda akan dikenakan biaya untuk data yang ditransfer melalui Internet. Untuk informasi lebih lanjut tentang format titik akhir internal, lihat Wilayah dan Titik Akhir.

      "use strict";
      /*
      Kode contoh digunakan untuk mengimplementasikan fitur berikut:
      *   1. Mengurai informasi pemicu OSS dari objek peristiwa.
      *   2. Menginisialisasi klien OSS berdasarkan informasi yang diperoleh.
      *   3. Mengubah ukuran gambar sumber lalu menyimpan gambar yang telah diproses ke direktori tujuan tertentu di bucket OSS untuk mengimplementasikan pencadangan gambar.
      */
      
      const OSS = require("ali-oss");
      
      exports.handler = async function(event, context, callback) {
          console.log("Isi entitas konteks adalah: \n");
          console.dir(context);
      
          const {accessKeyId, accessKeySecret, securityToken} = context.credentials;
      
          const events = JSON.parse(event.toString()).events;
          console.log("Isi entitas peristiwa adalah: \n");
          console.dir(events);
      
          let objectName = events[0].oss.object.key;
          let region = events[0].region;
          let bucketName = events[0].oss.bucket.name;
      
          // Hubungkan ke bucket OSS.
          const client = new OSS({
              region: region,
              accessKeyId: accessKeyId,
              accessKeySecret: accessKeySecret,
              stsToken: securityToken,
              bucket: bucketName,
              endpoint: "https://oss-" + region + "-internal.aliyuncs.com"
          });
      
          console.log("Entitas klien adalah: \n");
          console.dir(events);
      
          const targetImage = objectName.replace("source/", "processed/")
          // Ubah ukuran gambar menjadi lebar dan tinggi tetap 128 piksel.
          const processStr = "image/resize,m_fixed,w_128,h_128"
          // Simpan gambar yang telah diproses ke direktori tujuan.
          const result = await client.processObjectSave(
              objectName,
              targetImage,
              processStr,
              bucketName
          );
          console.log(result.res.status);
      
          callback(null, "selesai");
      }
      """
      Kode contoh digunakan untuk mengimplementasikan fitur berikut:
      * Mengurai informasi pemicu OSS dari objek peristiwa.
      * Menginisialisasi klien OSS berdasarkan informasi yang diperoleh.
      * Mengubah ukuran gambar sumber lalu menyimpan gambar yang telah diproses ke direktori tujuan tertentu di bucket OSS untuk mengimplementasikan pencadangan gambar.
      
      """
      
      # -*- coding: utf-8 -*-
      import oss2, json
      import base64
      
      def handler(event, context):
          # Anda dapat menggunakan context.credentials untuk mendapatkan pasangan AccessKey.
          print("Isi entitas konteks adalah: \n")
          print(context)
          creds = context.credentials
      
          # Konfigurasikan izin untuk SDK OSS.
          auth = oss2.StsAuth(
              creds.access_key_id,
              creds.access_key_secret,
              creds.security_token)
      
          print("Isi entitas peristiwa adalah: \n")
          print(event)
          # Muat konten peristiwa.
          oss_raw_data = json.loads(event)
          # Dapatkan parameter terkait peristiwa OSS yang dilewatkan oleh pemicu OSS.
          oss_info_map = oss_raw_data['events'][0]['oss']
          # Dapatkan nama bucket OSS.
          bucket_name = oss_info_map['bucket']['name']
          # Tetapkan titik akhir layanan OSS.
          endpoint = 'oss-' + oss_raw_data['events'][0]['region'] + '-internal.aliyuncs.com'
          # Inisiasi klien OSS.
          bucket = oss2.Bucket(auth, endpoint, bucket_name)
          object_name = oss_info_map['object']['key']
      
          # Unduh gambar asli dari bucket OSS.
          remote_stream = bucket.get_object(object_name)
          if not remote_stream:
              print(f'{object_name} tidak ada di bucket {bucket_name}')
              return
          # Gambar yang diproses akan disimpan di processed/
          processed_path = object_name.replace('source/', 'processed/')
      
          # Ubah ukuran gambar menjadi lebar dan tinggi tetap 128 piksel.
          style = 'image/resize,m_fixed,w_128,h_128'
          # Tentukan nama gambar yang telah diproses. Untuk gambar yang tidak disimpan di direktori root bucket, Anda harus menyertakan jalur lengkap. 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 digunakan untuk mengimplementasikan fitur berikut:
      *   1. Mengurai informasi titik akhir, bucket, dan objek dari permintaan.
      *   2. Menginisialisasi klien OSS berdasarkan informasi yang diperoleh.
      *   3. Mengubah ukuran gambar sumber lalu menyimpan gambar yang telah diproses ke direktori tujuan tertentu di bucket OSS untuk mengimplementasikan pencadangan gambar.
      */
      <?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);
        /*
          ID AccessKey dan Secret AccessKey akun Alibaba Cloud dapat digunakan untuk mengakses semua operasi API. Menggunakan kredensial ini untuk melakukan operasi di Function Compute merupakan operasi berisiko tinggi. Kami sarankan Anda menggunakan pengguna RAM untuk memanggil operasi API atau melakukan pemeliharaan rutin.
          Kami sarankan Anda menghindari menyimpan pasangan AccessKey di proyek kode Anda. Jika informasi sensitif ini bocor, keamanan semua sumber daya di akun Anda bisa terancam.
          Dalam contoh ini, pasangan AccessKey diperoleh 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 {
              // Hubungkan ke OSS.
              $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint, false, $securityToken);
              // Ubah ukuran gambar menjadi lebar dan tinggi tetap 128 piksel.
              $style = "image/resize,m_fixed,w_128,h_128";
              $process = $style.
                 '|sys/saveas'.
                 ',o_'.base64url_encode($targetObject).
                 ',b_'.base64url_encode($bucketName);
              // Simpan gambar yang telah diproses ke direktori tujuan yang ditentukan.
              $result = $ossClient->processObject($bucketName, $objectName, $process);
              // Cetak hasil pemrosesan.
              print($result);
          } catch (OssException $e) {
              print_r(__FUNCTION__ . ": GAGAL\n");
              printf($e->getMessage() . "\n");
          }
      
          print(__FUNCTION__ . ": OK" . "\n");
      
          return $targetObject;
      }
  2. Uji fungsi.

    Metode 1: Jika Anda mensimulasikan sumber peristiwa dengan mengonfigurasi event, klik Test Function.

    Metode 2: Di halaman Configurations > Triggers, klik nama bucket untuk menavigasi ke bucket yang sesuai dan unggah gambar dengan awalan dan akhiran yang ditentukan. Lalu, Anda dapat pergi ke tab Log di halaman Detail Fungsi untuk melihat log eksekusi, dan juga memeriksa gambar yang telah diproses di direktori tujuan bucket.

    image

    image

FAQ

Referensi

  • Untuk informasi lebih lanjut tentang jenis-jenis peristiwa OSS, lihat Peristiwa OSS.

  • Jika Anda ingin memodifikasi atau menghapus pemicu yang ada, lihat Ubah Pemicu.

  • Jika Anda ingin mengaitkan lebih dari 10 pemicu OSS dengan bucket, lihat Konfigurasikan Pemicu OSS Berbasis EventBridge.

  • Masalah Terkait Pemicu:

    • Jika Anda ingin memeriksa peristiwa apa yang memicu fungsi, Anda dapat menentukan sistem untuk mencetak log tipe peristiwa dalam kode Anda. Untuk informasi lebih lanjut, lihat Log.

    • Untuk memanggil fungsi lain dalam fungsi, Anda dapat memanggil fungsi target melalui panggilan API atau mengatur fungsi Anda menggunakan CloudFlow. Jika fungsi yang dipanggil membutuhkan 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.