在 Azure 逻辑应用的工作流中调用 Azure Functions

适用范围:Azure 逻辑应用(消耗型 + 标准型)

Azure 逻辑应用和 Azure Functions 协同工作,以便通过自定义代码执行、高级计算和动态数据处理来扩展和增强集成工作流。 在 Azure Functions 中创建函数时,可以从工作流调用和运行这些函数。 使用 Azure Functions 平台可以运行代码,而无需生成完整的应用或设置单独的基础结构,并提供可以执行如下示例等任务的基于云的计算:

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

本指南演示如何从工作流调用和运行 Azure Functions 中的函数,无论是使用消耗计划还是标准计划。 你还将了解使用 Azure Functions 的先决条件、限制和提示,以确保无缝集成和最佳性能。 有关详细信息,请参阅 Azure FunctionsAzure 逻辑应用

限制

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

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

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

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

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

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

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

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

    虽然此方案有时可能可行,但此行为是不可预测的,且在工作流尝试调用 Azure 函数时可能会导致授权问题。

先决条件

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

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

    请确保对函数应用资源和逻辑应用资源使用相同的 Azure 订阅。

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

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

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

      本指南使用名为 FabrikamAzureFunction 的以下示例函数。 context此示例函数中的对象是指您的工作流通过 Azure Functions 的名为请求正文的操作参数发送的消息,并在本指南中稍后进行说明:

      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 或“请求”触发器启动工作流,也可使用基于服务的触发器,例如 Azure 队列或事件网格。 在函数内,向触发器的 URL 发送一个 HTTP POST 请求,并加入需要辅助工作流处理的有效负载。 有关详细信息,请参阅调用、触发器或嵌套逻辑应用工作流

有关使用 Azure 函数的提示

使用 OpenAPI 定义查找函数

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

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

  2. 在函数应用程序中,按照以下步骤设置跨源资源共享 (CORS),以允许所有源:

    1. 在函数应用边栏的 API 下,选择 CORS

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

      屏幕截图显示了 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 门户中,打开你的 Consumption Logic App 资源。 在设计器中打开工作流。

  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,请选择“ 继续”。

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

    屏幕截图显示了 Kudu 服务页,其中包含打开的“调试控制台”菜单和名为 CMD 的选定选项。

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

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

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

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

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

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

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

    显示“bindings”对象的屏幕截图,其中“authLevel”属性设置为“anonymous”。

  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 租户中找到关联的 Enterprise 应用程序。

  1. 在逻辑应用边栏的“设置”下,选择“标识”,然后选择“用户分配”。

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

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

  3. 复制标识的“对象(主体) ID”

    屏幕截图显示了消耗型逻辑应用的“用户分配标识”概览页面,页面上选择了“对象(主体)ID”。

查找与托管标识关联的 Azure Enterprise 应用程序的应用程序 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. “添加标识提供者 ”页上的“ 基本信息 ”选项卡上,从 “标识提供者 ”列表中选择 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。

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

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

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

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

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

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

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

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

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

    你将在添加到工作流中的 Azure Functions 操作中使用此 ID。

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

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