调用函数

本文介绍调用函数组件的配置详情。此组件可以帮助您在流程中调用您在阿里云函数计算产品中的自定义函数。通过此组件,您可以在流程中实现自定义业务逻辑,如数据处理、远程服务调用、消息投递、数据存储等。

组件信息

组件图标

调用函数@1x (1)

组件名称

调用函数。

操作概述

使用函数计算组件时,需要开通阿里云函数计算服务并在函数计算产品中配置、设计函数,总体操作大致分为3步:

  1. 配置函数:在函数计算产品中配置函数。

  2. 设计函数:在函数计算产品中设计函数。

  3. 组件配置:配置流程中的调用函数组件,帮助您在流程中调用您在函数计算产品中的自定义函数,以实现自定义业务逻辑。

前提条件

已开通函数计算服务。

1. 配置函数

您可以参考以下步骤配置函数,需要先创建一个服务,然后在服务中根据主要配置创建函数。

  1. 进入函数计算控制台>服务及函数页面,并在页面顶部选择地域,建议该地域与流程所在地域保持一致。image

    说明

    若找不到服务及函数,请您尝试在页面右上角单击返回函数计算2.0,再次尝试。

  2. 单击创建服务,创建一个服务。创建完成后,会自动进入该服务的函数管理页面。

  3. 函数管理中创建一个函数,函数主要配置如下,其余可按需配置。image

    配置项

    选择

    配置图示

    函数代码-运行环境

    您可选择运行环境类型适合您的函数。

    image

    基本设置-请求处理程序类型

    处理HTTP请求。

    image

    高级设置-请求处理程序

    保持默认配置(index.handler)。

    image

    触发器配置-请求方法

    至少保留POST,流程会以POST方法请求您的函数。

    image

    触发器配置-禁用公网访问URL

    否,流程未部署在您的VPC内,需要通过公网访问您的函数。

    触发器配置-认证方式

    签名认证,流程会通过函数计算的签名方式保证调用参数的合法性,您无需额外配置签名规则。

2. 设计函数

直接使用流程编辑器的函数模板可以帮助您聚焦于自定义业务逻辑的实现,并快速部署一个简单的流程可用的函数。下面示例将通过Python类型的函数进行介绍。

  1. 创建一个运行环境为Python类型的函数,具体操作请参见创建函数,创建时,运行环境选择Python。image

  2. 函数详情页面的函数代码页签中,将默认的index.py文件内容替换为下列模板内容。该部分内容是兼容流程调用逻辑的WSGI处理程序,不包含您的自定义业务逻辑,您无需修改此文件中的函数及其内容。image

    import json
    from my import *
    
    
    # DO NOT CHANGE THIS ENTIRE FILE!
    
    # handle wsgi request
    # about wsgi: https://wsgi.readthedocs.io/en/latest/learn.html
    def handler(environ, start_response):
        # get request_body
        try:
            request_body_size = int(environ.get('CONTENT_LENGTH', 0))
        except ValueError:
            request_body_size = 0
    
        request_body = environ['wsgi.input'].read(request_body_size)
        print(request_body)
    
        # get path info
        path_info = environ['PATH_INFO']
        print(path_info)
    
        # load http triggering request to json
        # as flow node input args
        body = json.loads(request_body.decode('utf-8'))
    
        # do custom node process
        if path_info == '/handle_exec':
            output = handle_exec(body['variables'])
        elif path_info == '/handle_awake':
            output = handle_awake(
                body['asyncId'],
                body['async_event_data'],
                body['variables']
            )
        else:
            raise Exception('Invalid path ' + path_info)
    
        status = '200 OK'
        response_headers = [('Content-type', 'text/plain')]
        start_response(status, response_headers)
    
        return [json.dumps(output).encode('utf-8')]
  3. 新建脚本文件my.py(或您的自定义文件名),并将该文件通过from my import *导入上述index.py文件中。

  4. my.py文件内容添加为下列模板内容。

    说明

    以下模板实现了一个根据流程变量输入(random_number_length)进行对应长度的随机数字生成,并根据数字的奇偶性返回对应流程分支code(evenodd),同时输出两个变量至流程中(randomtype)的功能。

    import random
    
    
    # impl: py spi handle_exec
    def handle_exec(variables) -> dict:
        # translate fun request
        random_number_length = variables['random_number_length']
    
        random_number = generate_random_by_length(random_number_length)
        print("random generated as " + str(random_number))
    
        if (random_number % 2) == 0:
            number_type = "even"
        else:
            number_type = "odd"
    
        result = {
            'success': True,
            'message': 'OK',
            'await': False,
            'outputVariables': {
                'random': random_number,
                'type': number_type
            },
            'toBranchCode': number_type
        }
    
        return result
    
    
    # impl: py spi handle_awake
    def handle_awake(async_id, async_event_data, variables) -> dict:
        return {}
    
    
    def generate_random_by_length(random_number_length) -> int:
        length = int(random_number_length)
    
        start = 10 ** (length - 1)
        stop = 10 ** length
    
        print("from " + str(start) + "(inclusive) to " + str(stop) + "(exclusive)")
        return random.randrange(start, stop)

    无论您的自定义逻辑如何,my.py文件中下列两个函数是必须的。

    说明

    下列两个函数分别用于流程的调用和事件处理,如果您已在Chat Flow中配置了函数计算组件的事件处理,则无需再进行事件处理。

    def handle_exec(variables) -> dict
    def handle_awake(async_id, async_event_data, variables) -> dict

    无论您的自定义逻辑如何,上述两个函数的返回结构是固定的。

    • success:标识了该次函数调用是否成功,如果失败,流程会抛出错误并终止运行。

    • message:提示信息,可自定义。

    • await:是否仍需等待后续事件处理(如果您在流程中配置了函数计算组件的事件处理),一般情况下无需进行事件处理。如果为False,流程会采纳下列输出变量和分支code进行下一步处理。

    • outputVariables:输出至流程的变量名及其值,您可以在后续流程中引用这些变量。只有在await为False时才会被流程采纳。

    • toBranchCode:输出至流程的分支code(如果您在流程中配置了函数计算组件的多分支),流程会根据您返回的分支code以及您在流程编辑器中的流程配置决定后续走向。只有在await为False时才会被流程采纳。

    result = {
        'success': True,
        'message': 'OK',
        'await': False,
        'outputVariables': {
            'myVarExample1': 'a',
            'myVarExample2': 'b'
        },
        'toBranchCode': 'example'
    }

3. 组件配置

您可以参考以下操作,配置流程中的调用函数组件,帮助您在流程中调用您在函数计算产品中的自定义函数,以实现自定义业务逻辑。

  1. 前提条件

    您可以通过已存在的流程或者创建新的流程进入流程的画布编排页面。

    • 进入已存在的流程画布编排页面

      Chat App 消息服务控制台>流程编辑器>流程管理页签,单击需编辑的流程名称,进入流程的画布编排页面。

      image

    • 创建新的流程进入画布编排页面。具体操作请参见创建流程

  2. 单击画布上的调用函数组件图标,查看右侧组件配置区域。

    image

  3. 根据需求配置组件数据,详细配置说明请参见配置项说明

  4. 配置完成后,单击保存,在弹出的对话框中单击保存,完成保存。

    image

配置项说明

父配置项

子配置项

说明

示例图

运行设置

异步唤醒

开启后,支持触发和唤醒的异步调用。

image

异步超时等待时间

设置异步超时等待时间,单位:秒。

HTTP触发设置

URL

配置URL为您在函数计算控制台>服务及函数>函数管理>函数详情>触发器管理中的公网地址。

说明

初次使用时需点击授权链接授权我们调用您的函数。

image

Region

配置Region为您函数配置中ARN的第三段。可在函数计算控制台>服务及函数>函数管理>函数详情>函数配置中获取。

image

超时时间

自定义超时时间。

image

参数设置

-

如果需要,配置函数入参为您函数中接收的参数名,其值为常量或流程变量。

image

多分支设置

-

如果需要,配置函数多分支,分支Code对应为您函数中将返回的分支Code。如果您的函数返回了流程中未定义的分支Code,流程会进入Else分支。

image

响应设置

-

如果需要,配置函数输出作为流程变量,变量名需要和您函数中返回的变量名匹配。

image