排查错误:“Azure Functions 运行时不可访问”
本文帮助你排查 Azure 门户中显示的以下错误字符串:
“错误:Azure Functions 运行时不可访问。 单击此处获取存储配置的详细信息。”
当 Functions 运行时无法启动时,会出现此问题。 此问题的最常见原因是函数应用失去了对其存储帐户的访问权限。 有关详细信息,请参阅存储帐户要求。
本文的余下内容将帮助你排查此错误的具体原因,包括如何识别和解决每种情况。
存储帐户已被删除
每个函数应用都需要存储帐户才能运行。 如果该帐户已被删除,则函数不会正常运行。
首先在应用程序设置中查找你的存储帐户名称。 AzureWebJobsStorage
或 WEBSITE_CONTENTAZUREFILECONNECTIONSTRING
包含你的存储帐户名称(作为连接字符串的一部分)。 有关详细信息,请参阅 Azure Functions 的应用设置参考。
在 Azure 门户中搜索你的存储帐户,确定它是否仍然存在。 如果它已被删除,请重新创建存储帐户,并替换存储连接字符串。 函数代码已丢失,需要重新部署。
存储帐户应用程序设置已被删除
在上一步骤中,如果找不到存储帐户连接字符串,则可能是该字符串已被删除或覆盖。 使用部署槽位或 Azure 资源管理器脚本设置应用程序设置时,通常会删除应用程序设置。
必需的应用程序设置
- 必需:
- 弹性高级和消耗计划函数需要:
有关详细信息,请参阅 Azure Functions 的应用设置参考。
指南
- 对于其中的任何设置,请不要选中“槽位设置”。 如果交换部署槽位,函数应用将会中断。
- 在自动部署过程中,请不要修改这些设置。
- 必须在创建时提供这些设置并使其生效。 不包含这些设置的自动部署会导致函数应用不运行,即使以后添加设置,也是如此。
存储帐户凭据无效
如果重新生成存储密钥,则必须更新上述存储帐户连接字符串。 有关存储密钥管理的详细信息,请参阅创建 Azure 存储帐户。
存储帐户不可访问
函数应用必须能够访问存储帐户。 阻止函数应用访问存储帐户的常见问题是:
将函数应用部署到应用服务环境 (ASE) 时,未使用正确的网络规则来允许在存储帐户中传入和传出流量。
存储帐户防火墙已启用,但未配置为允许在函数中传入和传出流量。 有关详细信息,请参阅配置 Azure 存储防火墙和虚拟网络。
验证
allowSharedKeyAccess
设置是否设为默认值true
。 有关详细信息,请参阅阻止对 Azure 存储帐户进行共享密钥授权。
每日执行配额已满
如果配置了每日执行配额,则会暂时禁用函数应用,导致许多门户控制措施不可用。
若要在 Azure 门户中验证配额,请在函数应用中选择“平台功能”>“函数应用设置”。 如果超出了设置的“每日使用配额”,将显示以下消息:
“函数应用已达到使用配额并将停止使用 24 小时。”
若要解决此问题,请删除或提高每日配额,然后重启应用。 否则,应用的执行将被阻止一天。
应用受防火墙保护
函数应用可能会出于以下任一原因而不可访问:
函数应用托管在内部负载均衡的应用服务环境中,并配置为阻止入站 Internet 流量。
函数应用的入站 IP 限制配置为阻止 Internet 访问。
Azure 门户直接调用正在运行的应用以提取函数列表,并对 Kudu 终结点发出 HTTP 调用。 仍可使用“平台功能”选项卡下的平台级设置。
若要验证 ASE 配置,请执行以下操作:
- 转到 ASE 所在子网的网络安全组 (NSG)。
- 验证入站规则是否允许你在其中访问应用程序的计算机的公共 IP 传出的流量。
还可以通过连接到运行应用的虚拟网络的计算机或虚拟网络中运行的虚拟机来使用门户。
有关入站规则配置的详细信息,请参阅应用服务环境的网络注意事项的“网络安全组”部分。
Linux 上的容器错误
对于容器中在 Linux 上运行的函数应用,容器出现问题可能导致 Azure Functions runtime is unreachable
错误。 使用以下过程查看容器日志中的错误:
导航到函数应用的 Kudu 终结点,该终结点位于
https://<FUNCTION_APP>.scm.chinacloudsites.cn
,其中的<FUNCTION_APP>
是你的应用的名称。下载 Docker 日志 .zip 文件,并在本地计算机上查看文件内容。
检查记录中是否有任何指示容器无法成功启动的错误。
容器映像不可用
引用的容器映像不可用或无法正确启动时会出现错误。 检查记录中是否有任何指示容器无法成功启动的错误。
需要更正阻止容器启动的任何错误,以便函数应用正确运行。
找不到容器映像时,会在 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'.
。
后续步骤
了解如何监视函数应用: