在 ARM 模板中获取函数密钥 - 间歇性失败



嗨,我使用以下代码在我们的 Arm 模板中获取功能键和触发器 URL 作为输出。

>     "outputs": {
>     "Key": {
>       "type": "string",
>       "value": "[listsecrets(resourceId('Microsoft.Web/sites/functions',
> variables('funcName'),
> parameters('NameOfService')),'2015-08-01').key]"
>     },
>     "functionUrl": {
>       "type": "string",
>       "value": "[listsecrets(resourceId('Microsoft.Web/sites/functions',
> variables('funcName'),
> parameters('NameOfService')),'2015-08-01').trigger_url]"
>     }   }

我们在应用设置中将"AzureWebJobsSecretStorageType"设置为"文件",因为它在函数 v2 中没有它就无法工作,当我们执行 ARM 模板时,它有时可以工作,但有时它会抛出以下错误,不确定它是什么问题,ARM 模板是有效的,因为它确实有效,我可以看到该函数也已成功部署在 Azure 门户中, 所以不知道为什么会失败,有什么线索吗?

[错误]错误请求: { "错误": { "代码": "错误请求", "message": "System.FormatException: 无法解密CfDJ8AAAAAAAAAAAAAAAAAAAAAB93sc99M4b_klhBWrLMfQYRpSN9,密钥无效或格式不正确 --->System.Security.Cryptography.CryptographicException: 有效负载为 无效。\r 在 Microsoft.AspNetCore.DataProtection.Cng.CbcAuthenticatedEncryptor.DecryptImpl(Byte* pb密文, UInt32 cb密文, 字节* pbAdditionalAuthenticatedData, UInt32 cbAdditionalAuthenticatedData)\r at Microsoft.AspNetCore.DataProtection.Cng.Internal.CngAuthenticatedEncryptorBase.Decrypt(ArraySegment1 ciphertext, ArraySegment1 extraalAuthenticatedData)\r at Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector.UnprotectCore(Byte[] protectedData, Boolean allowOperationsOnRevokedKeys, UnprotectStatus& 状态)\r 在 Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector.DangerousUnprotect(Byte[] protectedData, Boolean ignoreRevocationErrors, Boolean& requiresMigration, Boolean& wasRevoked)\r at Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector.Unprotect(Byte[] 受保护的数据)\r at Microsoft.AspNetCore.DataProtection.DataProtectionCommonExtensions.Unprotect(IDataProtector 保护程序,字符串受保护数据)\r at Kudu.Core.Infrastructure.SecurityUtility.DecryptSecretString(String 内容)在 C:\Kudu 中 Files\Private\src\master\Kudu.Core\Infrastructure\SecurityUtility.cs:line 40\r --- 内部异常堆栈跟踪结束 ---\r at Kudu.Core.Infrastructure.SecurityUtility.DecryptSecretString(String 内容)在 C:\Kudu 中 Files\Private\src\master\Kudu.Core\Infrastructure\SecurityUtility.cs:line 45\r 在 Kudu.Core.Functions.FunctionManager.d__91.MoveNext() in C:\Kudu Files\Private\src\master\Kudu.Core\Functions\FunctionManager.cs:line 203rn--- End of stack trace from previous location where exception was thrown ---rn at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)rn at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)rn at Kudu.Core.Functions.FunctionManager.<GetFunctionSecretsAsync>d__12.MoveNext() in C:\Kudu Files\Private\src\master\Kudu.Core\Functions\FunctionManager.cs:line 220rn--- End of stack trace from previous location where exception was thrown ---rn at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)rn at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)rn at Kudu.Services.Functions.FunctionController.<GetSecrets>d__12.MoveNext() in C:\Kudu Files\Private\src\master\Kudu.Services\Functions\FunctionController.cs:line 141rn--- End of stack trace from previous location where exception was thrown ---rn at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)rn at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)rn at System.Threading.Tasks.TaskHelpersExtensions.<CastToObject>d__31.移动下一个()\r--- 从引发异常的上一个位置的堆栈跟踪结束 ---\r at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task 任务)\r 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task 任务)\r 在 System.Web.Http.Controllers.ApiControllerActionInvoker.d__0.MoveNext()\r--- 从引发异常的上一个位置的堆栈跟踪结束 ---\r at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task 任务)\r 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task 任务)\r 在 System.Web.Http.Filters.ActionFilterAttribute.d__5.MoveNext()\r--- 从引发异常的上一个位置的堆栈跟踪结束 ---\r at System.Web.Http.Filters.ActionFilterAttribute.d__5.MoveNext()\r--- 从引发异常的上一个位置的堆栈跟踪结束 ---\r at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task 任务)\r 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task 任务)\r 在 System.Web.Http.Filters.ActionFilterAttribute.d__0.MoveNext()\r--- 从引发异常的上一个位置的堆栈跟踪结束 ---\r at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task 任务)\r 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task 任务)\r 在 System.Web.Http.Filters.ActionFilterAttribute.d__5.MoveNext()\r--- 从引发异常的上一个位置的堆栈跟踪结束 ---\r at System.Web.Http.Filters.ActionFilterAttribute.d__5.MoveNext()\r--- 从引发异常的上一个位置的堆栈跟踪结束 ---\r at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task 任务)\r 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task 任务)\r 在 System.Web.Http.Filters.ActionFilterAttribute.d__0.MoveNext()\r--- 从引发异常的上一个位置的堆栈跟踪结束 ---\r at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task 任务)\r 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task 任务)\r 在 System.Web.Http.Controllers.ActionFilterResult.d__2.MoveNext()\r--- 从引发异常的上一个位置的堆栈跟踪结束 ---\r at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task 任务)\r 在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task 任务)\r 在 System.Web.Http.Controllers.ExceptionFilterResult.d__0.MoveNext()" }

我找到了导致这种情况的原因,它仅在函数的新部署期间发生,即当我删除函数应用程序然后尝试部署时,我遇到了这个问题,原因是我只是删除了函数应用程序而不是与之相关的存储帐户,因此旧的存储帐户保留了有关已删除的函数应用程序的一些信息(我假设),事情变得混乱, 当我开始使用函数应用删除存储帐户时,问题就消失了。只需添加该存储帐户专用于此函数应用,不由任何其他内容使用。

根据您的错误消息,我假设功能键看起来像CfDJ8AAAAAAAAAAAAAAAAAAAAAB93sc99M4b_klhBWrLMfQYRpSN9。但是,这种密钥格式没有意义。我遇到过几次同样的情况。钥匙看起来和你的一模一样。

在这种情况下,密钥本身的格式不正确。它有时会发生。因此,唯一的解决方案是续订密钥。然后它将看起来是一个正常的base-64编码的。

相关内容

最新更新