云工作流支持通过工作流流程定义描述语言直接调用集成阿里云服务。本文介绍云工作流如何通过集成函数计算来调用函数。
背景信息
云工作流以不同类型的状态(State)作为基础,基于状态机模型描述业务的流程,结合用户设置的API调用参数,完成流程(Flow)中每一个步骤的执行,最终完成整个工作流的执行。
在云工作流中成功的加入并调用指定函数,需遵循编排规范。更多信息,请参见以下执行步骤的示例信息。
步骤一:选择状态类型
在流程中加入一个Task类型的状态,然后根据Task类型的定义编排函数计算。
StartAt: 调用函数示例
States:
- Name: 调用函数示例
Type: Task
TaskMode: RequestComplete
Action: FC:InvokeFunction
Parameters:
resourceArn: xxx
invocationType: xxx
body: xxx
End: true
步骤二:配置调用参数
函数计算调用包含标识函数资源的ARN,函数调用方式及函数调用参数三个主要的参数。详细信息,如下表所示。
按照Spec规范,参数的名称为小写开头的驼峰格式。
参数名称 | 是否必选 | 参数类型 | 参数说明 |
resourceArn | 是 | String | 函数资源的ARN,用于唯一标识函数。 |
invocationType | 是 | Sync|Async | 函数调用方式。 |
body | 否 | JSON对象或String等类型,最终通过序列化成字节数组的方式传递给被调用的函数。 | 函数执行程序的Event入口参数。 |
示例代码如下。
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调用的处理行为。针对云工作流与函数计算集成,目前支持以下三种类型的集成模式。
表示函数调用正常请求响应返回之后即可进行下一个步骤的执行。该模式对函数的同步调用、异步调用和异步任务调用均有效。
表示函数调用的请求完成之后,函数系统会发出系统回调通知。工作流接收到通知之后才会进行下一个步骤的执行。该模式仅对函数的异步调用和异步任务调用有效。
等待用户自定义回调(WaitForCustomCallback)
表示函数调用请求完成之后,工作流会继续保持等待状态,直到用户程序主动通过云工作流提供的回调通知API发送通知,云工作流接收到这一回调通知后,才会进行后续步骤的执行。该模式仅对函数的异步调用和异步任务调用有效。
关于函数调用的更多信息,请参见同步调用、异步调用和异步任务。
StartAt: 同步调用函数示例
States:
- Name: 同步调用函数示例
Type: Task
TaskMode: RequestComplete
Action: FC::InvokeFunction
Parameters:
resourceArn: acs:fc:::services/myService1.LATEST/functions/myFunction1
invocationType: Sync
body: myEvent
Next: 异步调用函数示例
- Name: 异步调用函数示例
Type: Task
TaskMode: WaitForUserCallback
Action: FC::InvokeFunction
Parameters:
resourceArn: acs:fc:::services/myService1.LATEST/functions/myFunction1
invocationType: Async
body:
payloadEvent: myEvent
callbackToken: $Context.Current.TaskToken
End: true
用户需要在body
参数下,增加一个自定义参数 callbackToken ,并引用$Context.Current.TaskToken
表达式。该表达式为回调任务执行结果时,必须使用的Token属性。
步骤四:构造调用参数
实际的流程编排中,需要根据工作流上下文,以及上一个流程状态的结果来构造当前函数调用的参数。具体操作如下。
可以利用Spec定义的一些保留字常量
$Context
和$Input
来访问流程中的数据。
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
Description: null
步骤五:处理调用结果
每一个状态的调用目的都是为整个流程服务,在函数调用的场景下,当我们完成调用之后,会返回执行结果。用户可以使用返回结果作为流程条件判断语句,也可以作为下一个状态的输入。根据函数计算的InvokeFunction - 调用函数API定义,函数返回结果类型为Byte,对应实际的数据类型。函数内部返回值可以是字符串JsonObject、JsonArray或者各种基础数据类型。流程调用接收到返回结果之后,会统一将结果封装成一个JsonObject,在工作流内部封装的结构如下所示。
{
"Body": 函数调用结果
}
因此,您可以在工作流的描述中通过$Output.Body
的JsonPath访问函数返回的结果。如果函数返回值本身是一个JsonObject类型,可以在工作流中直接调用内建函数反序列化函数返回结果,按照JsonObject的操作访问函数返回结果中的成员。
Type: Workflow
Name: shuhe-demo
SpecVersion: v1
Description: " "
Timeout: null
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 工作流执行到任务类型节点时会同步调用函数计算,此数值与其他调用方式的并发度共用。您可以申请调整该值。FC.ResourceExhausted
:您的函数因为资源不足被限流。当出现这类错误时,请联系我们。FC.InternalServerError
:函数计算出现系统错误,请重新执行流程。FC.AccessDenied
:禁止访问,账号权限不足。FC.InvalidArgument
:参数无效。FC.EntityTooLarge
:函数的入参太大。
注: 更多函数计算错误类型,请参见错误码列表。