排查错误:“Azure Functions运行时无法访问”

本文可帮助你排查Azure门户中出现的以下错误字符串:

错误:Azure Functions 运行时无法访问。 单击此处获取存储配置的详细信息。”

当 Functions 运行时无法启动时,会出现此问题。 最常见的原因是函数应用无法访问其存储帐户。 有关详细信息,请参阅存储帐户要求

本文的余下内容将帮助你排查此错误的具体原因,包括如何识别和解决每种情况。

存储帐户已被删除

每个函数应用都需要一个存储帐户,该帐户由 Functions 主机用于操作。 如果删除了该默认主机存储帐户,则函数应用不会运行。

首先在应用程序设置中查找你的存储帐户名称。 AzureWebJobsStorageWEBSITE_CONTENTAZUREFILECONNECTIONSTRING 包含作为连接字符串一部分的存储帐户名称。 有关详细信息,请参阅 Azure Functions 的应用程序设置参考

在 Azure 门户中搜索存储帐户,以查看它是否仍然存在。 如果它已被删除,请重新创建存储帐户,并替换存储连接字符串。 函数代码已丢失,需要重新部署。

存储帐户应用程序设置已被删除

在前面的步骤中,如果找不到存储帐户连接字符串,则可能是已被删除或覆盖。 在使用部署槽位或Azure 资源管理器脚本设置应用程序设置时,通常会删除应用程序设置。

必需的应用程序设置

有关详细信息,请参阅 App 设置参考中关于 Azure Functions 的部分

指南

  • 请不要为任何这些设置选中“槽位设置”。 如果交换部署槽位,函数应用将会中断。
  • 在自动部署过程中,请不要修改这些设置。
  • 必须在创建时提供这些设置并使其生效。 自动部署如果不包含这些设置,将导致函数应用无法运行,即使后来添加这些设置也是如此。

存储帐户凭据无效

如果重新生成存储密钥,则必须更新上述存储帐户连接字符串。 有关存储密钥管理的详细信息,请参阅 创建Azure 存储帐户

存储帐户不可访问

函数应用必须能够访问存储帐户。 阻止函数应用访问存储帐户的常见问题是:

  • 函数应用程序部署到您的应用服务环境(ASE)中,但没有正确的网络规则来允许与存储帐户之间的网络访问。

  • 存储帐户防火墙已启用,但未配置为允许函数与外界之间的流量往来。 有关详细信息,请参阅 配置Azure 存储防火墙和虚拟网络

  • 验证 allowSharedKeyAccess 设置是否设为默认值 true。 有关详细信息,请参阅 Azure 存储 帐户的Prevent 共享密钥授权

每日执行配额已满

如果配置了每日执行配额,则会暂时禁用函数应用,导致许多门户控制措施不可用。

若要验证 Azure 门户中的配额,请在函数应用中选择 Platform Features>Function App Settings。 如果超过设置的 每日使用配额 ,将显示以下消息:

“函数应用已达到每日使用配额,已被停止,直到下一24小时周期。”

若要解决此问题,请将配额重置为零或增加每日配额,然后重启应用。 否则,应用的运行将被阻止直到第二天。

应用受防火墙保护

函数应用可能会出于以下任一原因而不可访问:

Azure门户直接调用正在运行的应用来提取函数列表,并向 Kudu 终结点发出 HTTP 调用。 仍可使用“平台功能”选项卡下的平台级设置。

若要验证 ASE 配置,请执行以下操作:

  1. 转到 ASE 所在子网的网络安全组 (NSG)。
  2. 验证入站规则是否允许从你用于访问应用程序的计算机的公共 IP 来的流量。

还可以通过连接到运行应用的虚拟网络的计算机或虚拟网络中运行的虚拟机来使用门户。

有关入站规则配置的详细信息,请参阅应用服务环境 的网络注意事项

Linux 上的容器错误

对于在容器中 Linux 上运行的函数应用,由于容器出现问题,Azure Functions runtime is unreachable 错误可能发生。 使用以下过程查看容器日志中的错误:

  1. 导航到函数应用的 Kudu 终结点,该终结点位于 https://<FUNCTION_APP>.scm.chinacloudsites.cn,其中的 <FUNCTION_APP> 是你的应用的名称。

  2. 下载 Docker 日志 .zip 文件,并在本地计算机上查看文件内容。

  3. 检查记录中是否有任何指示容器无法成功启动的错误。

容器映像不可用

引用的容器映像不可用或无法正确启动时会出现错误。 检查记录中是否有任何指示容器无法成功启动的错误。

需要更正阻止容器启动的任何错误,以便函数应用正确运行。

找不到容器映像时,会在 Docker 日志中看到错误 manifest unknown。 在这种情况下,可以使用记录在如何定位 Azure Functions 运行时版本中的 Azure CLI 命令来更改引用的容器映像。 如果已部署自定义容器映像,则需要修复映像并将更新的版本重新部署到引用的注册表。

应用容器具有冲突端口

由于启动时端口分配冲突,函数应用可能处于无响应状态。 这种情况可能发生在以下情况下:

  • 容器中有单独的服务在运行,这些服务中的一个或多个正在尝试绑定到与函数应用相同的端口。
  • 添加了与函数应用共享相同端口值的Azure混合连接。

默认情况下,函数应用运行所在的容器使用端口 :80。 当同一容器中的其他服务也尝试使用端口 :80 时,函数应用可能无法启动。 如果日志显示端口冲突,请更改默认端口。

主机 ID 冲突

从 Functions 运行时版本 3.x 开始,会检测主机 ID 冲突并将其作为警告进行记录。 在版本 4.x 中,会记录错误并停止主机。 如果函数应用的运行时无法启动,请查看日志。 如果出现有关主机 ID 冲突的警告或错误,请按照主机 ID 注意事项中的缓解步骤进行操作。

只读应用设置

更改任何只读应用服务应用程序设置可能会将函数应用置于不可达状态。

ASP.NET 身份验证覆盖

仅适用于与 Functions 主机一起在进程内运行的 C# 应用。

在 Functions 启动类中配置 ASP.NET 身份验证可以替代Azure门户与主机通信所需的服务。 这包括但并不限于对 AddAuthentication() 的任何调用。 如果替代了主机的身份验证服务,并且门户无法与主机通信,则会认为应用无法访问。 此问题可能会导致以下错误: No authentication handler is registered for the scheme 'ArmToken'.

后续步骤

了解如何监视函数应用: