У моей команды есть FunctionApps, работающие в плане Elastic Premium. По умолчанию эти функции выполняются с использованием файлов Azure для хранения, но мы пытаемся запускать наши функции из файла пакета, поэтому избегаем этой зависимости.
Я следую этой документации: https://learn.microsoft.com/en-us/azure/azure-functions/run-functions-from-deployment-package#general-considerations
Я добавил WEBSITE_RUN_FROM_PACKAGE = 1 и удалил WEBSITE_CONTENTAZUREFILECONNECTIONSTRING/WEBSITE_CONTENTSHARE из настроек приложения. Я также обновил шаблон развертывания, чтобы использовать ZipDeploy вместо MSDeploy. Наше развертывание происходит в два этапа: сначала мы развертываем ресурсы (план, functionapp...), а затем развертываем код (ZipDeploy).
Теперь развертывание прошло успешно в одной из наших сред, но в другой мы можем развернуть приложение-функцию с правильными настройками приложения, но ZipDeploy завершается с ошибкой: IOException: неправильное имя пользователя или пароль. Что странно, потому что два приложения-функции имеют одинаковую конфигурацию.
Вот полное сообщение об ошибке:
Status: Failed
Error:
Code: TooManyRequests
Message: [IOException]: The user name or password is incorrect.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.Directory.InternalCreateDirectory(String fullPath, String path, Object dirSecurityObj, Boolean checkHost)
at System.IO.Directory.InternalCreateDirectoryHelper(String path, Boolean checkHost)
at System.IO.Abstractions.DirectoryWrapper.CreateDirectory(String path)
at Kudu.Core.Infrastructure.FileSystemHelpers.EnsureDirectoryIgnoreAccessExceptions(String path)
at Kudu.Services.Web.App_Start.NinjectServices.GetSettingsPath(IEnvironment environment) in C:\__w\1\s\Kudu.Services.Web\App_Start\NinjectServices.cs:line 828
at Kudu.Services.Web.App_Start.NinjectServices.EnsureValidDeploymentXmlSettings(IEnvironment environment) in C:\__w\1\s\Kudu.Services.Web\App_Start\NinjectServices.cs:line 0
at Kudu.Services.Web.App_Start.NinjectServices.RegisterServices(IKernel kernel) in C:\__w\1\s\Kudu.Services.Web\App_Start\NinjectServices.cs:line 157
at Kudu.Services.Web.App_Start.NinjectServices.CreateKernel() in C:\__w\1\s\Kudu.Services.Web\App_Start\NinjectServices.cs:line 132
at Ninject.Web.Common.Bootstrapper.Initialize(Func`1 createKernelCallback)
at Kudu.Services.Web.App_Start.NinjectServices.Start() in C:\__w\1\s\Kudu.Services.Web\App_Start\NinjectServices.cs:line 97
[TargetInvocationException]: Exception has been thrown by the target of an invocation.
at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at WebActivatorEx.BaseActivationMethodAttribute.InvokeMethod()
at WebActivatorEx.ActivationManager.RunActivationMethods[T](Boolean designerMode)
at WebActivatorEx.ActivationManager.Run()
[InvalidOperationException]: The pre-application start initialization method Run on type WebActivatorEx.ActivationManager threw an exception with the following error message: Exception has been thrown by the target of an invocation..
at System.Web.Compilation.BuildManager.InvokePreStartInitMethodsCore(ICollection`1 methods, Func`1 setHostingEnvironmentCultures)
at System.Web.Compilation.BuildManager.InvokePreStartInitMethods(ICollection`1 methods)
at System.Web.Compilation.BuildManager.CallPreStartInitMethods(String preStartInitListPath, Boolean& isRefAssemblyLoaded)
at System.Web.Compilation.BuildManager.ExecutePreAppStart()
at System.Web.Hosting.HostingEnvironment.Initialize(ApplicationManager appManager, IApplicationHost appHost, IConfigMapPathFactory configMapPathFactory, HostingEnvironmentParameters hostingParameters, PolicyLevel policyLevel, Exception appDomainCreationException)
[HttpException]: The pre-application start initialization method Run on type WebActivatorEx.ActivationManager threw an exception with the following error message: Exception has been thrown by the target of an invocation..
at System.Web.HttpRuntime.FirstRequestInit(HttpContext context)
at System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context)
at System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context)
Кроме того, если я попробую КУДО: респект
Я пытался перераспределить, но безуспешно.
Кто-нибудь сталкивался с той же проблемой при попытке использовать WEBSITE_RUN_FROM_PACKAGE = 1 и имел решение этой проблемы?
Когда я удалил настройки WEBSITE_CONTENTAZUREFILECONNECTIONSTRING
и WEBSITE_CONTENTSHARE
и повторно развернул свой триггер функции Azure в приложении-функции Azure с Elastic Premium, я получил ту же ошибку: трассировка стека Kudu была недоступна и функции не работали.
Необходимо также добавить настройки ниже и устранить The user name or password is incorrect error
,
Благодаря @ahmelsayed Github Комментарий и @Pravallika ТАКОЙ ответ - Восстановите ключи учетной записи хранения и добавьте новые Account keys
в значения настроек WEBSITE_CONTENTAZUREFILECONNECTIONSTRING
, WEBSITE_CONTENTSHARE
и AzureWebJobsStorage
в качестве строк подключения: -
Я повторно добавил настройки ниже как Advanced edit
, и Log stream
снова начал успешно работать:
Когда я повторно добавил вышеуказанные настройки, функции начали успешно работать: -
{
"name": "WEBSITE_CONTENTAZUREFILECONNECTIONSTRING",
"value": "DefaultEndpointsProtocol=https;AccountName=siliconrg80bd;AccountKey=<RecheckAccountKeyORRegenerate>;EndpointSuffix=core.windows.net",
"slotSetting": false
},
{
"name": "WEBSITE_CONTENTSHARE",
"value": "siliconfunc98085a5",
"slotSetting": false
},
{
"name": "AzureWebJobsStorage",
"value": "DefaultEndpointsProtocol=https;AccountName=siliconrg80bd;AccountKey=<RecheckAccountKeyORRegenerate>;EndpointSuffix=core.windows.net",
"slotSetting": false
},
{
"name": "WEBSITE_RUN_FROM_PACKAGE",
"value": "1",
"slotSetting": false
}
Выход:-
Если вы используете Publish Profile
для развертывания функций, еще раз проверьте значения имени пользователя и пароля в профиле публикации для развертывания zip ИЛИ Reset Publish profile
: -
Publishprofile.publishsettings:-
Zip Deploy" publishMethod = "ZipDeploy" publishUrl = "siliconfunc980.scm.azurewebsites.net:443" userName = "$siliconfunc980" userPWD = "yxxxxxxxxxxxxxEnC"
Для большего контекста мы пытались использовать WEBSITE_RUN_FROM_PACKAGE = 1, потому что хотим избавиться от WEBSITE_CONTENTAZUREFILECONNECTIONSTRING и WEBSITE_CONTENTSHARE.
Это возможно согласно https://learn.microsoft.com/en-us/azure/azure-functions/storage-considerations?tabs=azure-cli
Если вышеизложенное правильно учтено, вы можете создать приложение без файлов Azure. Создайте приложение-функцию без указания WEBSITE_CONTENTAZUREFILECONNECTIONSTRING и WEBSITE_CONTENTSHARE настройки приложения. Вы можете избежать этих настроек, создав Шаблон ARM для стандартного развертывания, удаление двух настроек и затем развертывание шаблона.
В итоге я нашел решение своей проблемы здесь: https://github.com/projectkudu/kudu/wiki/WEBSITE_RUN_FROM_PACKAGE-and-WEBSITE_CONTENTAZUREFILECONNECTIONSTRING-Best-Practices
Лучшая практика
Настоятельно рекомендуется установить этот параметр при создании приложения. время и неизменяемы на протяжении всего времени существования приложения. На самом деле, существует нет сценария, в котором нужно было бы время от времени менять этот параметр или особенно во время развертывания. Изменение этого значения приведет к развертыванию и время выполнения приложения ведет себя некорректно, гарантированное время простоя и данные восприятие потери (развернутые файлы находятся не там, где они ожидаются) - представьте себе замену жесткого диска при установке программного обеспечения на компьютер.
TL;DR -> Удаление ресурсов перед их повторным развертыванием с новой настройкой (WEBSITE_RUN_FROM_PACKAGE = 1) устранило проблему.