天天看點

函數計算的正确使用姿勢——OSS 觸發器

前言

首先介紹下在本文出現的幾個比較重要的概念:

函數計算(Function Compute): 函數計算是一個事件驅動隻需編寫代碼并上傳。函數計算準備計算資源,以彈性伸縮的方式運作使用者代碼,而使用者隻需根據實際代碼運作所消耗的資源進行付費。函數計算更多資訊 參考

Fun: 是一個用于支援 Serverless 部署工具,能幫助您便捷地管理函數計算、API 網關、日志服務等資源。它通過一個資源配置檔案(template.yml),協助您進行開發、建構、部署操作。Fun 的更多文檔

通過本文的示例,你将了解:Fun 如何使用 OSS 觸發器連接配接 OSS 和函數計算。

事件源服務

函數計算的正确使用姿勢——OSS 觸發器

事件源服務是可以觸發函數的服務的集合,例如對象存儲 OSS,日志服務,API 網關,定時器(Timer)和 HTTP 請求等。事件發生時,承載觸發器的事件源服務決定是否運作您的函數。例如,當您建立一個 OSS PutObject 觸發器後,上傳對象到指定的 OSS Bucket 就是一次事件,繼而觸發對應函數,這個過程中 OSS 就是事件源服務。函數計算具有豐富的事件源來實作您的各種自定義化的需求。如需了解更多,請參照

連結

Fun 配置并部署 OSS 觸發器

函數計算觸發器描述了一組規則,當某個事件滿足這些規則,事件源就會觸發相應的函數。阿裡雲對象存儲和函數計算無縫內建。您可以為各種類型的事件設定處理函數,當OSS系統捕獲到指定類型的事件後,會自動調用函數處理。

Fun 通過一個資源配置檔案(template.yml),協助您進行開發、建構、部署。是以我們在 yml 中按照

規範

去描述 OSS 觸發器:

Events:
  oss-trigger-name:
    Type: OSS # trigger type
    Properties:
      BucketName: coco-superme # oss bucket name
      Events:
        - oss:ObjectCreated:*
        - oss:ObjectRemoved:DeleteObject        
      Filter: 
        Key:
          Prefix: source/
          Suffix: .png           
  • oss-trigger-name:為使用者自定義的 觸發器(trigger)名稱,名稱不允許重複.
  • Type:為事件源集合中的一種,表示事件源類型。Fun 支援的類型請 參閱 。本 yml 為 OSS。
  • BucketName: oss bucket name,建立 OSS bucket,
  • Events:為 OSS 事件類型。
  • Filter:filter為 OSS 對象過濾參數,滿足過濾條件的 OSS 對象才可以觸發函數,包含如下屬性:
    • Key:過濾器支援過濾對象鍵(Key),包含如下屬性:
      • Prefix:比對字首
      • Suffix:比對字尾

一個被存入OSS的檔案,如果它是以

source/

為字首,并且字尾是

.png

的檔案,并且由使用者自定義的事件(evens)觸發後,OSS 就會自動的調用相應的函數進行處理。示例完整

代碼

執行

fun deploy

,即可建立、配置并部署好相關服務:

using region: cn-shanghai
using accountId: ***********8320
using accessKeyId: ***********mTN4
using timeout: 10

Waiting for service oss-test-service to be deployed...
        Waiting for function oss-test-function to be deployed...
                Waiting for packaging function oss-test-function code...
                package function oss-test-function code done
                Waiting for OSS trigger oss-trigger-name to be deployed...
                function oss-trigger-name deploy success
        function oss-test-function deploy success
service oss-test-service deploy success

PS D:\fun\examples\oss-trigger>           

然後我們去函數計算控制台檢視我們剛剛定義的 OSS 觸發器:

函數計算的正确使用姿勢——OSS 觸發器

可見,名為 oss-trigger-name 的 OSS 觸發器已經建立成功,是不是既簡單又友善。

注意事項

配置混淆

當我們部署時,出現如下日志:

函數計算的正确使用姿勢——OSS 觸發器

說明在 fc 控制台中配置的觸發器 oss 觸發器名稱與本地配置不比對。即:FC 控制台配置的觸發器集合不在本地配置的觸發器之内。fun 不會修改這個觸發器。你可以通過控制台删除這個必要時通過 FC 控制台手動觸發。

循環觸發

使用 OSS 觸發器一定要避免 循環觸發。一個典型的循環觸發場景是 OSS 的某個 Bucket 上傳檔案觸發函數執行,這個函數又生成了一個或多個檔案,又寫回到 OSS 的 Bucket 裡,這個寫入動作又觸發了函數執行,形成了鍊狀循環。

上述過程類似于一個無限遞歸,為了避免這種循環觸發函數産生不必要的費用,強烈建議您配置前/字尾,例如将觸發函數的 Bucket 目錄字首設定成

src/

,生成的檔案寫入的目錄字首設定為 

dst/

,這樣生成的檔案就不會再次觸發函數。

總結

  • 在 yml 檔案定義 OSS 觸發器,所有屬性為必填。
  • 當 OSS 系統捕獲到相關事件後,會将事件資訊編碼為 JSON 字元串,傳遞給事件處理函數,您可以在代碼中擷取事件資訊。此處相關本文不做贅述,感興趣的同學可以檢視 相關文檔
  • 隻要配置無誤,您隻需要專注于函數邏輯的編寫,系統将以實時的、可靠的、大規模并行的方式處理海量的資料