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調用的處理行為。針對CloudFlow與Function Compute整合,目前支援以下三種類型的整合模式。
表示函數調用正常請求響應返回之後即可進行下一個步驟的執行。該模式對函數的同步調用、非同步呼叫和非同步任務調用均有效。
表示函數調用的請求完成之後,函數系統會發出系統回調通知。工作流程接收到通知之後才會進行下一個步驟的執行。該模式僅對函數的非同步呼叫和非同步任務調用有效。
等待使用者自訂回調(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 Compute的InvokeFunction - 調用函數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錯誤類型,請參見錯誤碼列表。