Перевод приложений с Функций Azure версии 3.x на версию 4.x

Функции Azure версии 4.x имеют высокую обратную совместимость с версией 3.x. Большинство приложений должны безопасно перенестися на 4.x, не требуя значительных изменений кода. Дополнительные сведения о версиях среды выполнения функций см. в Функции Azure обзоре версий среды выполнения.

Внимание

По состоянию на 13 декабря 2022 г. для приложений-функций, работающих в версиях 2.x и 3.x среды выполнения функций Azure, завершилась расширенная поддержка. Дополнительные сведения см. в разделе "Устаревшие версии".

В этой статье описывается процесс безопасной миграции приложения-функции для запуска в среде выполнения Функций версии 4.x. Так как инструкции по миграции проекта зависят от языка, обязательно выберите язык разработки из селектора в верхней части статьи.

Определение приложений-функций для миграции

Используйте следующий сценарий PowerShell для создания списка приложений-функций в подписке, предназначенных для версий 2.x или 3.x:

$Subscription = '<YOUR SUBSCRIPTION ID>' 
 
Set-AzContext -Subscription $Subscription | Out-Null

$FunctionApps = Get-AzFunctionApp

$AppInfo = @{}

foreach ($App in $FunctionApps)
{
     if ($App.ApplicationSettings["FUNCTIONS_EXTENSION_VERSION"] -like '*3*')
     {
          $AppInfo.Add($App.Name, $App.ApplicationSettings["FUNCTIONS_EXTENSION_VERSION"])
     }
}

$AppInfo

Выбор целевой версии .NET

В среде выполнения Функций версии 3.x приложение-функция C# предназначено для .NET Core 3.1 с помощью модели внутрипроцессной или .NET 5 с помощью изолированной рабочей модели.

При переносе приложения-функции у вас есть возможность выбрать целевую версию .NET. Проект C# можно обновить до одной из следующих версий .NET, поддерживаемых функциями версии 4.x:

Версия .NET Тип выпуска политики поддержки .NET Модельпроцесса функций 1,3
.NET 82 LTS Изолированная рабочая модель
.NET 7 STS (окончание поддержки 14 мая 2024 г.) Изолированная рабочая модель
.NET 6 LTS (окончание поддержки 12 ноября 2024 г.) Изолированная рабочая модель,
Модель в процессе3
.NET Framework 4.8 См. политику Изолированная рабочая модель

1 Изолированная рабочая модель поддерживает долгосрочную поддержку (LTS) и стандартные версии .NET, а также платформа .NET Framework. Модель в процессе поддерживает только выпуски LTS .NET. Полное сравнение функций и функций двух моделей см. в разделе "Различия между процессом и изоляцией рабочего процесса .NET Функции Azure".

2 .NET 8 пока не поддерживается в модели в процессе, хотя она доступна в изолированной рабочей модели. Сведения о планах .NET 8, включая будущие варианты для модели в процессе, см. в статье Функции Azure "Обновление стратегии".

3 Поддержка заканчивается для модели в процессе 10 ноября 2026 года. Дополнительные сведения см . в этом объявлении о поддержке. Для непрерывной поддержки следует перенести приложения в изолированную рабочую модель.

Совет

Рекомендуется обновить до .NET 8 в изолированной рабочей модели. .NET 8 — это полностью выпущенная версия с самым длинным окном поддержки из .NET.

Хотя вместо этого можно использовать модель в процессе, это не рекомендуется, если ее можно избежать. Поддержка будет завершена для модели в процессе 10 ноября 2026 года, поэтому перед этим вам потребуется перейти к изолированной рабочей модели. Это при миграции на версию 4.x уменьшит общее количество необходимых усилий, и изолированная рабочая модель даст вашему приложению дополнительные преимущества, включая возможность более легко использовать будущие версии .NET. При переходе к изолированной рабочей модели помощник по обновлению .NET также может обрабатывать многие необходимые изменения кода.

В этом руководстве нет конкретных примеров для .NET 7 или .NET 6 в изолированной рабочей модели. Если вам нужно настроить эти версии, можно адаптировать примеры изолированной рабочей модели .NET 8.

Подготовка к переносу

Если вы еще не сделали этого, определите список приложений, которые необходимо перенести в текущей подписке Azure с помощью Azure PowerShell.

Прежде чем перенести приложение в среду выполнения функций версии 4.x, выполните следующие задачи:

  1. Просмотрите список критических изменений между версиями 3.x и 4.x.
  2. Выполните действия, описанные в разделе "Миграция локального проекта", чтобы перенести локальный проект в версию 4.x.
  3. После переноса проекта полностью протестируйте приложение локально с помощью версии 4.x Функции Azure Core Tools.
  4. Запустите проверяющий средство предварительного обновления в приложении, размещенном в Azure, и устраните все выявленные проблемы.
  5. Обновите приложение-функцию в Azure до новой версии. Если вам нужно свести к минимуму время простоя, рассмотрите возможность использования промежуточного слота для тестирования и проверки перенесенного приложения в Azure в новой версии среды выполнения. Затем можно развернуть приложение с обновленными параметрами версии в рабочем слоте. Дополнительные сведения см. в разделе "Обновление с помощью слотов".
  6. Опубликуйте перенесенный проект в обновленном приложении-функции.

При использовании Visual Studio для публикации проекта версии 4.x в существующем приложении-функции в более низкой версии вам будет предложено разрешить Visual Studio обновить приложение-функцию до версии 4.x во время развертывания. Это обновление использует тот же процесс, определенный в обновлении без слотов.

Перенос локального проекта

Инструкции по обновлению зависят от языка. Если язык не отображается, выберите его из селектора в верхней части статьи.

Выберите вкладку, соответствующую целевой версии .NET, и требуемую модель процесса (внутрипроцессный или изолированный рабочий процесс).

Совет

При переходе на LTS или STS-версию .NET с помощью изолированной рабочей модели помощник по обновлению .NET можно использовать для автоматического внесения многих изменений, упоминание в следующих разделах.

Файл проекта

В следующем примере представлен .csproj файл проекта, использующий .NET Core 3.1 в версии 3.x:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <AzureFunctionsVersion>v3</AzureFunctionsVersion>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.NET.Sdk.Functions" Version="3.0.13" />
  </ItemGroup>
  <ItemGroup>
    <Reference Include="Microsoft.CSharp" />
  </ItemGroup>
  <ItemGroup>
    <None Update="host.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
    <None Update="local.settings.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <CopyToPublishDirectory>Never</CopyToPublishDirectory>
    </None>
  </ItemGroup>
</Project>

Используйте одну из следующих процедур, чтобы обновить этот XML-файл для запуска в Функциях версии 4.x:

В этих шагах предполагается, что локальный проект C# и если приложение вместо этого использует скрипт C# (.csx файлы), перед продолжением следует преобразовать в модель проекта.

В XML-файле проекта требуются .csproj следующие изменения:

  1. Задайте значение PropertyGroup.TargetFramework изменено на net8.0.

  2. Задайте значение PropertyGroup.AzureFunctionsVersion изменено на v4.

  3. Добавьте следующий OutputType элемент в :PropertyGroup

    <OutputType>Exe</OutputType>
    
  4. ItemGroupВ .PackageReference список, замените ссылку на Microsoft.NET.Sdk.Functions пакет следующими ссылками:

      <FrameworkReference Include="Microsoft.AspNetCore.App" />
      <PackageReference Include="Microsoft.Azure.Functions.Worker" Version="1.21.0" />
      <PackageReference Include="Microsoft.Azure.Functions.Worker.Sdk" Version="1.17.2" />
      <PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.Http.AspNetCore" Version="1.2.1" />
      <PackageReference Include="Microsoft.ApplicationInsights.WorkerService" Version="2.22.0" />
      <PackageReference Include="Microsoft.Azure.Functions.Worker.ApplicationInsights" Version="1.2.0" />
    

    Запишите ссылки на другие пакеты в Microsoft.Azure.WebJobs.* пространствах имен. Вы замените эти пакеты на следующем шаге.

  5. Добавьте следующее новое:ItemGroup

    <ItemGroup>
      <Using Include="System.Threading.ExecutionContext" Alias="ExecutionContext"/>
    </ItemGroup>
    

После внесения этих изменений обновленный проект должен выглядеть следующим образом:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net8.0</TargetFramework>
    <AzureFunctionsVersion>v4</AzureFunctionsVersion>
    <RootNamespace>My.Namespace</RootNamespace>
    <OutputType>Exe</OutputType>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>
  <ItemGroup>
    <FrameworkReference Include="Microsoft.AspNetCore.App" />
    <PackageReference Include="Microsoft.Azure.Functions.Worker" Version="1.21.0" />
    <PackageReference Include="Microsoft.Azure.Functions.Worker.Sdk" Version="1.17.2" />
    <PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.Http.AspNetCore" Version="1.2.1" />
    <PackageReference Include="Microsoft.ApplicationInsights.WorkerService" Version="2.22.0" />
    <PackageReference Include="Microsoft.Azure.Functions.Worker.ApplicationInsights" Version="1.2.0" />
    <!-- Other packages may also be in this list -->
  </ItemGroup>
  <ItemGroup>
    <None Update="host.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
    <None Update="local.settings.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <CopyToPublishDirectory>Never</CopyToPublishDirectory>
    </None>
  </ItemGroup>
  <ItemGroup>
    <Using Include="System.Threading.ExecutionContext" Alias="ExecutionContext"/>
  </ItemGroup>
</Project>

Изменения в пакете и пространстве имен

На основе модели, в который выполняется миграция, может потребоваться обновить или изменить пакеты, на которые ссылается приложение. При внедрении целевых пакетов необходимо обновить пространство имен инструкций using и некоторые типы, на которые вы ссылаетесь. Вы можете увидеть влияние этих изменений пространства имен на using инструкции в примерах шаблона триггера HTTP далее в этой статье.

Если вы еще не сделали этого, обновите проект, чтобы ссылаться на последние стабильные версии:

В зависимости от триггеров и привязок, которые использует приложение, может потребоваться ссылаться на другой набор пакетов. В следующей таблице показаны замены некоторых наиболее часто используемых расширений:

Сценарий Изменения ссылок на пакеты
Триггер по таймеру Добавить
Microsoft.Azure.Functions.Worker.Extensions.Timer
Привязки хранилища Replace
Microsoft.Azure.WebJobs.Extensions.Storage
на
Microsoft.Azure.Functions.Worker.Extensions. служба хранилища. Большие двоичные объекты,
Microsoft.Azure.Functions.Worker.Extensions. служба хранилища. Очереди и
Microsoft.Azure.Functions.Worker.Extensions.Tables
Привязки больших двоичных объектов Замена ссылок на
Microsoft.Azure.WebJobs.Extensions.Storage.Blobs
с последней версией
Microsoft.Azure.Functions.Worker.Extensions. служба хранилища. Большие двоичные объекты
Привязки очередей Замена ссылок на
Microsoft.Azure.WebJobs.Extensions.Storage.Queues
с последней версией
Microsoft.Azure.Functions.Worker.Extensions. служба хранилища. Очереди
Привязки таблиц Замена ссылок на
Microsoft.Azure.WebJobs.Extensions.Tables
с последней версией
Microsoft.Azure.Functions.Worker.Extensions.Tables
Привязки Cosmos DB Замена ссылок на
Microsoft.Azure.WebJobs.Extensions.CosmosDB
и (или)
Microsoft.Azure.WebJobs.Extensions.DocumentDB
с последней версией
Microsoft.Azure.Functions.Worker.Extensions.CosmosDB
Привязки служебной шины Замена ссылок на
Microsoft.Azure.WebJobs.Extensions.ServiceBus
с последней версией
Microsoft.Azure.Functions.Worker.Extensions.ServiceBus
Привязки Центров событий Замена ссылок на
Microsoft.Azure.WebJobs.Extensions.EventHubs
с последней версией
Microsoft.Azure.Functions.Worker.Extensions.EventHubs
Привязки сетки событий Замена ссылок на
Microsoft.Azure.WebJobs.Extensions.EventGrid
с последней версией
Microsoft.Azure.Functions.Worker.Extensions.EventGrid
Привязки Службы SignalR Замена ссылок на
Microsoft.Azure.WebJobs.Extensions.SignalRService
с последней версией
Microsoft.Azure.Functions.Worker.Extensions.SignalRService
Устойчивые функции Замена ссылок на
Microsoft.Azure.WebJobs.Extensions.DurableTask
с последней версией
Microsoft.Azure.Functions.Worker.Extensions.DurableTask
Устойчивые функции
(поставщик хранилища SQL)
Замена ссылок на
Microsoft.DurableTask.SqlServer.AzureFunctions
с последней версией
Microsoft.Azure.Functions.Worker.Extensions.DurableTask.SqlServer
Устойчивые функции
(поставщик хранилища Netherite)
Замена ссылок на
Microsoft.Azure.DurableTask.Netherite.AzureFunctions
с последней версией
Microsoft.Azure.Functions.Worker.Extensions.DurableTask.Netherite
Привязки SendGrid Замена ссылок на
Microsoft.Azure.WebJobs.Extensions.SendGrid
с последней версией
Microsoft.Azure.Functions.Worker.Extensions.SendGrid
Привязки Kafka Замена ссылок на
Microsoft.Azure.WebJobs.Extensions.Kafka
с последней версией
Microsoft.Azure.Functions.Worker.Extensions.Kafka
Привязки RabbitMQ Замена ссылок на
Microsoft.Azure.WebJobs.Extensions.RabbitMQ
с последней версией
Microsoft.Azure.Functions.Worker.Extensions.RabbitMQ
Внедрение зависимостей
и конфигурация запуска
Удаление ссылок на
Microsoft.Azure.Functions.Extensions
(Изолированная рабочая модель предоставляет эту функцию по умолчанию.)

Ознакомьтесь с поддерживаемыми привязками для полного списка расширений, которые следует рассмотреть, и ознакомьтесь с документацией по каждому расширению, чтобы получить полные инструкции по установке для изолированной модели процесса. Не забудьте установить последнюю стабильную версию всех целевых пакетов.

Совет

Любые изменения версий расширений во время этого процесса могут потребовать обновления host.json файла. Обязательно ознакомьтесь с документацией по каждому используемому расширению. Например, расширение служебная шина имеет критические изменения в структуре между версиями 4.x и 5.x. Дополнительные сведения см. в Служебная шина Azure привязках для Функции Azure.

Приложение изолированной рабочей модели не должно ссылаться на пакеты в Microsoft.Azure.WebJobs.* пространствах имен или Microsoft.Azure.Functions.Extensions. Если у вас есть оставшиеся ссылки на них, их следует удалить.

Совет

Ваше приложение также может зависеть от типов azure SDK, как часть триггеров и привязок, так и в качестве автономной зависимости. Вы должны воспользоваться этой возможностью, чтобы обновить их, а также. Последние версии расширений функций работают с последними версиями пакета SDK Azure для .NET, почти все пакеты, для которых это форма Azure.*.

файл Program.cs

При миграции на выполнение в изолированном рабочем процессе необходимо добавить следующий файл program.cs в проект:

using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

var host = new HostBuilder()
    .ConfigureFunctionsWebApplication()
    .ConfigureServices(services => {
        services.AddApplicationInsightsTelemetryWorkerService();
        services.ConfigureFunctionsApplicationInsights();
    })
    .Build();

host.Run();

Этот пример включает интеграцию ASP.NET Core для повышения производительности и предоставления знакомой модели программирования при использовании триггеров HTTP в приложении. Если вы не планируете использовать триггеры HTTP, можно заменить вызов ConfigureFunctionsWebApplication вызовом ConfigureFunctionsWorkerDefaults. При этом можно удалить ссылку Microsoft.Azure.Functions.Worker.Extensions.Http.AspNetCore на файл проекта. Однако для оптимальной производительности даже для функций с другими типами триггеров следует сохранить FrameworkReference ASP.NET Core.

Файл Program.cs заменит любой файл, имеющий FunctionsStartup атрибут, который обычно является файлом Startup.cs . В местах, где FunctionsStartup будет ссылаться IFunctionsHostBuilder.Servicesваш код, можно вместо этого добавлять инструкции в .ConfigureServices() метод HostBuilder в вашем Program.csкоде. Дополнительные сведения о работе с Program.csней см. в руководстве по изолированной рабочей модели.

Program.cs Приведенные выше примеры включают настройку интеграции Application Аналитика для изолированной рабочей модели. В вашем Program.csприложении также необходимо настроить фильтрацию журналов, которая должна применяться к журналам, поступающим из кода в проекте. В изолированной рабочей модели host.json файл управляет только событиями, создаваемыми средой выполнения узла Функций. Если правила Program.csфильтрации не настроены, могут возникнуть различия в уровнях журналов, присутствующих для различных категорий в телеметрии.

Хотя вы можете зарегистрировать пользовательские источники конфигурации в рамках HostBuilderпрограммы, обратите внимание, что они аналогично применяются только к коду в проекте. Настройка триггера и привязки также необходима для платформы, и это должно быть предоставлено с помощью параметров приложения, ссылок Key Vault или Конфигурация приложений ссылок на функции.

После перемещения всего из любого существующего FunctionsStartupProgram.cs в файл можно удалить FunctionsStartup атрибут и класс, к который он был применен.

файле local.settings.json

Файл local.settings.json используется только при локальном запуске. Дополнительные сведения см. в файле локальных параметров.

При переходе на версию 4.x убедитесь, что файл local.settings.json содержит по крайней мере следующие элементы:

{
    "IsEncrypted": false,
    "Values": {
        "AzureWebJobsStorage": "AzureWebJobsStorageConnectionStringValue",
        "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated"
    }
}

Примечание.

При переходе от выполнения процесса к выполнению в изолированном рабочем процессе необходимо изменить FUNCTIONS_WORKER_RUNTIME значение на "dotnet-isolated".

файл host.json

Изменения в файле не требуются host.json . Однако если ваша конфигурация приложения Аналитика в этом файле из проекта модели в процессе, может потребоваться внести дополнительные изменения в Program.cs файл. Файл host.json управляет ведением журнала только из среды выполнения узла Функций и в изолированной рабочей модели некоторые из этих журналов приходят непосредственно из приложения, что дает вам больше контроля. Дополнительные сведения об фильтрации этих журналов см. в статье "Управление уровнями журналов в изолированной рабочей модели ".

Изменения имени класса

Некоторые классы ключей изменили имена между версиями. Эти изменения являются результатом изменений в API .NET или в различиях между процессом и изолированным рабочим процессом. В следующей таблице указаны ключевые классы .NET, используемые функциями, которые могут измениться при миграции:

.NET Core 3.1. .NET 5 .NET 8
FunctionName (атрибут) Function (атрибут) Function (атрибут)
ILogger ILogger ILogger, ILogger<T>
HttpRequest HttpRequestData HttpRequestData, HttpRequest (использование интеграции ASP.NET Core)
IActionResult HttpResponseData HttpResponseData, IActionResult (использование интеграции ASP.NET Core)
FunctionsStartup (атрибут) Вместо этого используется Program.cs Вместо этого используется Program.cs

В привязках также могут быть различия имен классов. Дополнительные сведения см. в справочных статьях по конкретным привязкам.

Другие изменения кода

В этом разделе рассматриваются другие изменения кода, которые следует учитывать при работе с миграцией. Эти изменения не требуются для всех приложений, но следует оценить, имеют ли они отношение к вашим сценариям. Не забудьте проверка критические изменения между 3.x и 4.x для дополнительных изменений, которые могут потребоваться внести в проект.

Сериализация JSON

По умолчанию изолированная рабочая модель используется System.Text.Json для сериализации JSON. Сведения о настройке параметров сериализатора или переключении на JSON.NET (Newtonsoft.Json) см . в этих инструкциях.

Уровни журналов и фильтрация приложений Аналитика

Журналы можно отправлять в приложение Аналитика из среды выполнения узла функций и кода в проекте. Это host.json позволяет настраивать правила для ведения журнала узлов, но управлять журналами, поступающими из кода, необходимо настроить правила фильтрации в рамках вашего кода Program.cs. Дополнительные сведения об фильтрации этих журналов см. в статье "Управление уровнями журналов в изолированной рабочей модели ".

Шаблон триггера HTTP

Различия между процессом и изолированным рабочим процессом можно увидеть в триггерных функциях HTTP. Шаблон триггера HTTP для версии 3.x (в процессе) выглядит следующим образом:

using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;

namespace Company.Function
{
    public static class HttpTriggerCSharp
    {
        [FunctionName("HttpTriggerCSharp")]
        public static async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.AuthLevelValue, "get", "post", Route = null)] HttpRequest req,
            ILogger log)
        {
            log.LogInformation("C# HTTP trigger function processed a request.");

            string name = req.Query["name"];

            string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
            dynamic data = JsonConvert.DeserializeObject(requestBody);
            name = name ?? data?.name;

            string responseMessage = string.IsNullOrEmpty(name)
                ? "This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response."
                : $"Hello, {name}. This HTTP triggered function executed successfully.";

            return new OkObjectResult(responseMessage);
        }
    }
}

Шаблон триггера HTTP для перенесенной версии выглядит следующим образом:

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.Logging;

namespace Company.Function
{
    public class HttpTriggerCSharp
    {
        private readonly ILogger<HttpTriggerCSharp> _logger;

        public HttpTriggerCSharp(ILogger<HttpTriggerCSharp> logger)
        {
            _logger = logger;
        }

        [Function("HttpTriggerCSharp")]
        public IActionResult Run(
            [HttpTrigger(AuthorizationLevel.Function, "get")] HttpRequest req)
        {
            _logger.LogInformation("C# HTTP trigger function processed a request.");

            return new OkObjectResult($"Welcome to Azure Functions, {req.Query["name"]}!");
        }
    }
}

Чтобы обновить проект до версии 4.x службы "Функции Azure":

  1. Обновите локальную установку Azure Functions Core Tools до версии 4.x.

  2. Обновите пакет расширений Функций Azure приложения до версии 2.x или более поздней версии. Дополнительные сведения см. в разделе Критические изменения.

  1. При необходимости перейдите к одной из версий Java, поддерживаемых в версии 4.x.

  2. Обновите файл приложения POM.xml , чтобы изменить FUNCTIONS_EXTENSION_VERSION параметр ~4, как показано в следующем примере:

    <configuration>
        <resourceGroup>${functionResourceGroup}</resourceGroup>
        <appName>${functionAppName}</appName>
        <region>${functionAppRegion}</region>
        <appSettings>
            <property>
                <name>WEBSITE_RUN_FROM_PACKAGE</name>
                <value>1</value>
            </property>
            <property>
                <name>FUNCTIONS_EXTENSION_VERSION</name>
                <value>~4</value>
            </property>
        </appSettings>
    </configuration>
    
  1. При необходимости перейдите к одной из версий Node.js, поддерживаемых в версии 4.x.
  1. Воспользуйтесь этой возможностью для обновления до PowerShell 7.2, что рекомендуется. Дополнительные сведения см. в версиях PowerShell.
  1. Если вы используете Python 3.6, перейдите на одну из поддерживаемых версий.

Запуск средства проверки перед обновлением

Функции Azure предоставляет средство проверки перед обновлением, которое поможет выявить потенциальные проблемы при переносе приложения-функции в версию 4.x. Чтобы запустить средство проверки перед обновлением:

  1. На портале Azure перейдите к своему приложению-функции.

  2. Откройте страницу Диагностика и решение проблем

  3. В средстве диагностики приложения-функция начните вводить текст Functions 4.x Pre-Upgrade Validator и выберите соответствующий пункт из списка.

  4. После завершения проверки просмотрите рекомендации и устраните выявленные проблемы в приложении. Если необходимо внести изменения в приложение, обязательно проверьте изменения в среде выполнения Функций версии 4.x локально с помощью Azure Functions Core Tools версии 4 или с помощью промежуточного слота.

Обновление приложения-функции в Azure

Перед публикацией перенесенного проекта необходимо обновить среду выполнения узла приложения-функции в Azure до версии 4.x. Версия среды выполнения, используемая узлом функций, управляется FUNCTIONS_EXTENSION_VERSION параметром приложения, но в некоторых случаях другие параметры также должны быть обновлены. Изменения кода и изменения параметров приложения требуют перезапуска приложения-функции.

Самый простой способ — обновить без слотов , а затем повторно опубликовать проект приложения. Вы также можете свести к минимуму время простоя в приложении и упростить откат, обновив слоты.

Обновление без слотов

Самый простой способ обновления до версии 4.x — задать FUNCTIONS_EXTENSION_VERSION параметр ~4 приложения в приложении-функции в Azure. На сайте со слотами необходимо выполнить другую процедуру.

az functionapp config appsettings set --settings FUNCTIONS_EXTENSION_VERSION=~4 -g <RESOURCE_GROUP_NAME> -n <APP_NAME>

Необходимо также задать другой параметр, который отличается от Windows и Linux.

При запуске в Windows также необходимо включить .NET 6.0, что требуется для среды выполнения версии 4.x.

az functionapp config set --net-framework-version v6.0 -g <RESOURCE_GROUP_NAME> -n <APP_NAME>

.NET 6 требуется для приложений-функций на любом языке, работающем в Windows.

В этом примере замените <APP_NAME> именем приложения-функции и <RESOURCE_GROUP_NAME> именем группы ресурсов.

Теперь вы можете повторно опубликовать проект приложения, перенесенный для запуска в версии 4.x.

Обновление с помощью слотов

Использование слотов развертывания — это хороший способ обновить приложение-функцию до среды выполнения версии 4.x из предыдущей версии. С помощью промежуточного слота можно запустить приложение в новой версии среды выполнения в промежуточном слоте и перейти в рабочую среду после проверки. Слоты также позволяют свести к минимуму время простоя во время обновления. Если необходимо свести к минимуму время простоя, выполните действия, описанные в разделе "Минимальное время простоя".

После проверки приложения в обновленном слоте вы можете переключить приложение и новые параметры версии в рабочую среду. Для этого переключения требуется установить параметр WEBSITE_OVERRIDE_STICKY_EXTENSION_VERSIONS=0 в рабочем слоте. Добавление этого параметра влияет на время простоя, необходимое для обновления.

Стандартное обновление

Если для приложения-функции с поддержкой слотов допустимо время простоя, необходимое для полного перезапуска, можно обновить параметр WEBSITE_OVERRIDE_STICKY_EXTENSION_VERSIONS непосредственно в рабочем слоте. Так как изменение этого параметра непосредственно в рабочем слоте приводит к перезапуску, влияющему на доступность, рекомендуется выполнять это изменение в период пониженного трафика. Затем можно заменить обновленную версию из промежуточного слота.

Командлет PowerShell Update-AzFunctionAppSetting в настоящее время не поддерживает слоты. Необходимо использовать Azure CLI или портал Azure.

  1. Используйте следующую команду, чтобы задать WEBSITE_OVERRIDE_STICKY_EXTENSION_VERSIONS=0 в рабочем слоте:

    az functionapp config appsettings set --settings WEBSITE_OVERRIDE_STICKY_EXTENSION_VERSIONS=0  -g <RESOURCE_GROUP_NAME>  -n <APP_NAME> 
    

    В этом примере замените <APP_NAME> именем приложения-функции и <RESOURCE_GROUP_NAME> именем группы ресурсов. Эта команда приводит к перезапуску приложения, запущенного в рабочем слоте.

  2. Используйте следующую команду, чтобы также задать WEBSITE_OVERRIDE_STICKY_EXTENSION_VERSIONS в промежуточном слоте:

    az functionapp config appsettings set --settings WEBSITE_OVERRIDE_STICKY_EXTENSION_VERSIONS=0 -g <RESOURCE_GROUP_NAME>  -n <APP_NAME> --slot <SLOT_NAME>
    
  3. Используйте следующую команду, чтобы изменить FUNCTIONS_EXTENSION_VERSION и обновить промежуточный слот до новой версии среды выполнения:

    az functionapp config appsettings set --settings FUNCTIONS_EXTENSION_VERSION=~4 -g <RESOURCE_GROUP_NAME>  -n <APP_NAME> --slot <SLOT_NAME>
    
  4. Для среды выполнения функций версии 4.x требуется .NET 6 в Windows. В Linux приложения .NET также должны обновляться до .NET 6. Используйте следующую команду, чтобы среда выполнения была запущена в .NET 6:

    При запуске в Windows также необходимо включить .NET 6.0, что требуется для среды выполнения версии 4.x.

    az functionapp config set --net-framework-version v6.0 -g <RESOURCE_GROUP_NAME> -n <APP_NAME>
    

    .NET 6 требуется для приложений-функций на любом языке, работающем в Windows.

    В этом примере замените <APP_NAME> именем приложения-функции и <RESOURCE_GROUP_NAME> именем группы ресурсов.

  5. Если в проекте кода требуются обновления, чтобы он работал в версии 4.x, разверните эти обновления в промежуточном слоте.

  6. Убедитесь, что приложение-функция работает правильно в обновленной промежуточной среде перед переключением.

  7. Используйте следующую команду, чтобы переключить обновленный промежуточный слот на рабочую среду:

    az functionapp deployment slot swap -g <RESOURCE_GROUP_NAME>  -n <APP_NAME> --slot <SLOT_NAME> --target-slot production
    

Минимальное обновление простоя

Чтобы свести к минимуму время простоя в рабочем приложении, можно переключить параметр WEBSITE_OVERRIDE_STICKY_EXTENSION_VERSIONS из промежуточного слота в рабочую среду. После этого можно переключить обновленную версию из предварительно созданного промежуточного слота.

  1. Используйте следующую команду, чтобы задать WEBSITE_OVERRIDE_STICKY_EXTENSION_VERSIONS=0 в промежуточном слоте:

    az functionapp config appsettings set --settings WEBSITE_OVERRIDE_STICKY_EXTENSION_VERSIONS=0 -g <RESOURCE_GROUP_NAME>  -n <APP_NAME> --slot <SLOT_NAME>
    
  2. Используйте следующие команды, чтобы переключить слот с новым параметром в рабочую среду и одновременно восстановить параметр версии в промежуточном слоте.

    az functionapp deployment slot swap -g <RESOURCE_GROUP_NAME>  -n <APP_NAME> --slot <SLOT_NAME> --target-slot production
    az functionapp config appsettings set --settings FUNCTIONS_EXTENSION_VERSION=~3 -g <RESOURCE_GROUP_NAME>  -n <APP_NAME> --slot <SLOT_NAME>
    

    Во период времени между переключением и восстановлением версии среды выполнения в промежуточном слоте в нем могут возникать ошибки. Эта ошибка может произойти, так как WEBSITE_OVERRIDE_STICKY_EXTENSION_VERSIONS=0 при промежуточном выполнении во время переключения параметр удаляется FUNCTIONS_EXTENSION_VERSION в промежуточном режиме. Без параметра версии слот находится в плохом состоянии. Обновление версии в промежуточном слоте сразу после переключения должно вернуть слот обратно в хорошее состояние. При необходимости можно выполнить откат изменений. Однако любой откат переключения также требует непосредственного удаления WEBSITE_OVERRIDE_STICKY_EXTENSION_VERSIONS=0 из рабочей среды перед переключением, чтобы предотвратить те же ошибки в рабочей среде, что и в промежуточной среде. Это изменение в рабочем параметре приведет к перезапуску.

  3. Используйте следующую команду, чтобы снова задать WEBSITE_OVERRIDE_STICKY_EXTENSION_VERSIONS=0 в промежуточном слоте:

    az functionapp config appsettings set --settings WEBSITE_OVERRIDE_STICKY_EXTENSION_VERSIONS=0 -g <RESOURCE_GROUP_NAME>  -n <APP_NAME> --slot <SLOT_NAME>
    

    На этом этапе в обоих слотах установлено WEBSITE_OVERRIDE_STICKY_EXTENSION_VERSIONS=0.

  4. Используйте следующую команду, чтобы изменить FUNCTIONS_EXTENSION_VERSION и обновить промежуточный слот до новой версии среды выполнения:

    az functionapp config appsettings set --settings FUNCTIONS_EXTENSION_VERSION=~4 -g <RESOURCE_GROUP_NAME>  -n <APP_NAME> --slot <SLOT_NAME>
    
  5. Для среды выполнения функций версии 4.x требуется .NET 6 в Windows. В Linux приложения .NET также должны обновляться до .NET 6. Используйте следующую команду, чтобы среда выполнения была запущена в .NET 6:

    При запуске в Windows также необходимо включить .NET 6.0, что требуется для среды выполнения версии 4.x.

    az functionapp config set --net-framework-version v6.0 -g <RESOURCE_GROUP_NAME> -n <APP_NAME>
    

    .NET 6 требуется для приложений-функций на любом языке, работающем в Windows.

    В этом примере замените <APP_NAME> именем приложения-функции и <RESOURCE_GROUP_NAME> именем группы ресурсов.

  6. Если в проекте кода требуются обновления, чтобы он работал в версии 4.x, разверните эти обновления в промежуточном слоте.

  7. Убедитесь, что приложение-функция работает правильно в обновленной промежуточной среде перед переключением.

  8. Используйте следующую команду, чтобы переключить обновленный и предварительно подготовленный промежуточный слот на рабочую среду:

    az functionapp deployment slot swap -g <RESOURCE_GROUP_NAME>  -n <APP_NAME> --slot <SLOT_NAME> --target-slot production
    

Критические изменения между версиями 3.x и 4.x

Ниже приведены ключевые критические изменения, которые следует учесть перед обновлением приложения 3.x до версии 4.x, включая критические изменения, относящиеся к языку. Полный список приведен в разделе о проблемах GitHub Функций Azure под названием Критическое изменение: утверждено.

Если вы не видите свой язык программирования, выберите его в списке в верхней части страницы.

Параметры выполнения

  • Функции Azure прокси-серверы — это устаревшая функция для версий 1.x до 3.x среды выполнения Функции Azure. Поддержка прокси-серверов функций может быть повторно включена в версии 4.x, чтобы можно было успешно обновить приложения-функции до последней версии среды выполнения. Как можно скорее следует переключиться на интеграцию приложений-функций с Azure Управление API. Управление API позволяет воспользоваться преимуществами более полного набора функций для определения, защиты, администрации и монетизации API на основе Функций. Дополнительные сведения см. в разделе Управление API интеграции. Дополнительные сведения о том, как повторно включить поддержку прокси-серверов в Функциях версии 4.x, см. в статье "Повторное включение прокси-серверов" в Функциях версии 4.x.

  • Ведение журнала для службы хранилища Azure с помощью AzureWebJobsDashboard больше не поддерживается в версии 4.x. Вместо этого следует использовать Application Insights. (#1923)

  • Функции Azure 4.x теперь устанавливают требования к минимальной версии для расширений. Обновите до последней версии затронутых расширений. Для языков non-.NET обновите пакет расширений версии 2.x или более поздней версии. (#1987)

  • По умолчанию и максимальное время ожидания теперь применяются в версии 4.x для приложений-функций, работающих в Linux в плане потребления. (#1915)

  • Функции Azure 4.x используют Azure.Identity и Azure.Security.KeyVault.Secrets для поставщика Key Vault, а использование Microsoft.Azure.KeyVault не рекомендуется. Дополнительные сведения о настройке параметров приложения-функции приведены в разделе о Key Vault статьи Репозитории секретов. (#2048)

  • Приложения-функции, совместно использующие учетные записи хранения, не запускаются, если их идентификаторы узлов совпадают. Дополнительные сведения см. в разделе Рекомендации в отношении идентификаторов узла. (#2049)

  • Функции Azure 4.x поддерживают внутрипроцессные и изолированные приложения .NET 6.

  • InvalidHostServicesException теперь является неустранимой ошибкой. (#2045)

  • EnableEnhancedScopes включен по умолчанию. (#1954)

  • Удалите HttpClient в качестве зарегистрированной службы. (#1911)

  • Используйте единый загрузчик классов в Java 11. (#1997)

  • Остановите загрузку JAR-файлов рабочих ролей в Java 8. (#1991)

  • Версии Node.js 10 и 12 не поддерживаются Функциями Azure версии 4.х. (#1999)

  • Сериализация выходных данных в приложениях Node.js была обновлена для устранения предыдущих несоответствий. (#2007)

  • Количество потоков по умолчанию обновлено. Функции, которые не являются потокобезопасными или имеют высокий объем памяти, могут быть затронуты. (#1962)
  • Python 3.6 не поддерживается Функциями Azure версии 4.х. (#1999)

  • Передача общей памяти включена по умолчанию. (#1973)

  • Количество потоков по умолчанию обновлено. Функции, которые не являются потокобезопасными или имеют высокий объем памяти, могут быть затронуты. (#1962)

Следующие шаги