全部產品
Search
文件中心

CloudFlow:整合Function Compute

更新時間:Oct 25, 2024

CloudFlow支援通過工作流程流程定義描述語言直接調用整合阿里雲服務。本文介紹CloudFlow如何通過整合Function Compute來調用函數。

背景資訊

CloudFlow以不同類型的狀態(State)作為基礎,基於狀態機器模型描述業務的流程,結合使用者佈建的API調用參數,完成流程(Flow)中每一個步驟的執行,最終完成整個工作流程的執行。

CloudFlow中成功的加入並調用指定函數,需遵循編排規範。更多資訊,請參見以下執行步驟的樣本資訊。

步驟一:選擇狀態類型

在流程中加入一個Task類型的狀態,然後根據Task類型的定義編排Function Compute。

Type: StateMachine
Name: MyWorkflow
SpecVersion: v1
StartAt: 調用函數樣本
States:
  - Name: 調用函數樣本
    Type: Task
    TaskMode: RequestComplete
    Action: FC:InvokeFunction
    Parameters:
      resourceArn: xxx
      invocationType: xxx
      body: xxx
    End: true

步驟二:配置調用參數

Function Compute調用包含標識函數資源的ARN,函數調用方式及函數調用參數三個主要的參數。詳細資料,如下表所示。

說明

按照Spec規範,參數的名稱為小寫開頭的駝峰格式。

參數名稱

是否必選

參數類型

參數說明

resourceArn

String

函數資源的ARN,用於唯一標識函數。

invocationType

Sync|Async

函數調用方式。

body

JSON對象或String等類型,最終通過序列化成位元組數組的方式傳遞給被調用的函數。

函數執行程式的Event入口參數。

範例程式碼如下。

Type: StateMachine
Name: MyWorkflow
SpecVersion: v1
StartAt: 同步調用函數樣本
States:
  - Name: 同步調用函數樣本
    Type: Task
    Action: FC:InvokeFunction
    TaskMode: RequestComplete
    Parameters:
      resourceArn: acs:fc:::services/myService1.LATEST/functions/myFunction1
      invocationType: Sync
      body:
        testKey: 函數event中testKey參數包含的內容
    Next: 非同步呼叫函數樣本
  - Name: 非同步呼叫函數樣本
    Type: Task
    Action: FC:InvokeFunction
    TaskMode: RequestComplete
    Parameters:
      resourceArn: acs:fc:::services/myService2.LATEST/functions/myFunction2
      invocationType: Async
      body:
        key1: value1
        key2: value2
    End: true

步驟三:設定整合模式

Task狀態支援一種特殊的屬性TaskMode,即整合模式,用於定義目前狀態對於API調用的處理行為。針對CloudFlowFunction Compute整合,目前支援以下三種類型的整合模式。

  • 請求響應(RequestComplete)

    表示函數調用正常請求響應返回之後即可進行下一個步驟的執行。該模式對函數的同步調用、非同步呼叫和非同步任務調用均有效。

  • 等待系統回調(WaitForSystemCallback)

    表示函數調用的請求完成之後,函數系統會發出系統回調通知。工作流程接收到通知之後才會進行下一個步驟的執行。該模式僅對函數的非同步呼叫和非同步任務調用有效。

  • 等待使用者自訂回調(WaitForCustomCallback)

    表示函數調用請求完成之後,工作流程會繼續保持等待狀態,直到使用者程式主動通過CloudFlow提供的回調通知API發送通知,CloudFlow接收到這一回調通知後,才會進行後續步驟的執行。該模式僅對函數的非同步呼叫和非同步任務調用有效。

關於函數調用的更多資訊,請參見同步調用非同步呼叫非同步任務

Type: StateMachine
Name: MyWorkflow
SpecVersion: v1
StartAt: 同步調用函數樣本
States:
  - Name: 同步調用函數樣本
    Type: Task
    Action: FC:InvokeFunction
    TaskMode: RequestComplete
    Parameters:
      resourceArn: acs:fc:::services/myService1.LATEST/functions/myFunction1
      invocationType: Sync
      body:
        testKey: 函數event中testKey參數包含的內容
    Next: 非同步呼叫函數樣本
  - Name: 非同步呼叫函數樣本
    Type: Task
    Action: FC:InvokeFunction
    TaskMode: RequestComplete
    Parameters:
      resourceArn: acs:fc:::services/myService2.LATEST/functions/myFunction2
      invocationType: Async
      body:
        key1: value1
        key2: value2
    End: true

使用者需要在body參數下,增加一個自訂參數 callbackToken ,並引用$Context.Current.TaskToken運算式。該運算式為回調任務執行結果時,必須使用的Token屬性。

步驟四:構造調用參數

實際的流程編排中,需要根據工作流程上下文,以及上一個流程狀態的結果來構造當前函數調用的參數。具體操作如下。

  • 可以利用Spec定義的一些保留字常量$Context$Input來訪問流程中的資料。

Type: StateMachine
Name: MyWorkflow
SpecVersion: v1
StartAt: 調用函數樣本
States:
  - Name: 調用函數樣本
    Type: Task
    TaskMode: RequestComplete
    Action: FC:InvokeFunction
    Parameters:
      resourceArn: acs:fc:::services/myService1.LATEST/functions/myFunction1
      invocationType: Sync
      body:
        argument1.$: $Input.input.BucketName
        argument2.$: $Input.input.TaskId
    End: true

步驟五:處理調用結果

每一個狀態的調用目的都是為整個流程服務,在函數調用的情境下,當我們完成調用之後,會返回執行結果。使用者可以使用返回結果作為流程條件判斷語句,也可以作為下一個狀態的輸入。根據Function ComputeInvokeFunction - 調用函數API定義,函數返回結果類型為Byte,對應實際的資料類型。函數內部傳回值可以是字串JsonObject、JsonArray或者各種基礎資料類型。流程調用接收到返回結果之後,會統一將結果封裝成一個JsonObject,在工作流程內部封裝的結構如下所示。

{
    "Body": "函數調用結果"
}

因此,您可以在工作流程的描述中通過$Output.Body的JsonPath訪問函數返回的結果。如果函數傳回值本身是一個JsonObject類型,可以在工作流程中直接調用內建函數還原序列化函數返回結果,按照JsonObject的操作訪問函數返回結果中的成員。

Type: StateMachine
Name: MyWorkflow
SpecVersion: v1
Description: ' '
StartAt: 調用函數樣本1
States:
  - Name: 調用函數樣本1
    Type: Task
    TaskMode: RequestComplete
    Action: FC:InvokeFunction
    Parameters:
      resourceArn: acs:fc:::services/myService1.LATEST/functions/myFunction1
      invocationType: Sync
      body:
        argument1.$: $Input.Records
        argument2.$: $Input.BucketName
    Next: 條件判斷
  - Type: Choice
    Name: 條件判斷
    Branches:
      - Condition: $Input.ObjectSize >= $Input.Threshold
        Next: 調用函數樣本2
    Default: 不做動作
  - Type: Pass
    Name: 不做動作
    End: true
  - Name: 調用函數樣本2
    Type: Task
    TaskMode: RequestComplete
    Action: FC:InvokeFunction
    Parameters:
      resourceArn: acs:fc:::services/myService2.LATEST/functions/myFunction2
      invocationType: Sync
      body:
        argument1.$: $Input.BucketName
        argument2.$: $Input.TaskId
    End: true

常見錯誤定義

  • FC.ResourceThrottled:您的函數因為並發度過高被限流。您所有的函數由一個總的並發度控制。Serverless 工作流程執行到任務類型節點時會同步調用Function Compute,此數值與其他調用方式的並發度共用。您可以申請調整該值。

  • FC.ResourceExhausted:您的函數因為資源不足被限流。當出現這類錯誤時,請聯絡我們

  • FC.InternalServerError:Function Compute出現系統錯誤,請重新執行流程。

  • FC.AccessDenied:禁止訪問,帳號許可權不足。

  • FC.InvalidArgument:參數無效。

  • FC.EntityTooLarge:函數的入參太大。

註: 更多Function Compute錯誤類型,請參見錯誤碼列表