从 Azure 逻辑应用中的工作流调用 Azure Functions
适用范围:Azure 逻辑应用(消耗型 + 标准型)
要运行在逻辑应用工作流中执行特定作业的代码,不必生成完整的应用或基础结构。 相反,可以创建并调用 Azure 函数。 Azure Functions 提供云无服务器计算和执行以下任务的功能:
- 通过运行使用 Node.js 或 C# 创建的函数来扩展工作流的行为。
- 在工作流中执行计算。
- 在工作流中应用高级格式设置或计算字段。
本操作指南演示如何从消耗型或标准工作流调用现有 Azure 函数。 要在不使用 Azure Functions 的情况下运行代码,请参阅以下文档:
限制
只有消耗工作流支持使用托管标识和 Microsoft Entra 身份验证对 Azure 函数调用进行身份验证。 有关如何为函数调用启用身份验证的部分当前不支持标准工作流。
Azure 逻辑应用不支持在启用了部署槽位的情况下使用 Azure Functions。 虽然此方案有时可能可行,但此行为是不可预测的,且在工作流尝试调用 Azure 函数时可能会导致授权问题。
先决条件
Azure 帐户和订阅。 如果没有订阅,可以注册 Azure 帐户。
Azure 函数应用资源,其中包含一个或多个 Azure 函数。
函数应用资源和逻辑应用资源必须使用相同的 Azure 订阅。
函数应用资源必须使用 .NET 或 Node.js 作为运行时堆栈。
向函数应用添加新函数时,可以选择 C# 或 JavaScript。
要调用的 Azure 函数。 可使用以下工具创建此函数:
函数必须使用 HTTP 触发器模板。
此 HTTP 触发器模板可从逻辑应用工作流接受具有
application/json
类型的内容。 当你向工作流添加函数时,设计器会显示 Azure 订阅内基于此模板创建的自定义函数。函数代码必须包含要在函数完成后返回到工作流的响应和有效负载。
context
对象是指工作流通过本指南后面的名为“请求正文”的 Azure Functions 操作参数发送的消息。本指南使用名为 FabrikamAzureFunction 的以下示例函数:
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>
例如,要引用
context
对象内的content
属性,请使用以下语法:context.body.content
此代码还包含一个
input
变量,此变量存储来自data
参数的值,因此函数可对该值执行操作。 在 JavaScript 函数内,data
变量也是context.body
的一种快捷方式。注意
此处的
body
属性适用于context
对象,但与来自操作输出的 Body 令牌不同,后者也可以传递到函数。你的函数无法使用自定义路由,除非你定义了 OpenAPI 定义。
如果已经有函数的 OpenAPI 定义,工作流设计器会提供更丰富的函数参数使用体验。 在工作流查找并访问具有 OpenAPI 定义的函数之前,请先按以下步骤设置函数应用。
以任何触发器开始的消耗型或标准逻辑应用工作流。
本指南中的示例使用名为“收到新电子邮件时”的 Office 365 Outlook 触发器。
要创建和调用调用另一个工作流的 Azure 函数,请确保辅助工作流以提供可调用终结点的触发器开始。
例如,可使用常规 HTTP 或“请求”触发器启动工作流,也可使用基于服务的触发器,例如 Azure 队列或事件网格。 在函数内,向触发器的 URL 发送一个 HTTP POST 请求,并加入需要辅助工作流处理的有效负载。 有关详细信息,请参阅调用、触发器或嵌套逻辑应用工作流。
有关使用 Azure 函数的提示
使用 OpenAPI 定义查找函数
要设置函数应用以使工作流可查找和使用具备 OpenAPI 定义的函数,请按照以下步骤操作:
在 Azure 门户中,打开函数应用。 确保函数应用正在运行。
在函数应用中,按照以下步骤操作来设置跨源资源共享 (CORS),以便允许所有源:
访问 HTTP 请求中的属性值
基于 Webhook 的函数可以接受 HTTP 请求作为输入,并将这些请求传递至其他函数。 例如,尽管 Azure 逻辑应用具有转换 DateTime 值的函数,但此基本示例 JavaScript 函数演示了如何访问传递给函数的 HTTP 请求对象中的属性,并对该属性值执行操作。 为访问对象内的属性,此示例使用点 (.) 运算符:
function convertToDateString(request, response){
var data = request.body;
response = {
body: data.date.ToDateString();
}
}
下面是此函数内部发生的情况:
该函数创建
data
变量并将request
对象内的body
对象分配给该变量。 该函数使用点 (.) 运算符引用request
对象内的body
对象:var data = request.body;
该函数现在可以通过
data
变量访问date
属性,并通过调用ToDateString()
函数将该属性值从 DateTime 类型转换为 DateString 类型。 该函数还通过函数响应中的body
属性返回结果:body: data.date.ToDateString();
在 Azure 中创建函数后,请按照将 Azure 函数添加到工作流的步骤操作。
将 URI 参数传递给函数
如果必须向函数传递 URI 参数,则可以在函数的终结点 URL 中使用查询参数。
在逻辑应用的工作流设计器打开并且函数信息窗格打开时,从“高级参数”列表中选择“查询”。
此时会显示一个表,你可在其中输入参数输入作为键值对。
输入参数的键值对,例如:
将函数添加到工作流(消耗型 + 标准工作流)
要从工作流调用 Azure 函数,可以添加该函数,具体方法与在设计器中执行的任何其他操作一样。
在 Azure 门户中,打开设计器中的消耗逻辑应用工作流。
在“添加操作”窗格中,执行以下步骤:
从函数应用列表中选择你的函数应用,选择函数,然后选择“添加操作”,例如:
显示函数的信息框后,请执行以下步骤:
在“请求正文”中,提供函数的输入,其格式必须为 JavaScript 对象表示法 (JSON) 对象的格式,例如:
{"context": <selected-input> }
此输入是工作流发送到函数的上下文对象有效负载或消息。
要选择表示前面步骤的输出的令牌,请在“请求正文”框内选择,然后选择打开动态内容列表(闪电图标)的选项。
要创建表达式,请在“请求正文”框内选择,然后选择打开表达式编辑器(公式图标)的选项。
以下示例列举了一个 JSON 对象,该对象具有
content
属性和一个将电子邮件触发器的“From”输出表示为“请求正文”值的令牌:此处的上下文对象没有强制转换为字符串,因此对象的内容被直接添加到 JSON 有效负载中。 以下是完整示例:
如果提供的上下文对象不是传递字符串、JSON 对象或 JSON 数组的 JSON 令牌,则会出现错误。 但可通过将令牌括在引号 ("") 中来将上下文对象转换为字符串,例如,如果想要使用“Received Time”令牌:
要指定其他详细信息(如要使用的方法、请求头、查询参数或身份验证),请打开“高级参数”列表,然后选择所需的参数。 身份验证的选项因所选函数而异。 有关详细信息,请参阅为函数启用身份验证。
为 Azure 函数调用启用身份验证(仅限消耗型工作流)
消耗型工作流可以使用托管标识对 Azure 函数调用进行身份验证,并访问受 Microsoft Entra ID 保护的资源。 此托管标识无需登录并提供凭据或机密即可对访问进行身份验证。 由于无需提供或轮换机密,因此 Azure 会为你管理此标识,并且会帮助保护凭据。 可以在逻辑应用资源级别设置系统分配的标识或手动创建、用户分配的标识。 从工作流调用的 Azure 函数可以使用同一托管标识进行身份验证。
注意
只有消耗型工作流支持使用托管标识和 Microsoft Entra 身份验证对 Azure 函数调用进行身份验证。 使用操作调用 Azure 函数时,标准工作流当前不包括此支持。
有关详细信息,请参阅以下文档:
若要设置函数应用和函数,以便它们可以使用消耗型逻辑应用的托管标识,请执行以下高级步骤:
设置函数以进行匿名身份验证(仅限消耗型工作流)
若要让函数使用消耗型逻辑应用的托管标识,则必须将函数的身份验证级别设置为“anonymous
”。 否则,工作流会抛出 BadRequest 错误。
在 Azure 门户中,找到并选择你的函数应用。
以下步骤使用名为 FabrikamFunctionApp 的示例函数应用。
在函数应用资源菜单的“开发工具”下,选择“高级工具”>“前往”。
在“Kudu Plus”页打开后,在 Kudu 网站的标题栏中,从“调试控制台”菜单中选择“CMD”。
下一页出现后,从文件夹列表中选择“站点”>“wwwroot”>“<你的函数>”。
以下步骤使用名为 FabrikamAzureFunction 的示例函数。
打开 function.json 文件以进行编辑。
在 bindings 对象中,检查 authLevel 属性是否存在。 若有此属性,将属性值设置为“
anonymous
”。 否则,请添加此属性并设置值。完成后,保存设置。 请继续阅读下一节。
查找设置 Microsoft Entra 身份验证所需的值(仅限消耗工作流)
在设置函数应用以使用托管标识和 Microsoft Entra 身份验证之前,需要按照本节中的步骤查找并保存以下值。
查找 Microsoft Entra 租户的租户 ID
运行名为 Get-AzureAccount 的 PowerShell 命令,或在 Azure 门户中执行以下步骤:
在 Azure 门户中,打开 Microsoft Entra 租户。
本指南使用“Fabrikam”作为示例租户。
在租户菜单中,选择“概述”。
复制并保存租户 ID 供以后使用,例如:
查找托管标识的对象 ID
为消耗型逻辑应用资源启用托管标识后,找到托管标识的对象。 使用此 ID 在 Entra 租户中找到关联的 Enterprise 应用程序。
查找与托管标识关联的 Azure Enterprise 应用程序的应用程序 ID
在逻辑应用资源上启用托管标识时,Azure 会自动创建具有相同名称的关联 Azure Enterprise 应用程序。 现在需要找到关联的 Enterprise 应用程序,并复制其“应用程序 ID”。 然后,使用此应用程序 ID 创建应用注册,为函数应用添加标识提供者。
在 Azure 门户中,找到并打开 Entra 租户。
在租户菜单中的“管理”下,选择“Enterprise 应用程序”。
在“所有应用程序”页上的搜索框中,输入托管标识的对象 ID。 在结果中,找到匹配的企业应用程序,并复制“应用程序 ID”:
现在,使用复制的应用程序 ID 向函数应用添加标识提供者。
为函数应用添加标识提供者(仅限消耗型工作流)
拥有租户 ID 和应用程序 ID 后,可以通过添加标识提供者和创建应用注册,来设置函数应用以使用 Microsoft Entra 身份验证。
在 Azure 门户中,打开函数应用。
在函数应用菜单的“设置”下,选择“身份验证”,然后选择“添加标识提供者”。
在“添加标识提供者”窗格的“基本信息”下,从“标识提供者”列表中选择“Microsoft”。
在“应用注册”下,对于“应用注册类型”,选择“提供现有应用注册的详细信息”,然后输入之前保存的值。
属性 需要 值 描述 应用程序(客户端) ID 是 <application-ID> 用于此应用注册的唯一标识符。 对于此示例,使用为 Enterprise 应用程序复制的应用程序 ID,该应用程序与托管标识相关联。 客户端密码 可选,但建议提供 <client-secret> 应用在请求令牌时用来证明其身份的机密值。 客户端机密作为名为 MICROSOFT_PROVIDER_AUTHENTICATION_SECRET 的槽粘滞应用程序设置创建并存储在应用的配置中。
- 确保定期轮换并安全地存储机密。 例如,在 Azure 密钥保管库中管理机密,可以在其中使用托管标识来检索密钥,而不会将值透露给未经授权的用户。 可以更新此设置以使用密钥保管库引用。
- 如果提供客户端机密值,登录操作将使用混合流,同时返回访问令牌和刷新令牌。
- 如果未提供客户端机密,登录操作将使用 OAuth 2.0 隐式授权流。 此方法仅直接返回 ID 令牌或访问令牌。 这些令牌由提供程序发送并存储在 EasyAuth 令牌存储中。
重要说明:由于存在安全风险,隐式授权流不再是一种合适的身份验证方法。 应改用授权代码流和用于代码交换的证明密钥 (PKCE) 或单页应用程序 (SPA) 授权代码。颁发者 URL 否 <authentication-endpoint-URL>/<Entra-tenant-ID>/v2.0 此 URL 会将用户重定向到正确的 Microsoft Entra 租户,并下载适当的元数据,以便确定相应的令牌签名密钥和令牌颁发者声明值。 对于使用 Azure AD v1 的应用,请省略 URL 中的 /v2.0。
在此示例中,请使用以下 URL:https://sts.chinacloudapi.cn/
<Entra-tenant-ID>允许的令牌受众 否 <application-ID-URI> 函数应用的应用 ID URI(资源 ID)。 对于你希望允许使用 Web 应用中的身份验证令牌的云应用或服务器应用,请在此处添加 Web 应用的应用 ID URI。 配置的客户端 ID 始终被隐式地视为允许的受众。
在此方案中,值为https://management.chinacloudapi.cn
。 稍后,在工作流中将函数操作设置为使用托管标识时,可以在“受众”属性中使用相同的 URI。
重要提示:此应用程序 ID URI(资源 ID)与 Microsoft Entra ID 所需的值必须完全匹配,包括所有必要的尾部斜杠。现在,你的版本如以下示例所示:
如果你是首次使用标识提供者设置函数应用,则还会显示“应用服务身份验证设置”部分。 这些选项可确定函数应用如何响应未经身份验证的请求。 默认选择将重定向所有使用新标识提供者登录的请求。 现在可以自定义此行为,也可以稍后通过选择“身份验证”设置旁边的“编辑”,在主“身份验证”页调整这些设置。 若要详细了解这些选项,请查看身份验证流 - Azure 应用服务和 Azure Functions 中的身份验证和授权。
否则,可以继续执行下一步。
若要完成创建应用注册的过程,请选择“添加”。
完成后,“身份验证”页现在会列出标识提供者和应用注册的应用程序(客户端 ID)。 函数应用现在可以使用此应用注册进行身份验证。
复制应用注册的“应用(客户端)ID”,以便稍后在工作流的 Azure Functions 操作的“受众”属性中使用。
返回到设计器,并使用内置的 Azure Functions 操作,按照使用托管标识验证访问权限的步骤操作。