全部產品
Search
文件中心

Function Compute:使用事件函數處理雲端服務產生的事件

更新時間:Oct 10, 2025

事件函數可以響應雲端服務產生的各種事件(如檔案上傳至Object Storage Service、監控產品觸發的警示等)。使用事件函數時,您只需編寫處理邏輯代碼,無需關注額外的事件整合、也無需購買及管理底層計算資源。此外,Function Compute僅在需要時運行執行個體並自動擴充,事件處理完畢後會自動銷毀執行個體,您只需按照資源使用量付費。

情境樣本

您有一些檔案需要儲存到OSS。為了加速上傳,您先將檔案壓縮為ZIP格式再上傳,在使用時希望直接使用檔案而不是ZIP包,因此需要一個自動化流程將檔案解壓並儲存回OSS。

採用傳統實現方法時,您需要構建並整合多個程式,以監控和處理OSS上的檔案變動,同時還要考慮這些程式的部署和維護問題。而使用事件函數實現,您可以專註於檔案處理常式。每當檔案上傳至OSS時都會產生事件,如果事件符合您設定的條件,函數將自動觸發並運行您的處理常式,並在完成後自動釋放計算資源,以節省開銷。

考慮到您當前可能沒有OSS Bucket,本文將通過下面的樣本帶您體驗事件函數的實現流程:

建立一個類比OSS檔案上傳的事件,該事件會調用一個事件函數來進行檔案處理,並在控制台列印出檔案名稱、所在Bucket等資訊。

通過實現這個樣本,您將體驗到以下內容:

  1. 用控制台完成建立事件函數、編寫請求處理常式、測試函數的完整流程;

  2. 瞭解Function Compute運行環境、內建運行時等關鍵概念;

  3. 瞭解請求處理常式中的請求參數eventcontext

前提條件

註冊阿里雲帳號

註冊阿里雲帳號並完成實名認證。

開通Function Compute服務

如果您是2024年08月27日之後註冊的阿里雲帳號並完成實名認證,無需開通可直接使用Function Compute產品。首次登入Function Compute控制台,還可以根據介面提示領取一定額度的免費資源套件,詳情請參見試用額度

2024年08月27日之前註冊的阿里雲帳號請參見以下步驟開通服務。

  1. 訪問Function Compute首頁

  2. 單擊控制台,跳轉至開通服務頁面,單擊立即開通即可開通服務並進入Function Compute控制台

    說明
    • 建議您使用阿里雲帳號開通服務,並使用RAM使用者管理函數等應用。您可以按照最小授權原則為RAM使用者授予業務要求的權限策略,具體請參見權限原則及樣本

  3. (可選)首次登入Function Compute控制台,需要在彈出的阿里雲服務授權對話方塊單擊確定建立服務關聯角色,便於後續使用Function Compute訪問相關雲端服務。

    建立成功後,Function Compute即可訪問您的VPC、ECS、SLS及Container Registry等雲資源。關於服務關聯角色的詳細資料,請參見服務關聯角色

操作指引

1. 選擇函數類型

  1. 登入Function Compute控制台,在左側導覽列,選擇函數管理 > 函數列表,在頂部功能表列,選擇您想要建立函數的地區,單擊建立函數,然後根據介面提示選擇並建立事件函數

2. 選擇運行環境

Python

運行環境請選擇內建運行時-Python-Python 3.10

image

對於事件函數推薦您搭配內建運行時作為函數運行環境,這是因為內建運行時包括了響應其他雲產品事件所必需的依賴(例如Python的oss2模組),更多資訊請參見環境說明。如果使用自訂運行時自訂鏡像作為函數運行環境,還需要自行安裝所需依賴。關於各種運行環境的詳細對比,請參見運行時環境對比

Node.js

運行環境請選擇內建運行時-Node.js-Node.js 20

image

對於事件函數推薦您搭配內建運行時作為函數運行環境,這是因為內建運行時包括了響應其他雲產品事件所必需的依賴(例如Node.js的ali-oss模組),更多資訊請參見環境說明。如果使用自訂運行時自訂鏡像作為函數運行環境,還需要自行安裝所需依賴。關於各種運行環境的詳細對比,請參見運行時環境對比

3. 建立函數

選擇Hello, world!樣本建立函數,進階配置保持預設值,單擊建立,然後等待函數建立完成。

image

建立完成後,可以在代碼頁簽的WebIDE中查看產生的範例程式碼,下圖以Python為例。

image.png

Hello, world範例程式碼會自動產生帶有入口程式的函數模板,您可以直接在此模板基礎上通過後續步驟構建您的業務代碼。

4. 修改範例程式碼並部署

Python、Node.js等解釋性語言支援在WebIDE中直接修改代碼並部署,而Java等編譯性語言只支援本地編譯程式碼封裝然後上傳,不支援WebIDE。

Python

在控制台的WebIDE中開啟index.py,將當前代碼替換為以下代碼,然後單擊部署代碼使修改的代碼生效。

index.py

# -*- coding: utf-8 -*-
import logging
import json
# import oss2  # 如果您需要建立OSS用戶端,請放開該注釋
logger = logging.getLogger()


def handler(event, context):  # 請求處理常式是代碼執行的入口
    logger.info("正在解析事件資訊...")
    input_events = json.loads(event)
    if not input_events.get('events'):  # 檢查傳入event的格式
        raise Exception("事件格式錯誤: events數組不存在或長度為0")
    event_obj = input_events['events'][0]
    bucket_name = event_obj['oss']['bucket']['name']  # 解析OSS Bucket名稱
    object_name = event_obj['oss']['object']['key']  # 解析檔案名稱
    region = context.region  # 解析函數所在地區
    logger.info(f"OSS bucket名稱為{bucket_name}, 檔案名稱為{object_name}, Region為{region}")
    # 如果您已經有OSS Bucket,可以放開下面的注釋,建立一個OSS用戶端執行個體
    # bucket = get_bucket(region, bucket_name, context)
    bucket = None
    result = process_event(bucket, object_name)  # 調用子程式執行事件處理邏輯
    return result


def process_event(bucket, object_name):
    logger.info("開始事件處理...")
    # 此處您可以編寫事件處理邏輯
    # zip_file = download_file(bucket, object_name)
    # result = extract_and_upload(bucket, zip_file)
    logger.info("完成事件處理...")
    result = 0
    return result  # 返回0表示事件處理成功


# def get_bucket(region, bucket_name, context):
#     # 此處建立一個OSS Bucket用戶端執行個體,所需的身份認證資訊可以從context中擷取
#     creds = context.credentials  # 擷取臨時密鑰
#     auth = oss2.StsAuth(
#         creds.access_key_id,
#         creds.access_key_secret,
#         creds.security_token)
#     endpoint = f'oss-{region}-internal.aliyuncs.com'
#     bucket = oss2.Bucket(auth, endpoint, bucket_name)
#     return bucket


# def download_file(bucket, object_name):
#     # 此處是從OSS下載檔案的範例程式碼
#     try:
#         file_obj = bucket.get_object(object_name)
#         return file_obj
#     except oss2.exceptions.OssError as e:
#         logger.error(f"檔案下載失敗 {e}")


# def extract_and_upload(bucket, file_obj):
#     # 您可以在此定義解壓並上傳檔案至OSS的邏輯
#     return 0;

瞭解函數代碼

  • def handler(event, context):

    • handler:這個Python函數是請求處理常式,您的代碼中可能包含多個Python函數,但請求處理常式始終是代碼執行的入口。修改代碼時請保持請求處理常式的名稱不變,Function Compute才能夠正確識別。詳細資料,請參見什麼是請求處理常式

      image

    • event:當事件觸發函數時,通過event參數傳入事件相關資訊(如OSS檔案上傳事件中的Bucket名稱、檔案名稱等)。該參數格式為JSON對象。如需瞭解各類事件的event包含哪些資訊,請參見觸發器event格式

    • context:函數啟動並執行內容物件通過context參數傳遞給函數,包含有關調用、函數配置和身份認證等資訊。其中身份認證資訊來源於函數配置的角色許可權,為函數配置角色後,FC通過AssumeRole擷取一個臨時密鑰(STS Token),然後通過context對象中的credentials欄位將臨時密鑰傳遞給您的函數,詳見使用函數角色授予Function Compute訪問其他雲端服務的許可權。如需瞭解內容物件包含哪些資訊,請參見上下文

  • logger.info():您可以使用程式設計語言的標準日誌記錄功能輸出日誌,例如Python語言中,使用logging模組等方法將資訊輸出到日誌,本文樣本使用語句列印Bucket名稱、檔案名稱和Region地區名稱。調用函數結束後,可以通過控制台查看日誌輸出。更多資訊,請參見日誌

Node.js

在控制台的WebIDE中開啟index.mjs,將當前代碼替換為以下代碼,然後單擊部署代碼使修改的代碼生效。

index.mjs

'use strict';
// import OSSClient from 'ali-oss'; // 如果您需要建立OSS用戶端,請放開該注釋

export const handler = async (event, context) => { // 請求處理常式是代碼執行的入口
  console.log("正在解析事件資訊...");
  const inputEvents = JSON.parse(event);
  if (!Array.isArray(inputEvents.events) || inputEvents.events.length === 0) { // 檢查傳入event的格式
    throw new Error("事件格式錯誤: events數組不存在或長度為0");
  }
  const eventObj = inputEvents.events[0];
  const bucketName = eventObj.oss.bucket.name; // 解析OSS Bucket名稱
  const objectName = eventObj.oss.object.key; // 解析檔案名稱
  const region = context.region;  // 解析函數所在地區
  console.log(`OSS bucket名稱為${bucketName}, 對象檔案名稱為${objectName}, Region為${region}`);
  // 如果您已經有OSS Bucket,可以放開下面的注釋,建立一個OSS用戶端執行個體
  // const bucket = getBucket(region, context)
  const bucket = null;
  const result = processEvent(bucket, objectName); // 調用子程式執行事件處理邏輯
  return result;
};


async function processEvent (bucket, objectName) {
  console.log("開始處理事件...");
  // 此處您可以編寫事件處理邏輯
  // const zipFile = downloadFile(bucket, objectName);
  // const result = extractAndUpload(bucket, zipFile);
  console.log("完成事件處理");
  const result = 0;
  return result;
}


// function getBucket (region, context) {
//   // 此處建立一個OSS Bucket用戶端執行個體,所需的身份認證資訊可以從context中擷取
//   const bucket = new OSSClient({
//     region: region,
//     accessKeyId: context.credentials.accessKeyId,
//     accessKeySecret: context.credentials.accessKeySecret,
//     securityToken: context.credentials.securityToken
//   });
//   return bucket;
// }


// async function downloadFile (bucket, objectName) {
//   try {
//     // 從OSS下載檔案的範例程式碼
//     const result = await bucket.get(objectName, objectName);
//     console.log(result);
//     return result;
//   } catch (e) {
//     console.log(e);
//   }
// }

// async function extractAndUpload (bucket, zipFile) {
//     // 您可以在此定義解壓並上傳檔案至OSS的邏輯
//     return 0;
// }

瞭解函數代碼

  • export const handler = async (event, context)

    • handler:這個Node.js函數是請求處理常式,您的代碼中可能包含多個Node.js函數,但請求處理常式始終是代碼執行的入口。修改代碼時請保持請求處理常式的名稱不變,Function Compute才能夠正確識別。詳細資料,請參見什麼是請求處理常式

      2025-01-23_15-42-21 (1)

    • event:當事件觸發函數時,通過event參數傳入事件相關資訊(如OSS檔案上傳事件中的Bucket名稱、檔案名稱等)。該參數格式為JSON對象。如需瞭解各類事件的event包含哪些資訊,請參見觸發器event格式

    • context:函數啟動並執行內容物件通過context參數傳遞給函數,包含有關調用、函數配置和身份認證等資訊。其中身份認證資訊來源於函數配置的角色許可權,為函數配置角色後,FC通過AssumeRole擷取一個臨時密鑰(STS Token),然後通過context對象中的credentials欄位將臨時密鑰傳遞給您的函數,詳見使用函數角色授予Function Compute訪問其他雲端服務的許可權。如需瞭解內容物件包含哪些資訊,請參見上下文

  • console.log():您可以使用程式設計語言的標準日誌記錄功能輸出日誌,例如Node.js語言中,使用console模組將資訊輸出到日誌,本文樣本使用語句列印Bucket名稱、檔案名稱和Region地區名稱。調用函數結束後,可以通過控制台查看日誌輸出。更多資訊,請參見日誌

5. 測試函數

為了類比檔案上傳到OSS觸發函數的情境,我們將定義一個類比事件,並使用該事件觸發函數。

除了使用類比事件測試,您也可以使用真實的OSS事件觸發函數來測試,詳情請參見進階操作
  1. 建立類比事件:在函數詳情頁面,單擊代碼頁簽,單擊測試函數右側的下拉框,選擇配置測試參數。在事件模板中選擇Object Storage Service,將自動產生一個類比事件,該事件的格式與真實OSS事件的格式相同。

    您可以自訂事件名稱和事件對象中的參數值(例如OSS Bucket名稱和檔案名稱)。完成後單擊確定

    image

    OSS類比事件樣本

    上方截圖中的樣本事件內容如下,您可以將其粘貼到測試參數的文字框中,然後進行後續操作。

    {
        "events": [
            {
                "eventName": "ObjectCreated:PutObject",
                "eventSource": "acs:oss",
                "eventTime": "2024-08-13T06:45:43.000Z",
                "eventVersion": "1.0",
                "oss": {
                    "bucket": {
                        "arn": "acs:oss:cn-hangzhou:164901546557****:test-bucket",
                        "name": "test-bucket",
                        "ownerIdentity": "164901546557****"
                    },
                    "object": {
                        "deltaSize": 122539,
                        "eTag": "688A7BF4F233DC9C88A80BF985AB****",
                        "key": "source/example.zip",
                        "size": 122539
                    },
                    "ossSchemaVersion": "1.0",
                    "ruleId": "9adac8e253828f4f7c0466d941fa3db81161****"
                },
                "region": "cn-hangzhou",
                "requestParameters": {
                    "sourceIPAddress": "140.205.XX.XX"
                },
                "responseElements": {
                    "requestId": "58F9FF2D3DF792092E12044C"
                },
                "userIdentity": {
                    "principalId": "164901546557****"
                }
            }
        ]
    }
  2. 代碼頁簽,單擊測試函數,將立即觸發函數執行。執行成功後查看返回結果,範例程式碼返回0代表事件處理成功。單擊日誌輸出,查看函數執行過程中輸出的日誌資訊。

    測試函數時,Function Compute會將類比事件的內容通過event參數傳遞給請求處理常式handler,並執行您在前一步驟中定義的代碼,即解析event參數並處理檔案。

    image.png

6. (可選)清理資源

Function Compute按照實際資源使用量進行計費,已建立的函數資源如果不使用不會產生費用。但請留意您建立函數資源時關聯的其他雲產品或資源,例如儲存在OSS和NAS的資料。

如果您希望刪除函數,請登入Function Compute控制台,選擇函數管理 > 函數列表,選擇地區,在目標函數的操作列,單擊刪除,然後在彈出的對話方塊,確認要刪除的函數已無任何觸發器等綁定資源後,再次確認刪除。

進階操作

現在您已經通過控制台建立了一個事件函數、修改了請求處理常式、並使用類比event測試了函數。您可以根據業務需求,參考以下進階操作:

  • 添加觸發器:

    • 考慮到您可能沒有OSS Bucket,本文中的樣本採用類比OSS檔案上傳事件的方式進行測試。如果您後續想要應用到您的實際業務中,您需要為函數添加一個OSS觸發器,請參見配置原生OSS觸發器

    • 除了Object Storage Service,許多阿里雲服務(如多款訊息佇列、Tablestore、SLS等)的事件也可以觸發Function Compute。請參見觸發器簡介,瞭解支援的觸發器列表。

  • 添加依賴:雖然內建運行時包含了事件處理過程中涉及的常用依賴庫,但是在您的實際業務中可能仍然不滿足要求,這時最簡單的辦法是將代碼以及額外的依賴庫打包到一個ZIP檔案中作為程式碼封裝,上傳並部署到Function Compute,具體請參見部署程式碼封裝。如果您想減少程式碼封裝的體積以加速函數的冷啟動,可以通過層來管理依賴,詳情請參見建立自訂層

  • 配置日誌:為了便於對函數進行調試、排查問題或滿足安全審計等需求,建議您為函數配置日誌,詳細步驟請參見配置日誌功能

相關文檔