Azure Function 调用失败并显示“函数主机未运行”

问题描述 投票:0回答:6

我有一个函数,我已经使用了几个月了(甚至有一些问题,如here所示),当我开始扩大测试的使用量时,我开始遇到问题到“生产”。

该函数接受 2 个值,在 Azure 表中查找匹配值,如果找到则将其删除,然后将新值添加到一起。这在测试中效果很好。一旦我从每秒几次调用扩展到每秒 20-30 次调用,它就会失败并出现上述响应。

当我深入使用 Insights 时,实际问题是抛出

System.InvalidOperationException
异常。这是调用堆栈:

System.InvalidOperationException:
   at Microsoft.Azure.WebJobs.Script.WebHost.SecretManager+<PersistSecretsAsync>d__27`1.MoveNext (Microsoft.Azure.WebJobs.Script.WebHost, Version=1.0.0.0, Culture=neutral, PublicKeyToken=nullMicrosoft.Azure.WebJobs.Script.WebHost, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null: C:\projects\azure-webjobs-sdk-script\src\WebJobs.Script.WebHost\Security\SecretManager.csMicrosoft.Azure.WebJobs.Script.WebHost, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null: 440)
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
   at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
   at Microsoft.Azure.WebJobs.Script.WebHost.SecretManager+<GetHostSecretsAsync>d__12.MoveNext (Microsoft.Azure.WebJobs.Script.WebHost, Version=1.0.0.0, Culture=neutral, PublicKeyToken=nullMicrosoft.Azure.WebJobs.Script.WebHost, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null: C:\projects\azure-webjobs-sdk-script\src\WebJobs.Script.WebHost\Security\SecretManager.csMicrosoft.Azure.WebJobs.Script.WebHost, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null: 104)
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
   at Microsoft.Azure.WebJobs.Script.WebHost.WebJobsSdkExtensionHookProvider+<GetOrCreateExtensionKey>d__6.MoveNext (Microsoft.Azure.WebJobs.Script.WebHost, Version=1.0.0.0, Culture=neutral, PublicKeyToken=nullMicrosoft.Azure.WebJobs.Script.WebHost, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null: C:\projects\azure-webjobs-sdk-script\src\WebJobs.Script.WebHost\WebHooks\WebJobsSdkExtensionHookProvider.csMicrosoft.Azure.WebJobs.Script.WebHost, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null: 71)
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
   at Microsoft.Azure.WebJobs.Script.WebHost.WebJobsSdkExtensionHookProvider.GetExtensionWebHookRoute (Microsoft.Azure.WebJobs.Script.WebHost, Version=1.0.0.0, Culture=neutral, PublicKeyToken=nullMicrosoft.Azure.WebJobs.Script.WebHost, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null: C:\projects\azure-webjobs-sdk-script\src\WebJobs.Script.WebHost\WebHooks\WebJobsSdkExtensionHookProvider.csMicrosoft.Azure.WebJobs.Script.WebHost, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null: 64)
   at Microsoft.Azure.WebJobs.Script.WebHost.WebJobsSdkExtensionHookProvider.GetUrl (Microsoft.Azure.WebJobs.Script.WebHost, Version=1.0.0.0, Culture=neutral, PublicKeyToken=nullMicrosoft.Azure.WebJobs.Script.WebHost, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null: C:\projects\azure-webjobs-sdk-script\src\WebJobs.Script.WebHost\WebHooks\WebJobsSdkExtensionHookProvider.csMicrosoft.Azure.WebJobs.Script.WebHost, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null: 49)
   at Microsoft.Azure.WebJobs.Host.Config.ExtensionConfigContext.GetWebhookHandler (Microsoft.Azure.WebJobs.Host, Version=2.3.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35)
   at Microsoft.Azure.WebJobs.Extensions.EventGrid.EventGridExtensionConfig.Initialize (Microsoft.Azure.WebJobs.Extensions.EventGrid, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null)
   at Microsoft.Azure.WebJobs.Host.Executors.JobHostConfigurationExtensions.InvokeExtensionConfigProviders (Microsoft.Azure.WebJobs.Host, Version=2.3.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35)
   at Microsoft.Azure.WebJobs.Host.Executors.JobHostConfigurationExtensions.CreateStaticServices (Microsoft.Azure.WebJobs.Host, Version=2.3.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35)
   at Microsoft.Azure.WebJobs.JobHost.InitializeServices (Microsoft.Azure.WebJobs.Host, Version=2.3.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35)
   at Microsoft.Azure.WebJobs.Script.Utility.CreateMetadataProvider (Microsoft.Azure.WebJobs.Script, Version=1.0.0.0, Culture=neutral, PublicKeyToken=nullMicrosoft.Azure.WebJobs.Script, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null: C:\projects\azure-webjobs-sdk-script\src\WebJobs.Script\Utility.csMicrosoft.Azure.WebJobs.Script, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null: 362)
   at Microsoft.Azure.WebJobs.Script.ScriptHost.LoadBindingExtensions (Microsoft.Azure.WebJobs.Script, Version=1.0.0.0, Culture=neutral, PublicKeyToken=nullMicrosoft.Azure.WebJobs.Script, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null: C:\projects\azure-webjobs-sdk-script\src\WebJobs.Script\Host\ScriptHost.csMicrosoft.Azure.WebJobs.Script, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null: 966)
   at Microsoft.Azure.WebJobs.Script.ScriptHost.Initialize (Microsoft.Azure.WebJobs.Script, Version=1.0.0.0, Culture=neutral, PublicKeyToken=nullMicrosoft.Azure.WebJobs.Script, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null: C:\projects\azure-webjobs-sdk-script\src\WebJobs.Script\Host\ScriptHost.csMicrosoft.Azure.WebJobs.Script, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null: 299)
   at Microsoft.Azure.WebJobs.Script.ScriptHostManager.RunAndBlock (Microsoft.Azure.WebJobs.Script, Version=1.0.0.0, Culture=neutral, PublicKeyToken=nullMicrosoft.Azure.WebJobs.Script, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null: C:\projects\azure-webjobs-sdk-script\src\WebJobs.Script\Host\ScriptHostManager.csMicrosoft.Azure.WebJobs.Script, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null: 178)

它的信息是:

Repository has more than 10 non-decryptable secrets backups (host). 

不幸的是我不知道这意味着什么。对此的任何搜索都会导致几个讨论重新生成密钥的线程,但同样,我真的不知道这意味着什么。有些线程提到要移回 V1 的功能,但我已经使用 V1,所以这不是一个选择。

此功能发生了什么以及如何修复它?

对于任何查看此内容的 Azure 员工,我的函数 ID 是:

2019-01-18T15:52:18.658 [Info] Function started (Id=fc6850e8-7554-46d8-81ec-4d1697c7b572)
azure azure-functions
6个回答
3
投票

删除

D:\home\data\Functions\secrets
解决了问题。

总的来说,我了解到,无论你从 Azure Function 中得到什么奇怪的行为,Kudu 始终是你最好的调查工具。


3
投票

除了上面提到的解决方案之外,还有一些补充。我遇到了同样的问题,即使从 KUDU 网站上的

D:\home\data\Functions\secrets
文件夹中删除秘密文件后,我仍然遇到同样的错误。

我可以通过从 azure-webjobs-secrets 文件夹中删除
host.*.snapshot.*.json
文件来解决此问题,该文件夹位于 azure 上的 blob 存储中。这样的快照文件基本上有10个。


1
投票

该消息表明这与您的函数中的主机级密钥(秘密)有关。

因此,即使我对此没有明确的解决方案(因为我从未遇到过此问题),我建议您检查

host.json
文件夹中的
D:\home\data\Functions\secrets
并查看是否有任何异常情况,例如有超过 10 个键 - 如错误消息所示。


1
投票

如果您有自定义的

Startup
,可能会出现阻止主机启动的错误。

在门户中,转到该功能的页面(您可以在其中看到

function.json
的内容),(可能)会出现一条错误消息。由此,您可以了解在哪里查找错误。就我而言,当我尝试从启动类连接到 Azure Key Vault,但未向该函数授予列表权限时,会引发异常。


0
投票

此异常的原因是以下任一或两者:

  • 如果您删除该应用程序并以相同的名称重新创建它,它将使用该应用程序的相同文件共享,并且由于功能应用程序需要密钥,它将在此文件夹中创建一个备份作为快照。
  • 如果您有多个功能应用程序使用同一存储帐户,则可能会导致这种情况。

平台拍摄的快照/备份的最大限制是 10。发布后它将开始抛出此错误。

要解决此问题,您需要备份该文件夹并删除“.snapshot..json”文件或秘密文件夹本身以重新生成秘密文件。

您还可以从存储帐户中删除备份文件,然后导航到容器并删除现有的 snapshots.json 文件。

如果运行时无法解密秘密,那么它们将被重新生成,并且不可解密的秘密将存储在“.snapshot..json”文件中。如果快照数量 > 10,则开始触发此异常。

删除秘密备份后,您可能需要终止进程并重新启动Azure功能。


0
投票

正如 Divya 所提到的,您应该从 Function App 的关联存储帐户中删除快照,请参阅编辑单租户 Azure 逻辑应用中的标准逻辑应用的主机和应用设置

注意:当您创建逻辑应用时,Visual Studio Code 会创建一个 备份存储容器中的 host.snapshot.*.json 文件。如果你 删除您的逻辑应用,不会删除此备份文件。如果你创建 另一个同名的逻辑应用,另一个快照文件是 创建的。对于同一逻辑应用,最多只能有 10 个快照。 如果超过此限制,您会收到以下错误:

Microsoft.Azure.WebJobs.Script.WebHost:存储库有超过10个 不可解密的秘密备份(主机))

要解决此错误,请从您的计算机中删除多余的快照文件 储存容器。

因此,您需要检查容器

azure-webjobs-secrets
并删除snapshot文件。

# Inspect the secret files
az storage blob list \
  --account-name <function-app-storage-account> \
  --container-name azure-webjobs-secrets \
  --query '[].name' \
  --output tsv

# Delete the snapshot files
az storage blob delete-batch \
  --account-name <function-app-storage-account> \
  --source azure-webjobs-secrets \
  --pattern '*.snapshot.*.json'
© www.soinside.com 2019 - 2024. All rights reserved.