从 Azure 逻辑应用 的工作流中调用 Azure 函数

适用于:Azure 逻辑应用(消耗 + 标准)

若要使用执行高级计算或处理动态数据的自定义代码扩展工作流,请在Azure 逻辑应用中的工作流Azure Functions中创建和调用函数。 在Azure Functions中创建函数时,可以完成如下所示的任务:

  • 运行使用 C# 或 Node.js创建的函数。
  • 在工作流中执行高级计算。
  • 在工作流中应用高级格式或计算字段。

本指南演示如何在 Azure 逻辑应用 中从消费计划工作流或标准计划工作流调用和运行 Azure Functions 函数。 你还将了解使用Azure Functions的先决条件、限制和提示,以确保无缝集成和最佳性能。

小窍门

若要在不使用Azure Functions的情况下运行代码,请参阅:

有关详细信息,请参见:

限制

若要使Azure Functions在工作流中正常运行,请查看以下限制:

  • 函数应用资源必须使用.NET或 Node.js 运行时堆栈。

  • 函数必须用 C# 或 JavaScript 代码编写。

  • 函数必须使用 HTTP 触发器 模板。

    HTTP 触发器模板可以接受和处理包含application/json类型的内容作为工作流的输入。 将Azure函数添加到工作流时,工作流设计器会显示Azure订阅中使用此模板创建的任何可用自定义函数。

  • 函数不能使用自定义路由,除非它们也有相应的 OpenAPI 定义。

    如果函数具有 OpenAPI 定义,则工作流设计器在处理函数参数时提供更丰富的体验。 在工作流查找和访问具有 OpenAPI 定义的函数之前, 请按照以下步骤设置函数应用。

  • 对于Azure函数调用身份验证,只有消耗工作流支持使用 Microsoft Entra ID 进行托管标识身份验证。 有关详细信息,请参阅如何为Azure函数调用启用身份验证。

    标准工作流不支持托管标识身份验证。

  • Azure 逻辑应用不支持在启用部署槽位的情况下使用Azure Functions。

    尽管这种情况有时可能起作用,但此行为不可预知,当工作流尝试调用Azure函数时,可能会导致授权问题。

先决条件

  • Azure 帐户和订阅。 获取Azure帐户。

  • Azure 函数应用资源,可以包含一个或多个Azure函数。

    请确保函数应用资源和逻辑应用资源位于同一Azure订阅中。

  • 要从工作流调用的 Azure 函数。

    • 若要创建此函数,请使用以下任何工具:

    • 函数代码必须包含要在函数完成后返回到工作流的响应和有效负载。

      本指南使用名为 FabrikamAzureFunction 的以下示例函数。 此示例函数中的 对象是指工作流通过名为 Request Body,稍后将在本指南中解释:

      module.exports = function (context, data) {
      
         var input = data;
      
         // Function processing logic
         // Function response for later use
         context.res = {
            body: {
              content:"Thank you for your feedback: " + input
            }
         };
         context.done();
      }
      

      要从函数内访问 context 对象的属性,请使用以下语法:

      context.body.<property-name>

      例如,若要引用 content 对象中的 context 属性,请使用以下代码:

      context.body.content

      此代码还包含一个 input 变量,此变量存储来自 data 参数的值,因此函数可对该值执行操作。 在 JavaScript 函数中,变量 data 也是 context.body 的快捷方式。

      注意

      body此处提到的属性适用于context对象,与操作输出中的Body值不同,也可以传递给您的函数。

  • 以任何触发器开始的消耗型或标准逻辑应用工作流。

    本指南中的示例使用 Office 365 Outlook 触发器,该触发器的名称为 新电子邮件到达时。

  • 若要创建并调用调用另一个工作流的Azure函数,请确保辅助工作流以提供可调用终结点的触发器开头。

    例如,可以使用常规 HTTP 或 Request 触发器启动工作流, 或者,可以使用基于服务的触发器,例如 Azure Queues 或 Event Grid。 在函数内,向触发器的 URL 发送一个 HTTP POST 请求,并加入需要辅助工作流处理的有效负载。 有关详细信息,请参阅调用、触发器或嵌套逻辑应用工作流。

Azure Functions 使用技巧

使用 OpenAPI 定义查找函数

要设置函数应用以使工作流可查找和使用具备 OpenAPI 定义的函数,请按照以下步骤操作:

  1. 在 Azure 门户中,打开函数应用。 确保函数应用正在运行。

  2. 在函数应用中配置跨域资源共享(CORS),以允许所有源。 执行以下步骤:

    1. 在函数应用边栏上,展开 API,然后选择 CORS。

    2. 在 “允许的源”下,添加星号 \ 通配符,删除列表中的任意源,然后选择“ 保存”。

      Screenshot 显示 Azure 门户、函数应用和 CORS 窗格,其中在

访问 HTTPS 请求中的属性值

基于 Webhook 的函数可以接受 HTTPS 请求作为输入并将这些请求传递给其他函数。

例如,尽管Azure 逻辑应用具有转换 DateTime 值的 函数,但你可以访问传递给函数的请求对象中的属性,并对该属性值执行操作。

此基本示例 JavaScript 函数使用 dot (.) 运算符 访问对象中的属性:

function convertToDateString(request, response){
   var data = request.body;
   response = {
      body: data.date.ToDateString();
   }
}

以下步骤描述了此函数中发生的情况:

  1. 该函数创建一个data变量,并将对象(该对象中body)分配给request该变量。 若要引用 body 对象中的 request 对象,该函数使用 dot (.) 运算符:

    var data = request.body;
    
  2. 该函数现在可以通过date变量访问data属性。

    该函数通过调用函数将属性值从 DateTime 类型转换为 ToDateString() 类型。 该函数通过 body 函数响应中的属性返回结果:

    body: data.date.ToDateString();
    
  3. 在 Azure Functions 中创建函数后,请按照 步骤将Azure函数添加到工作流。

将 URI 参数传递给函数

若要将 URI 参数传递给函数,请在函数的终结点 URL 中使用查询参数。

  1. 在打开函数信息窗格的工作流设计器中,从 “高级参数 ”列表中选择“ 查询”。

    此时会显示一个表格,可输入参数作为键值对。

  2. 输入参数的键值对,例如:

    显示包含“查询”参数和示例键值输入的函数信息窗格的屏幕截图。

将函数添加到工作流(消耗型 + 标准工作流)

若要从工作流调用Azure函数,请添加该函数,就像工作流设计器中的其他任何操作一样。

  1. 在 Azure 门户中,打开消费逻辑应用程序资源。 在设计器中打开工作流。

  2. 在设计器中,按照常规步骤添加Azure Functions操作,名为选择 Azure 函数。

  3. 在“添加操作”窗格中,执行以下步骤:

    1. 从函数应用列表中,选择您的函数应用。

    2. 选择函数,然后选择添加操作,例如:

      屏幕截图显示“消费工作流设计器”,其中选择了一个应用函数与一个函数以添加操作。

  4. 显示函数的信息框后,请执行以下步骤:

    1. 对于 请求正文,请输入函数的输入,该输入必须使用 JavaScript 对象表示法(JSON)对象的格式,例如:

      {"context": <selected-input> }

      此输入是工作流发送到函数的上下文对象的有效负载或消息。

      • 若要从工作流中前面的步骤中选择输出值,请在 “请求正文 ”框中选择,然后选择打开动态内容列表(闪电图标)的选项。

      • 若要创建表达式,请在 “请求正文 ”框中选择,然后选择打开表达式编辑器(函数图标)的选项。

      以下示例将一个带有 content的 JSON 对象以及来自电子邮件触发器的 From 输出值指定为 请求正文 值:

      显示具有函数上下文对象有效负载的请求正文示例的消耗工作流的屏幕截图。

      在这种情况下,上下文对象不会被转换为字符串。 对象的内容直接添加到 JSON 有效负载中。 下图显示了已完成的示例:

      显示消耗工作流和具有函数上下文对象有效负载的已完成请求正文示例的函数的屏幕截图。

      如果输入的上下文对象是传递字符串、JSON 对象或 JSON 数组的 JSON 令牌以外的上下文对象,则会收到错误。 但是,可以通过将标记括在引号 (“ ) 中,将上下文对象强制转换为字符串。 例如,如果要使用 “接收时间” 输出值:

      显示“消耗工作流”的屏幕截图,其中包含将上下文对象转换为字符串的请求正文示例。

    2. 若要输入其他信息(例如要使用的方法、请求标头、查询参数或身份验证),请打开 “高级参数 ”列表,然后选择所需的参数。

      身份验证的选项因所选函数而异。 有关详细信息,请参阅 为函数启用身份验证。

为 Azure 函数调用启用身份验证(仅限消费工作流)

您的消费工作流可以使用手动创建的用户分配的托管标识,用于对 Azure 函数的调用进行身份验证,并访问受 Microsoft Entra ID 所保护的资源。 托管标识无需登录并提供凭据或机密即可对访问权限进行身份验证。 Azure为你管理此标识,并帮助保护凭据安全,因为无需管理凭据或轮换机密。

对于此方案,需要在逻辑应用资源级别设置用户分配的托管标识。 工作流对 Azure 函数的调用使用此托管标识进行身份验证。

有关详细信息,请参见:

若要设置函数应用和函数,使它们使用您的消费计划逻辑应用资源的托管标识,请遵循以下高级步骤:

  1. 为逻辑应用资源启用和设置托管标识。

  2. 设置函数以进行匿名身份验证。

  3. 查找设置Microsoft Entra身份验证所需的值。

  4. 为函数应用创建应用注册。

设置函数以进行匿名身份验证(仅限消耗型工作流)

若要使函数使用消耗逻辑应用资源的托管标识,请将函数的身份验证级别设置为 匿名。 否则,工作流会抛出 BadRequest 错误。

  1. 在 Azure 门户中,打开函数应用。

    以下步骤使用名为 FabrikamFunctionApp 的示例函数应用。

  2. 在函数应用边栏上的 “开发工具”下,选择“ 高级工具>转到”。

    显示函数应用菜单已选择“高级工具”和“Go”的屏幕截图。

  3. 若要确认要离开Azure门户并转到函数应用的网站 URL,请选择Continue。

  4. Kudu 服务页面打开后,在 Kudu 网站的标题栏上,从“调试”控制台菜单中选择“CMD”。

    显示 Kudu 服务页的屏幕截图,其中已打开的“调试控制台”菜单和“CMD”选项处于选中状态。

  5. 在下一页上,从文件夹列表中选择 站点>wwwroot>your-function。

    以下步骤使用名为 FabrikamAzureFunction 的示例函数。

    显示一个文件夹列表的屏幕截图,其中包含网站、wwwroot 和函数的已打开文件夹。

  6. 打开 function.json 文件以进行编辑。

    显示 function.json 文件的屏幕截图,其中选择了“编辑”命令。

  7. 确认对象 bindings 中是否存在属性 authLevel 。

    若有此属性,将属性值设置为“anonymous”。 否则,请添加属性并设置值。

    显示绑定对象代码的屏幕截图,其中 authLevel 属性设置为匿名。

  8. 完成后,在编辑器工具栏上,选择“ 保存”。 请继续阅读下一节。

查找设置 Microsoft Entra 身份验证所需的值(仅限使用工作流)

在设置函数应用以使用托管标识和Microsoft Entra身份验证之前,需要按照以下高级步骤查找和保存特定 ID:

  1. 查找 Microsoft Entra 租户的租户 ID。

  2. 查找托管标识的对象 ID。

  3. 查找与托管标识关联的 Enterprise 应用程序的应用程序 ID。

查找您的 Microsoft Entra 租户的租户 ID

要么运行名为 Get-AzContext 的 PowerShell 命令,要么在 Azure 门户中执行以下步骤:

  1. 在 Azure 门户中,打开Microsoft Entra租户。

    本指南使用“Fabrikam”作为示例租户。

  2. 在租户边栏上,选择“ 概述”。

  3. 复制并保存租户 ID 供以后使用,例如:

    页面截图显示租户概览页,其中选择了“复制租户 ID”按钮。

查找托管身份的对象 ID

为消耗逻辑应用资源设置用户分配的托管标识后,找到托管标识的对象 ID。 使用此 ID 在Microsoft Entra租户中查找关联的企业应用程序。

  1. 在逻辑应用边栏上,展开 “设置”,选择“ 标识”,然后选择 “用户分配 ”选项卡。

  2. 在“ 用户分配 ”选项卡上,选择托管标识:

    消耗型逻辑应用的“标识”页的屏幕截图,其中选中了“用户分配”选项卡。

  3. 在“托管标识”页面上,复制标识的对象(主体)ID值:

    屏幕截图显示 Consumption logic app 的“用户分配身份概述”页,其中选择了对象(主体)ID。

查找与您的托管标识关联的 Azure 企业应用程序的应用程序 ID

为消耗逻辑应用资源启用托管标识后,Azure会自动创建具有相同名称的关联Azure Enterprise 应用程序。

需要查找关联的企业应用程序并复制其 应用程序 ID。 使用此应用程序 ID 通过创建应用注册为函数应用添加标识提供者。 执行以下步骤:

  1. 在 Azure 门户中,打开Microsoft Entra租户。

  2. 在租户边栏上,展开“ 管理”,然后选择“ 企业应用程序”。

  3. 在所有应用程序页上的搜索框中,输入托管身份的对象 ID。 在结果中,找到匹配的企业应用程序,并复制 应用程序 ID 值:

    屏幕截图显示 Microsoft Entra 租户页面的“所有应用程序”页面,在搜索框中输入了企业应用程序对象 ID,并选择了匹配的应用程序 ID。

  4. 继续到下一部分,使用复制的应用程序 ID 值 将身份提供者添加到你的函数应用。

为功能应用添加身份提供者(仅限消费工作流)

获取租户 ID 和应用程序 ID 后,通过添加标识提供者并创建应用注册,将函数应用设置为使用Microsoft Entra身份验证:

  1. 在 Azure 门户中,打开函数应用。

  2. 在函数应用边栏上,展开 “设置”,选择“ 身份验证”,然后选择“ 添加标识提供者”,例如:

    显示函数应用菜单的屏幕截图,其中选择了“身份验证”设置,并突出显示了“添加标识提供者”选项。

  3. 在添加标识提供者页上的Basics选项卡上的Identity provider列表中选择Microsoft。

  4. 在 “应用注册”下,对于 应用注册类型,选择“ 提供现有应用注册的详细信息”,并输入之前在下表中所述的位置保存的值:

    参数 需要 值 描述
    应用程序(客户端) ID 是 < application-ID> 用于此应用注册的唯一标识符。 对于此示例,使用为 Enterprise 应用程序复制的应用程序 ID,该应用程序与托管标识相关联。
    颁发者 URL 否 < 身份验证端点URL>/<Microsoft Entra 租户ID>/v2.0 此 URL 将用户重定向到正确的Microsoft Entra租户,并下载相应的元数据来确定相应的令牌签名密钥和令牌颁发者声明值。 对于使用 Azure AD v1 的应用,请从 URL 中省略 /v2.0。

    对于此方案,请使用以下 URL:

    https://sts.chinacloudapi.cn/ < Microsoft-Entra-tenant-ID>
    允许的令牌目标用户 否 <application-ID-URI> 函数应用的应用 ID URI(资源 ID)。 对于你希望允许使用 Web 应用中的身份验证令牌的云应用或服务器应用,请在此处添加 Web 应用的应用 ID URI。 配置的客户端 ID 始终被隐式地视为允许的受众。

    对于此场景,值是以下 URI:

    https://management.chinacloudapi.cn

    稍后,在工作流中设置函数操作以使用托管标识时,请在 Audience 属性中使用同一 URI。

    Important:应用程序 ID URI(资源 ID)必须与 Microsoft Entra ID 期望的值完全匹配,包括任何必需的尾部斜杠。

    你的版本现在如以下示例所示:

    显示逻辑应用的应用注册和函数应用的标识提供者的屏幕截图。

    如果您是首次使用身份提供方设置您的函数应用程序,“应用服务认证设置”部分也会出现。 这些选项可确定函数应用如何响应未经身份验证的请求。 默认选择将重定向所有请求以使用新标识提供者登录。 现在可以自定义此行为,也可以稍后通过选择“身份验证”设置旁边的“编辑”,在主“身份验证”页调整这些设置。 若要了解有关这些选项的详细信息,请参阅 Authentication flow - Azure 应用服务 和 Azure Functions 中的身份验证和授权。

    否则,请继续执行下一步。

  5. 若要完成创建应用注册的过程,请选择“添加”。

    “ 身份验证 ”页列出了标识提供者和应用注册的应用程序(客户端)ID。 函数应用现在可以使用此应用注册进行身份验证。

  6. 复制并保存应用注册 的应用(客户端)ID 值。

    显示函数应用的新标识提供者的屏幕截图。

    此 ID 用于您添加到工作流中的 Azure Functions 操作中。

  7. 返回到工作流设计器,然后按照 步骤使用Azure Functions操作对托管标识的访问进行身份验证。

    请记住,在函数作的 Audience 属性中输入应用程序(客户端)ID。