全部产品
Search
文档中心

Function Compute:Konfigurasikan pemicu OSS asli

更新时间:Jul 02, 2025

Anda dapat membuat pemicu Object Storage Service (OSS) asli di konsol Function Compute untuk memicu eksekusi fungsi berdasarkan peristiwa tertentu. Ini memungkinkan Anda menanggapi peristiwa seperti unggahan file tanpa perlu menambahkan logika pemantauan peristiwa ke kode Anda.

Skenario contoh

Anda dapat mengonfigurasi pemicu OSS dengan parameter Object Prefix diatur ke source. Fungsi akan dipicu secara otomatis ketika gambar disimpan di direktori source bucket OSS yang ditentukan. Fungsi ini mengubah ukuran gambar dan menyimpan hasilnya di direktori processed dalam bucket yang sama. Sebagai contoh, gambar source/a.png diproses menjadi processed/a.png.

Batasan

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

    Catatan

    Jika Anda ingin mengaitkan lebih dari 10 pemicu OSS, buat pemicu OSS berbasis EventBridge. Kami merekomendasikan agar Anda tidak mengaitkan lebih dari 10 pemicu OSS dengan satu bucket. Jika diperlukan lebih dari 10 pemicu, buat bucket baru dan konfigurasikan pemicu OSS berdasarkan bucket tersebut.

  • Pencocokan kabur atau pencocokan ekspresi reguler berdasarkan awalan dan akhiran objek tidak didukung baik pada pemicu OSS asli maupun pemicu OSS berbasis EventBridge. Untuk mengonfigurasi beberapa awalan dan akhiran objek, gunakan pemicu OSS berbasis EventBridge.

Prasyarat

  • Function Compute

    • Layanan telah dibuat. Untuk informasi lebih lanjut, lihat Buat Layanan.

      Catatan

      Saat membuat layanan, konfigurasikan peran layanan sehingga fungsi dalam layanan dapat memperoleh izin dari peran tersebut. Jika tidak, kesalahan akan dilaporkan saat Anda menguji kode fungsi. Dalam contoh ini, peran layanan adalah AliyunFCDefaultRole dengan izin AliyunOSSFullAccess. Untuk informasi lebih lanjut tentang peran layanan, lihat Berikan Izin Function Compute untuk Mengakses Layanan Alibaba Cloud Lainnya.

    • Fungsi telah dibuat. Untuk informasi lebih lanjut, lihat Buat Fungsi.

  • OSS

Langkah 1: Buat pemicu OSS

  1. Masuk ke konsol Function Compute. Di bilah navigasi sisi kiri, klik Services & Functions.

  2. Di bilah navigasi atas, pilih wilayah. Pada halaman Services, klik layanan yang diinginkan.

  3. Pada halaman Functions, klik fungsi yang ingin Anda kelola.
  4. Pada halaman detail fungsi, klik tab Triggers, pilih versi atau alias dari daftar drop-down Version or Alias, lalu klik Create Trigger.
  5. Di panel Buat Pemicu, konfigurasikan parameter dan klik OK. Tabel berikut menjelaskan parameter tersebut.

    Parameter

    Deskripsi

    Contoh

    Trigger Type

    Tentukan jenis pemicu. Dalam contoh ini, pilih OSS.

    OSS

    Name

    Masukkan nama pemicu.

    oss-trigger

    Version or Alias

    Tentukan versi atau alias layanan. Nilai default adalah 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. Dalam contoh ini, pilih bucket yang Anda buat dari daftar drop-down.

    testbucket

    Object Prefix

    Masukkan awalan nama objek yang ingin Anda cocokkan. Kami merekomendasikan agar Anda mengonfigurasi awalan dan akhiran untuk mencegah biaya tambahan yang disebabkan oleh loop bersarang. Jika Anda menentukan tipe peristiwa yang sama untuk pemicu yang berbeda dalam bucket, awalan atau akhiran tidak boleh sama. Untuk informasi lebih lanjut, lihat Aturan pemicu.

    Penting

    Awalan objek tidak dapat dimulai dengan garis miring (/). Jika tidak, pemicu OSS tidak dapat dipicu.

    source

    Object Suffix

    Masukkan akhiran nama objek yang ingin Anda cocokkan. Kami merekomendasikan agar Anda mengonfigurasi awalan dan akhiran untuk mencegah biaya tambahan yang disebabkan oleh loop bersarang. Jika Anda menentukan tipe peristiwa yang sama untuk pemicu yang berbeda dalam bucket, awalan atau akhiran tidak boleh sama. Untuk informasi lebih lanjut, lihat Aturan pemicu.

    png

    Trigger Event

    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, dan oss:ObjectCreated:CompleteMultipartUpload

    Role Name

    Pilih AliyunOSSEventNotificationRole.

    Catatan

    Setelah Anda mengonfigurasi parameter sebelumnya, klik OK. Jika ini 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 yang ada, lihat Kelola Pemicu.

Langkah 2: Konfigurasikan parameter input fungsi

Peristiwa OSS diteruskan ke fungsi sebagai parameter input bernama event. Anda dapat meneruskan event secara manual untuk memicu fungsi tersebut.

  1. Pada halaman detail fungsi, klik tab Code, klik ikon xialatubiao di sebelah Test Function, lalu pilih Configure Test Parameters dari daftar drop-down.

  2. Di panel Configure Test Parameters, pilih tab Create New Test Event atau Modify Existing Test Event, konfigurasikan Event Name dan konten peristiwa di editor kode, lalu klik OK.

    Catatan

    Konfigurasikan konten peristiwa berdasarkan informasi tentang pemicu. Pastikan objek yang ditentukan ada di bucket. Dalam contoh ini, objeknya adalah source/a.png. Jika tidak, fungsi tidak dapat dipicu atau gagal dieksekusi.

    event adalah parameter input dari Function Compute. Ketika objek dibuat di bucket OSS yang ditentukan, data peristiwa dikirim ke fungsi yang sesuai dalam format JSON. Berikut adalah contoh cara mengonfigurasi event:

    {
        "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",
                        "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 bidang dalam event.

    Bidang

    Tipe data

    Contoh

    Deskripsi

    eventName

    String

    ObjectCreated:PutObject

    Tipe peristiwa.

    eventSource

    String

    acs:oss

    Sumber peristiwa. Atur nilainya ke acs.oss.

    eventTime

    String

    2022-08-13T06:45:43.000Z

    Waktu terjadinya peristiwa. Waktu dalam format standar ISO 8601.

    eventVersion

    String

    1.0

    Versi protokol peristiwa.

    oss

    Map

    Konten peristiwa OSS.

    bucket

    Map

    Detail bucket OSS.

    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

    Detail objek OSS.

    size

    Int

    122539

    Ukuran objek OSS. Unit: bytes.

    deltaSize

    Int

    122539

    Variasi ukuran objek OSS. Unit: bytes.

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

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

    eTag

    String

    688A7BF4F233DC9C88A80BF985AB****

    Tag objek.

    key

    String

    source/a.png

    Nama objek.

    ossSchemaVersion

    String

    1.0

    Versi skema OSS.

    ruleId

    String

    9adac8e253828f4f7c0466d941fa3db81161****

    ID aturan yang sesuai 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

    Elemen respons.

    requestId

    String

    58F9FF2D3DF792092E12044C

    ID permintaan.

    userIdentity

    Map

    Properti pengguna.

    principalId

    String

    164901546557****

    ID akun Alibaba Cloud yang memulai permintaan.

Langkah 3: Tulis kode fungsi dan uji fungsi

Setelah membuat pemicu, Anda dapat menulis kode fungsi dan menguji fungsi untuk memverifikasi apakah kode tersebut benar. Eksekusi fungsi dipicu ketika peristiwa OSS terjadi.

Peringatan

Hindari loop dalam kode. Misalnya, ketika objek diunggah ke bucket OSS, operasi unggah memicu fungsi. Kemudian, fungsi tersebut menghasilkan satu atau lebih objek yang ditulis ke bucket OSS, dan operasi penulisan memicu fungsi lagi, menciptakan loop. Untuk informasi lebih lanjut, lihat Aturan Pemicu.

  1. Pada halaman detail fungsi, klik tab Code, masukkan kode fungsi di editor kode, lalu klik Deploy.

    • Berikut adalah contoh kode untuk runtime yang mendukung pengeditan online.

      Catatan

      Untuk membaca dan menulis data ke sumber daya OSS dalam fungsi, kami merekomendasikan menggunakan titik akhir internal OSS untuk menghindari biaya Internet. Untuk informasi lebih lanjut tentang format titik akhir internal OSS, lihat Wilayah dan Titik Akhir.

      "use strict";
      /*
      Contoh kode digunakan untuk mengimplementasikan fitur berikut:
      * 1. Mem-parsing informasi pemicu peristiwa OSS dari event.
      * 2. Menginisialisasi klien OSS berdasarkan informasi yang diperoleh.
      * 3. Mengubah ukuran gambar sumber dan menyimpan gambar ke jalur tujuan tertentu di bucket OSS untuk mencadangkan gambar.
      
      
      Contoh kode ini terutama mengimplementasikan fungsi berikut:
      * 1. Mem-parsing informasi pemicu peristiwa OSS terkait dari event.
      * 2. Berdasarkan informasi di atas, inisialisasi klien OSS.
      * 3. Ubah ukuran gambar sumber lalu simpan gambar yang diproses ke folder salinan bucket yang sama untuk mencadangkan 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 event 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.
          // Hubungkan ke target 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/")
          // Skala gambar ke lebar dan tinggi tetap 128 px.
          const processStr = "image/resize,m_fixed,w_128,h_128"
          // Ubah ukuran gambar sumber lalu simpan gambar yang diproses ke direktori tujuan.
          const result = await client.processObjectSave(
              objectName,
              targetImage,
              processStr,
              bucketName
          );
          console.log(result.res.status);
      
          callback(null, "selesai");
      }
      """
      Contoh kode digunakan untuk mengimplementasikan fitur berikut:
      * Mem-parsing informasi pemicu peristiwa OSS dari event.
      * Menginisialisasi klien bucket OSS berdasarkan informasi yang diperoleh.
      * Mengubah ukuran gambar sumber dan menyimpan gambar ke jalur tujuan tertentu di bucket OSS untuk mencadangkan gambar.
      
      
      Contoh kode ini terutama melakukan hal berikut:
      * Dapatkan informasi pemrosesan OSS terkait dari event.
      * Inisiasi klien OSS dengan bucket target.
      * Ubah ukuran gambar sumber lalu simpan gambar yang diproses ke folder salinan bucket yang sama untuk mencadangkan gambar.
      
      """
      
      # -*- coding: utf-8 -*-
      import oss2, json
      import base64
      
      def handler(event, context):
          # Anda dapat menggunakan context.credentials untuk mendapatkan informasi kunci.
          # Kunci akses dapat diambil melalui context.credentials
          print("Isi entitas konteks adalah: \n")
          print(context)
          creds = context.credentials
      
          # Konfigurasikan izin untuk SDK OSS.
          # Setup auth, diperlukan oleh OSS sdk.
          auth = oss2.StsAuth(
              creds.access_key_id,
              creds.access_key_secret,
              creds.security_token)
      
          print("Isi entitas event adalah: \n")
          print(event)
          # Muat konten event.
          oss_raw_data = json.loads(event)
          # Dapatkan parameter terkait peristiwa OSS yang diteruskan oleh pemicu OSS.
          oss_info_map = oss_raw_data['events'][0]['oss']
          # Dapatkan nama bucket OSS.
          bucket_name = oss_info_map['bucket']['name']
          # Set layanan titik akhir 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/')
      
          # Skala gambar ke lebar dan tinggi tetap 128 px.
          style = 'image/resize,m_fixed,w_128,h_128'
          # Tentukan nama gambar yang diproses. Jika gambar tidak disimpan di direktori root bucket, Anda harus menambahkan jalur lengkap gambar. 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)
      /*Contoh kode digunakan untuk mengimplementasikan fitur berikut:
      *   1. Mem-parsing informasi endpoint, bucket, dan objek dari permintaan.
      *   2. Menginisialisasi klien OSS berdasarkan informasi yang diperoleh.
      *   3. Mengubah ukuran gambar sumber dan menyimpan gambar ke jalur tujuan tertentu di bucket OSS untuk mencadangkan gambar.
      *
      *Kode contoh ini terutama mengimplementasikan fungsi berikut:
      * 1. Mem-parsing endpoint, bucket, objek dari permintaan.
      * 2. Berdasarkan informasi yang diperoleh di atas, inisialisasi klien OSS.
      * 3. Ubah ukuran gambar sumber lalu simpan gambar yang diproses ke folder salinan bucket yang sama untuk mencadangkan 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);
        /*
          Pasangan AccessKey akun Alibaba Cloud dapat digunakan untuk mengakses semua operasi API. Menggunakan kredensial ini untuk melakukan operasi di Function Compute adalah operasi berisiko tinggi. Kami merekomendasikan agar Anda menggunakan Pengguna Resource Access Management (RAM) untuk memanggil operasi API atau melakukan O&M 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['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.
              // Hubungkan ke OSS.
              $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint, false, $securityToken);
              // Skala gambar ke lebar dan tinggi tetap 128px.
              $style = "image/resize,m_fixed,w_128,h_128";
              $process = $style.
                 '|sys/saveas'.
                 ',o_'.base64url_encode($targetObject).
                 ',b_'.base64url_encode($bucketName);
              // Ubah ukuran gambar dan simpan gambar yang diproses ke jalur tujuan.
              $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. Pada tab Code, klik Test Function.

    Setelah fungsi dieksekusi, Anda dapat melihat hasilnya di tab Code.

Tanya Jawab Umum

Referensi

  • Untuk informasi lebih lanjut tentang tipe peristiwa OSS yang dapat Anda konfigurasikan, lihat Ikhtisar Pemicu Peristiwa OSS.

  • Selain konsol Function Compute, Anda dapat menggunakan metode berikut untuk mengonfigurasi pemicu:

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

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

  • Pemicu

    • Jika Anda ingin memeriksa peristiwa apa 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 Memanggil Satu Sama Lain? dan Konfigurasikan Tujuan untuk Pemanggilan Asinkron.