
# 对接函数工作流调用无服务器服务
通过配置FunctionGraph连接器，实现AstroZero与华为函数工作流（FunctionGraph）对接，对接后可调用在函数工作流控制台开发的服务。
#### 背景信息
函数工作流（FunctionGraph）是华为云提供的一款无服务器（Serverless）计算服务，无服务器计算是一种托管服务，服务提供商会实时为您分配充足的资源，而不需要预留专用的服务器或容量，函数以弹性、免运维、高可靠的方式运行。此外，按函数实际执行资源计费，不执行不产生费用。更多关于函数工作流的介绍，请参见[函数工作流官方网站](https://support.huaweicloud.com/functiongraph/index.html)。
#### 场景描述
通过AstroZero的服务编排，调用在函数工作流控制台上创建的函数。
 #### 前提条件
参考[快速创建第一个FunctionGraph函数](https://support.huaweicloud.com/usermanual-functiongraph/functiongraph_01_0110.html)中操作，创建一个函数"hello"，函数代码如下：
```
exports.handler = async (event, context) => {
    const result = {
        "greetings": event.name + ", hello"
    }
    return result;
}
```
 #### 创建FunctionGraph服务连接器
1. 参考[创建连接器入口](https://support.huaweicloud.com/usermanual-astrozero/astrozero_05_0653.html#astrozero_05_0653__section54416265268)中操作，进入创建连接器页面。
2. 在左侧列表中，选择"HTTP \> FunctionGraph服务"，单击"+"。 
   图1创建FunctionGraph服务连接器   
   ![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001960126301.png "点击放大")
   
   
3. 设置基本信息，单击"下一步"。 
   - 标签：连接器的标签名，用于在页面展示。
   
   - 名称：连接器在系统中的唯一标识，创建后不可修改。
   
   - 图标：连接器的图标。
   
   - 描述：连接器的相关描述信息。
   
   
   
   
4. 配置对接信息，单击"保存"。 
   - 账号所在地区：函数工作流服务所在的区域，可以跨区域，即函数工作流和AstroZero可不在同一个区域。
   
   - 鉴权方式：访问函数工作流的鉴权方式。
     - 委托授权：通过创建委托，可以将函数工作流资源共享给AstroZero。选择该方式后，保存连接器设置时，在弹出的提示框单击"是"，即可访问函数工作流，不需要输入访问密钥对（AK/SK）。
     
     - AK/SK：通过IAM用户的访问密钥对（AK/SK）来进行鉴权。
      
   
   - 访问密钥ID：配置为访问密钥对中"Access Key Id"对应的值。请参考[获取AK/SK](https://support.huaweicloud.com/devg-apisign/api-sign-provide-aksk.html)中操作，获取AK（Access Key ID）、SK（Secret Access Key），即访问密钥对。
   
   - 访问密钥：配置为访问密钥对中"Secret Access Key"对应的值。请参考[获取AK/SK](https://support.huaweicloud.com/devg-apisign/api-sign-provide-aksk.html)中操作，获取AK（Access Key ID）、SK（Secret Access Key），即访问密钥对。
   
   
   
   
5. 配置动作，即要调用的函数。
   
   1. 在"动作列表"页签，单击"新建"。
   
   2. 在"基本信息"中，选择要调用的函数，如[前提条件]中创建的"hello"，设置动作的标签和名称，单击"下一步"。
   
   3. 配置消息头入参，该示例场景不需要配置消息头入参，单击"下一步"，删除第一行参数。 若此接口没有消息头输入参数，则不需要配置参数，请删除第一行参数。若有消息头输入参数，且有多个，请单击"+ 新增"。
      - 标签：消息头输入参数的标签名，用于在页面展示。
      
      - 名称：消息头输入参数在系统中的唯一标识，创建后不可修改。
      
      - 数据类型：消息头输入参数的数据类型。
        - 数字：数字类型。
        
        - 字符串：字符串类型。
        
        - 布尔值：布尔类型，取值为"true"和"false"。
         
      
      - 默认值：参数的默认取值。
      
      - 描述：消息头输入参数的描述信息。
      
      - 默认：参数是否有默认值。
      
      - 必填：参数是否必填。
      
      - 操作：单击![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001933046956.png)或![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001932887620.png)，可对Header输入参数，进行添加或删除操作。
       
   
   4. 配置输入参数。 如[图2]所示，该示例场景需要设置字符串类型的入参"name"。若此接口没有输入参数，则不需要配置参数，删除第一行参数。若有输入参数，且有多个，请单击"+ 新增"，并定义输入参数的基本信息。
      页面上方"消息体格式"参数使用说明：当方法为"PUT"或"POST"时，该参数才会显示。当第三方入参为数组类型或者非JSON类型时，需要将"输入消息体方式"设置为"值"形式。
      例如，若设置"消息体格式"为"键-值"，假设定义了输入参数A、B、C，调用时消息体中传递了参数 {A: 1,B:2, C:3} ，此时被调用方收到的参数信息是 {A: 1,B:2, C:3}。若设置"输入消息体方式"为"值"，此时默认使用$in输入参数定义，调用时消息体中传递了参数{$in: \[1,2,3\] }，此时被调用方收到的参数信息为\[1,2,3\]。
      图2输入参数配置页面   
      ![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001933047000.png "点击放大")
      - 标签：输入参数的标签名，用于在页面显示。
      
      - 名称：输入参数在系统中的唯一标识，创建后不可修改。
      
      - 参数位置：输入参数的位置。
      
      - 数据类型：输入参数的数据类型。
      
      - 命名空间：输入参数所属的命名空间。
      
      - 结构体类型：输入参数的结构体类型。
      
      - 对象：当"结构体类型"为对象时，需要设置具体的对象。
      
      - 默认值：参数默认取值。
      
      - 描述：参数是否有默认值。
      
      - 必填：输入参数是否必填。勾选后，表示是必填字段。
      
      - 集合：输入参数是否是数组型。勾选后，表示是数组型。
      
      - 操作：单击![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001960286117.png)或![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001960286129.png "点击放大")，可添加或删除输入参数。
       
   
   5. 配置输出参数，如[图3]所示，该示例场景需要设置字符串类型的出参"greetings"。
      若此接口没有输出参数，则不需要配置参数，请删除第一行参数。若有输出参数，且有多个参数，请单击"+ 新增"，并定义输出参数的基本信息。
      页面上方"消息体格式"参数使用说明：设置"输出消息体方式"为"值"后，系统会引入一个通用的出参变量"$out"，将body的内容存到"$out"中，作为出参。
      例如，若设置"消息体格式"为"键-值"，假设定义了输出参数A、B、C，调用后返回消息体中传递了参数 {A: 1,B:2, C:3} ，此时调用方收到的参数信息是 {A: 1,B:2, C:3}。若设置"输出消息体方式"为"值"，此时默认使用$out输出参数定义，调用业务接口返回消息体中传递了参数\[1,2,3\]，此时调用方收到的参数信息为{$out:\[1,2,3\]}。
      图3输出参数配置页面   
      ![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001933046964.png "点击放大")
      - 标签：输出参数的标签名，用于在页面展示。
      
      - 名称：输出参数在系统中的唯一标识，创建后不可修改。
      
      - 参数位置：设置参数的位置。
      
      - 数据类型：输出参数的数据类型。
      
      - 命名空间：输出参数所属的命名空间。
      
      - 结构体类型：设置结构体类型。
      
      - 对象：当"结构体类型"为对象时，需要设置具体的对象。
      
      - 描述：输出参数的描述信息。
      
      - 集合：输出参数是否是数组型。勾选后，表示是数组型。
      
      - 操作：单击![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001933046968.png)或![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001933047024.png)，可添加或删除输出参数。
       
   
   6. 设置完成后，单击"保存"。
   
   7. 单击该动作所在行的![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001960286133.png)，进行启用。
   
   
   
   
6. （可选）测试该函数。 
   1. 单击已创建的动作名称，进入动作详情页。
   
   2. 单击"测试"，设置如下输入参数，单击"测试"。
      ```
      {
      "name":"Lily"
      }
      ```
      返回[图4]中消息，说明函数执行成功。
      图4返回消息   
      ![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001960286125.png "点击放大") 
   
   
   
   
 
#### 在服务编排中调用连接器
在服务编排中，通过连接器图元调用在函数工作流控制台上，创建的函数。
1. 参考[如何开发服务编排](https://support.huaweicloud.com/usermanual-astrozero/astrozero_05_0601.html)中操作，创建一个服务编排。
   
   图5创建一个服务编排   
   ![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001932887600.png "点击放大")
   
   
2. 为服务编排设置入参和出参变量。 
   1. 在服务编排设计页面右侧，选择![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001933046976.png)。
   
   2. 在全局上下文页面，单击"变量"后的加号。
   
   3. 新建入参变量"name"、出参变量"greetings"，变量类型为"文本"，如[图6]所示。
      图6新建变量   
      ![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001933047020.png "点击放大") 
   
   4. 单击![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001960126321.png)，设置服务编排入参和出参。
      图7设置出入参   
      ![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001933046980.png "点击放大") 
   
   
   
   
3. 在服务编排设计页面左侧，选择"连接器 \> FunctionGraph"中，拖拽[创建FunctionGraph服务连接器]中创建的连接器至画布中，并连接图元。
   
   图8连接图元   
   ![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001960286093.png)
   
   
4. 设置动作参数。 
   图9设置动作参数   
   ![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001960126289.png "点击放大")
   - 动作：调用[5]配置的具体动作。
   
   - 输入参数：设置接口的输入参数。在"目标"中选择参数，在"源"中拖入全局上下文中的对应变量。
   
   - 输出参数：设置接口的输出参数。在"源"中选择参数，在"目标"中拖入全局上下文中的对应变量。
   
   
   
   
5. 单击页面上方的![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001932887612.png)，保存服务编排。
6. 保存成功后，单击![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001960286149.png)，运行服务编排。
7. 设置输入参数，单击"运行"。 
   ```
   {
       "name": "Lily"
   }
   ```
   若输出如下结果，表示成功调用函数。
   ```
   {
     "interviewId": "002N000000pjDj5T7Djk",
     "outputs": {
       "greetings": "Lily, hello"
     }
   }
   ```
   
   
#### 在脚本中调用连接器
在脚本中，调用已创建的连接器，实现调用在函数工作流控制台上创建的函数。
1. 参考[脚本开发实例](https://support.huaweicloud.com/usermanual-astrozero/astrozero_05_0630.html)中操作，创建一个脚本。
   
   图10新建一个空白脚本   
   ![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001960286105.png "点击放大")
   
   
2. 在脚本编辑器中，输入如下脚本代码。 
   ```
   import { Decimal } from "decimal";
   import { Error } from "error";
   import * as connector from "connector";
   export class Input {
       @action.param({ type: "String", required: true, description: "name" })
       name: string;
   }
   export class Output {
       @action.param({ type: "String", required: true })
       greetings: String;
   }
   export class Functiongraph {
       @action.method({ input: "Input", output: "Output", description: "do a operation" })
       run(input: Input): Output {
           let output = new Output();
           let client = connector.newClient("functiongraph", "LT927__test");
           let result = client.invoke("LT927__hello", input);
           console.log(result);
           output.greetings = result.greetings;
           return output;
       }
   }
   ```
   其中，"*LT927__* *test* "为连接器的名称，"*LT927__*hello"为动作名称。
   
   
3. 单击脚本编辑器页面上方的![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001932887564.png)，保存脚本。
4. 保存成功后，单击编辑器页面上方的![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001960126305.png)，执行脚本。
5. 在页面底部"输入参数"页签，设置输入请求参数，单击测试窗口右上角的![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001960126329.png)。
   
   ```
   {
       "name": "Lily"
   }
   ```
   若输出如下结果，表示成功调用函数。
   ```
   {
       "greetings": "Lily, hello"
   }
   ```
   
   
 
