对 Azure 外部函数进行故障排除¶
本主题提供有关 Azure 外部函数的故障排除信息。
本主题内容:
与平台无关的运行时问题¶
数据类型返回值与预期返回值不一致¶
将实参传递到外部函数或从外部函数传递实参时,请确保数据类型是合适的。如果发送的值不适合接收的数据类型,则该值可能会被截断或以其他方式损坏。
有关更多详细信息,请参阅 确保外部函数的实参与远程服务解析的实参相对应。
Error: Row numbers out of order¶
- 可能原因:
在每个批处理中返回的行号应该是从 0 开始的单调升序整数。输入行号也必须遵循此规则,并且每个输出行都应与相应的输入行一致。例如,输出行 0 中的输出应与输入行 0 中的输入相对应。
- 可能的解决方案:
确保返回的行号与收到的行号相同,并且每个输出值都使用相应输入的行号。如果这不起作用,则输入行号可能不正确,或者您没有以正确的顺序返回行。
接下来,确保输出行号从 0 开始,增加 1,并按顺序排列。
有关数据输入和输出格式的更多信息,请参阅 远程服务输入和输出数据格式。
Error: "Error parsing JSON: Invalid response"¶
- 可能原因:
最可能的原因是远程服务(例如 AWS Lambda 函数)返回的 JSON 构造不正确。
- 可能的解决方案:
确保外部函数返回一个数组数组,每个接收的输入行返回一个内部数组。查看以下位置中的输出格式说明:Snowflake 接收的数据格式。
Error: Format of the returned value is not JSON¶
- 可能原因:
返回值内包含双引号。
- 可能的解决方案:
尽管 JSON 字符串由双引号分隔,但在大多数情况下,字符串本身不应以引号开头和结尾。如果嵌入的双引号不正确,请将其删除。
Error: Function received the wrong number of rows¶
- 可能原因:
远程服务尝试返回的行数多于或少于接收的行数。即使函数名义上是标量的,它也可能在
event
参数的body
字段中接收多行,并且返回的行数应与接收的行数完全相同。- 可能的解决方案:
确保远程服务为接收的每一行返回一行。
特定于 Azure 的问题¶
在创建 Azure 函数的过程中不能修改设置¶
- 可能原因:
创建 Azure 函数时,可能无法在 Authentication/Authorization 菜单下修改函数设置。
如果满足以下 全部 条件,则可能会出现此问题:
Azure 函数基于 Linux 运行,而非 Microsoft Windows。
您计划对 Azure 函数使用 Azure AD 身份验证/授权。
您使用的是 Azure 的“消费”定价层级,而非“高级”定价层级。
针对 Azure 函数,Azure AD 身份验证在 Linux 消费计划中不可用。您必须使用应用程序服务定价方案或高级定价方案,才能通过 Azure AD 进行身份验证。
- 可能的解决方案:
重新创建 Azure 函数,并指定它将基于 Microsoft Windows 而非 Linux 运行。
跳过 Azure 函数的 Azure AD 身份验证/授权;改为执行以下任务:
为 API 管理实例设置 validate-JWT (JSON Web 令牌)策略,如 :doc:`external-functions-creating-azure-ui-security-policy`中所述。
使用 IP 地址限制将远程服务限制为仅接受来自 API 管理服务实例的连接。
如果选择此解决方案,必须手动创建 Azure AD 应用程序。有关详细信息,请参阅 Microsoft 文档:
应用程序注册 (https://docs.microsoft.com/en-us/azure/active-directory/develop/quickstart-register-app)。
如果手动创建 Azure AD 应用程序,请在跟踪工作表中记录
Azure Function AD app registration name
和Azure Function App AD Application ID
。从消费定价切换到高级定价,或使用应用程序服务方案。有关更多详细信息,请参阅 Microsoft 文档:
配置身份验证提供商 (https://docs.microsoft.com/en-us/azure/app-service/configure-authentication-provider-aad)
外部函数超时¶
- 可能原因:
可能引发超时的原因有很多。在 Azure 上,可能的原因之一是 Azure Functions 应用程序的编写方式不支持正确扩展。
- 可能的解决方案:
确保遵循 编写可扩展函数的 Azure 指南 (https://docs.microsoft.com/en-us/azure/azure-functions/functions-best-practices#scalability-best-practices)。
有关排查可扩展性和性能问题的更多信息,请参阅 排查可扩展性和性能问题。
Error: Failed to obtain Azure active directory access token.¶
- 可能的解决方案:
请尝试以下步骤:
验证 Snowflake 服务主体是否有访问 Azure AD 租户的权限。
验证租户 ID 和 Azure AD 应用程序 ID 是否正确。
请注意,空格(包括前导和尾随空格(例如空白))在 ID 字段中非常重要。检查是否有前导或尾随空格不正确之处。
Error: 401 '{ "statusCode": 401, "message": "Access denied due to missing subscription key..." }'¶
完整的错误消息文本:
Request failed for external function <function_name>. Error: 401 '{ "statusCode": 401, "message":
"Access denied due to missing subscription key. Make sure to include subscription key when making requests to an API." }'
- 可能原因:
API 管理服务的订阅要求可能处于待处理状态。
- 可能的解决方案:
您可能需要关闭 API 管理服务的订阅要求。
Error: 401 '{ "statusCode": 401, "message": "Access denied due to missing subscription key." }¶
- 可能原因:
代理服务需要 API 密钥 (也称为“订阅密钥”),通常用于身份验证或计费。但 CREATE API INTEGRATION 命令的 API_KEY 子句中没有提供任何 API 密钥。
- 可能的解决方案:
使用 ALTER API INTEGRATION 命令,用有效的 API 密钥更新 API 集成。
Error: 401 '{ "statusCode": 401, "message": "Access denied due to invalid subscription key." }'¶
- 可能原因:
代理服务需要 API 密钥 (也称为“订阅密钥”),通常用于身份验证或计费。但是,CREATE API INTEGRATION 命令的 API_KEY 子句中提供的 API 密钥无效。
- 可能的解决方案:
使用 ALTER API INTEGRATION 命令,用有效的 API 密钥更新 API 集成。
Error: 401 '{ "statusCode": 401, "message": "Invalid JWT." }'¶
完整的错误消息文本:
Request failed for external function <function_name>. Error: 401 '{ "statusCode": 401, "message": "Invalid JWT." }'
- 可能原因:
您可能尚未在 Azure API 管理服务上完成安全策略设置。例如,您可能有以下问题:
已创建但未编辑的 JWT (JSON Web 令牌)。
忽略了一个或多个必需的声明/值。例如,您可能指定了针对 Snowflake 的声明,但未指定
远程服务(Azure 函数),反之亦然。
您可能使用了无效的打开 ID URL。
- 可能的解决方案:
完成 Azure API 管理服务的安全策略设置。例如,查看 JWT,并验证是否包含所需的声明/值,包括针对 Snowflake 的声明和针对远程服务(Azure 函数)的声明。
验证是否使用了有效的打开 ID URL。
Error (remote service): 401 '{ "statusCode": 401, "message": "Invalid JWT." }'¶
完整的错误消息文本:
Request failed for external function <function_name> with remote service error: 401 '{ "statusCode": 401, "message": "Invalid JWT." }'
- 可能原因:
如果您使用了 ARM 模板,则可能尚未更新由模板为您创建的 JWT (JSON Web 令牌)。
- 可能的解决方案:
按照 第 6 步:在门户中更新代理服务的 Azure 安全策略 所述,更新 JWT。
错误:500 ...¶
- 可能原因:
您可能为 Azure AD 应用程序选择了错误的选项:
不正确的选项:Accounts in any organizational directory (Any Azure AD directory - Multitenant) and personal Microsoft accounts (e.g. Skype, Xbox)
正确的选项:Accounts in this organizational directory only (Default Directory only - Single tenant)