我有一个函数,我已经使用了几个月了(甚至有一些问题,如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)
除了上面提到的解决方案之外,还有一些补充。我遇到了同样的问题,即使从 KUDU 网站上的
D:\home\data\Functions\secrets
文件夹中删除秘密文件后,我仍然遇到同样的错误。 host.*.snapshot.*.json
文件来解决此问题,该文件夹位于 azure 上的 blob 存储中。这样的快照文件基本上有10个。
该消息表明这与您的函数中的主机级密钥(秘密)有关。
因此,即使我对此没有明确的解决方案(因为我从未遇到过此问题),我建议您检查
host.json
文件夹中的 D:\home\data\Functions\secrets
并查看是否有任何异常情况,例如有超过 10 个键 - 如错误消息所示。
如果您有自定义的
Startup
,可能会出现阻止主机启动的错误。
在门户中,转到该功能的页面(您可以在其中看到
function.json
的内容),(可能)会出现一条错误消息。由此,您可以了解在哪里查找错误。就我而言,当我尝试从启动类连接到 Azure Key Vault,但未向该函数授予列表权限时,会引发异常。
此异常的原因是以下任一或两者:
平台拍摄的快照/备份的最大限制是 10。发布后它将开始抛出此错误。
要解决此问题,您需要备份该文件夹并删除“.snapshot..json”文件或秘密文件夹本身以重新生成秘密文件。
您还可以从存储帐户中删除备份文件,然后导航到容器并删除现有的 snapshots.json 文件。
如果运行时无法解密秘密,那么它们将被重新生成,并且不可解密的秘密将存储在“.snapshot..json”文件中。如果快照数量 > 10,则开始触发此异常。
删除秘密备份后,您可能需要终止进程并重新启动Azure功能。
正如 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'