Events
Mar 17, 9 PM - Mar 21, 10 AM
Join the meetup series to build scalable AI solutions based on real-world use cases with fellow developers and experts.
Register nowThis browser is no longer supported.
Upgrade to Microsoft Edge to take advantage of the latest features, security updates, and technical support.
Azure Functions version 4.x is highly backwards compatible to version 3.x. Most apps should safely migrate to 4.x without requiring significant code changes. For more information about Functions runtime versions, see Azure Functions runtime versions overview.
Important
As of December 13, 2022, function apps running on versions 2.x and 3.x of the Azure Functions runtime have reached the end of extended support. For more information, see Retired versions.
This article walks you through the process of safely migrating your function app to run on version 4.x of the Functions runtime. Because project migration instructions are language dependent, make sure to choose your development language from the selector at the top of the article.
Use the following PowerShell script to generate a list of function apps in your subscription that currently target versions 2.x or 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
On version 3.x of the Functions runtime, your C# function app targets .NET Core 3.1 using the in-process model or .NET 5 using the isolated worker model.
When you migrate your function app, you have the opportunity to choose the target version of .NET. You can update your C# project to one of the following versions of .NET that are supported by Functions version 4.x:
.NET version | .NET Official Support Policy release type | Functions process model1,2 |
---|---|---|
.NET 9 | STS (end of support May 12, 2026) | Isolated worker model |
.NET 8 | LTS (end of support November 10, 2026) | Isolated worker model, In-process model2 |
.NET Framework 4.8 | See policy | Isolated worker model |
1 The isolated worker model supports Long Term Support (LTS) and Standard Term Support (STS) versions of .NET, as well as .NET Framework. The in-process model only supports LTS releases of .NET, ending with .NET 8. For a full feature and functionality comparison between the two models, see Differences between in-process and isolate worker process .NET Azure Functions.
2 Support ends for the in-process model on November 10, 2026. For more information, see this support announcement. For continued full support, you should migrate your apps to the isolated worker model.
Tip
We recommend updating to .NET 8 on the isolated worker model. .NET 8 is the fully released version with the longest support window from .NET.
Although you can choose to instead use the in-process model, this is not recommended if it can be avoided. Support will end for the in-process model on November 10, 2026, so you'll need to move to the isolated worker model before then. Doing so while migrating to version 4.x will decrease the total effort required, and the isolated worker model will give your app additional benefits, including the ability to more easily target future versions of .NET. If you are moving to the isolated worker model, the .NET Upgrade Assistant can also handle many of the necessary code changes for you.
This guide doesn't present specific examples for .NET 9. If you need to target that version, you can adapt the .NET 8 examples for the isolated worker model.
If you haven't already, identify the list of apps that need to be migrated in your current Azure Subscription by using the Azure PowerShell.
Before you migrate an app to version 4.x of the Functions runtime, you should do the following tasks:
When you use Visual Studio to publish a version 4.x project to an existing function app at a lower version, you're prompted to let Visual Studio update the function app to version 4.x during deployment. This update uses the same process defined in Update without slots.
Upgrading instructions are language dependent. If you don't see your language, choose it from the selector at the top of the article.
Choose the tab that matches your target version of .NET and the desired process model (in-process or isolated worker process).
Tip
If you are moving to an LTS or STS version of .NET using the isolated worker model, the .NET Upgrade Assistant can be used to automatically make many of the changes mentioned in the following sections.
The following example is a .csproj
project file that uses .NET Core 3.1 on version 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>
Use one of the following procedures to update this XML file to run in Functions version 4.x:
These steps assume a local C# project, and if your app is instead using C# script (.csx
files), you should convert to the project model before continuing.
The following changes are required in the .csproj
XML project file:
Set the value of PropertyGroup
.TargetFramework
to net8.0
.
Set the value of PropertyGroup
.AzureFunctionsVersion
to v4
.
Add the following OutputType
element to the PropertyGroup
:
<OutputType>Exe</OutputType>
In the ItemGroup
.PackageReference
list, replace the package reference to Microsoft.NET.Sdk.Functions
with the following references:
<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" />
Make note of any references to other packages in the Microsoft.Azure.WebJobs.*
namespaces. You'll replace these packages in a later step.
Add the following new ItemGroup
:
<ItemGroup>
<Using Include="System.Threading.ExecutionContext" Alias="ExecutionContext"/>
</ItemGroup>
After you make these changes, your updated project should look like the following example:
<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>
Based on the model you are migrating to, you might need to update or change the packages your application references. When you adopt the target packages, you then need to update the namespace of using statements and some types you reference. You can see the effect of these namespace changes on using
statements in the HTTP trigger template examples later in this article.
If you haven't already, update your project to reference the latest stable versions of:
Depending on the triggers and bindings your app uses, your app might need to reference a different set of packages. The following table shows the replacements for some of the most commonly used extensions:
Scenario | Changes to package references |
---|---|
Timer trigger | Add Microsoft.Azure.Functions.Worker.Extensions.Timer |
Storage bindings | ReplaceMicrosoft.Azure.WebJobs.Extensions.Storage with Microsoft.Azure.Functions.Worker.Extensions.Storage.Blobs, Microsoft.Azure.Functions.Worker.Extensions.Storage.Queues, and Microsoft.Azure.Functions.Worker.Extensions.Tables |
Blob bindings | Replace references toMicrosoft.Azure.WebJobs.Extensions.Storage.Blobs with the latest version of Microsoft.Azure.Functions.Worker.Extensions.Storage.Blobs |
Queue bindings | Replace references toMicrosoft.Azure.WebJobs.Extensions.Storage.Queues with the latest version of Microsoft.Azure.Functions.Worker.Extensions.Storage.Queues |
Table bindings | Replace references toMicrosoft.Azure.WebJobs.Extensions.Tables with the latest version of Microsoft.Azure.Functions.Worker.Extensions.Tables |
Cosmos DB bindings | Replace references toMicrosoft.Azure.WebJobs.Extensions.CosmosDB and/or Microsoft.Azure.WebJobs.Extensions.DocumentDB with the latest version of Microsoft.Azure.Functions.Worker.Extensions.CosmosDB |
Service Bus bindings | Replace references toMicrosoft.Azure.WebJobs.Extensions.ServiceBus with the latest version of Microsoft.Azure.Functions.Worker.Extensions.ServiceBus |
Event Hubs bindings | Replace references toMicrosoft.Azure.WebJobs.Extensions.EventHubs with the latest version of Microsoft.Azure.Functions.Worker.Extensions.EventHubs |
Event Grid bindings | Replace references toMicrosoft.Azure.WebJobs.Extensions.EventGrid with the latest version of Microsoft.Azure.Functions.Worker.Extensions.EventGrid |
SignalR Service bindings | Replace references toMicrosoft.Azure.WebJobs.Extensions.SignalRService with the latest version of Microsoft.Azure.Functions.Worker.Extensions.SignalRService |
Durable Functions | Replace references toMicrosoft.Azure.WebJobs.Extensions.DurableTask with the latest version of Microsoft.Azure.Functions.Worker.Extensions.DurableTask |
Durable Functions (SQL storage provider) |
Replace references toMicrosoft.DurableTask.SqlServer.AzureFunctions with the latest version of Microsoft.Azure.Functions.Worker.Extensions.DurableTask.SqlServer |
Durable Functions (Netherite storage provider) |
Replace references toMicrosoft.Azure.DurableTask.Netherite.AzureFunctions with the latest version of Microsoft.Azure.Functions.Worker.Extensions.DurableTask.Netherite |
SendGrid bindings | Replace references toMicrosoft.Azure.WebJobs.Extensions.SendGrid with the latest version of Microsoft.Azure.Functions.Worker.Extensions.SendGrid |
Kafka bindings | Replace references toMicrosoft.Azure.WebJobs.Extensions.Kafka with the latest version of Microsoft.Azure.Functions.Worker.Extensions.Kafka |
RabbitMQ bindings | Replace references toMicrosoft.Azure.WebJobs.Extensions.RabbitMQ with the latest version of Microsoft.Azure.Functions.Worker.Extensions.RabbitMQ |
Dependency injection and startup config |
Remove references toMicrosoft.Azure.Functions.Extensions (The isolated worker model provides this functionality by default.) |
See Supported bindings for a complete list of extensions to consider, and consult each extension's documentation for full installation instructions for the isolated process model. Be sure to install the latest stable version of any packages you are targeting.
Tip
Any changes to extension versions during this process might require you to update your host.json
file as well. Be sure to read the documentation of each extension that you use.
For example, the Service Bus extension has breaking changes in the structure between versions 4.x and 5.x. For more information, see Azure Service Bus bindings for Azure Functions.
Your isolated worker model application should not reference any packages in the Microsoft.Azure.WebJobs.*
namespaces or Microsoft.Azure.Functions.Extensions
. If you have any remaining references to these, they should be removed.
Tip
Your app might also depend on Azure SDK types, either as part of your triggers and bindings or as a standalone dependency. You should take this opportunity to update these as well. The latest versions of the Functions extensions work with the latest versions of the Azure SDK for .NET, almost all of the packages for which are the form Azure.*
.
When migrating to run in an isolated worker process, you must add the following program.cs file to your project:
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();
This example includes ASP.NET Core integration to improve performance and provide a familiar programming model when your app uses HTTP triggers. If you do not intend to use HTTP triggers, you can replace the call to ConfigureFunctionsWebApplication
with a call to ConfigureFunctionsWorkerDefaults
. If you do so, you can remove the reference to Microsoft.Azure.Functions.Worker.Extensions.Http.AspNetCore
from your project file. However, for the best performance, even for functions with other trigger types, you should keep the FrameworkReference
to ASP.NET Core.
The Program.cs
file will replace any file that has the FunctionsStartup
attribute, which is typically a Startup.cs
file. In places where your FunctionsStartup
code would reference IFunctionsHostBuilder.Services
, you can instead add statements within the .ConfigureServices()
method of the HostBuilder
in your Program.cs
. To learn more about working with Program.cs
, see Start-up and configuration in the isolated worker model guide.
The default Program.cs
examples above include setup of Application Insights integration for the isolated worker model. In your Program.cs
, you must also configure any log filtering that should apply to logs coming from code in your project. In the isolated worker model, the host.json
file only controls events emitted by the Functions host runtime. If you don't configure filtering rules in Program.cs
, you may see differences in the log levels present for various categories in your telemetry.
Although you can register custom configuration sources as part of the HostBuilder
, note that these similarly apply only to code in your project. Trigger and binding configuration is also needed by the platform, and this should be provided through the application settings, Key Vault references, or App Configuration references features.
Once you have moved everything from any existing FunctionsStartup
to the Program.cs
file, you can delete the FunctionsStartup
attribute and the class it was applied to.
The local.settings.json file is only used when running locally. For information, see Local settings file.
When you migrate to version 4.x, make sure that your local.settings.json file has at least the following elements:
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "AzureWebJobsStorageConnectionStringValue",
"FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated"
}
}
Note
When migrating from running in-process to running in an isolated worker process, you need to change the FUNCTIONS_WORKER_RUNTIME
value to "dotnet-isolated".
No changes are required to your host.json
file. However, if your Application Insights configuration in this file from your in-process model project, you might want to make additional changes in your Program.cs
file. The host.json
file only controls logging from the Functions host runtime, and in the isolated worker model, some of these logs come from your application directly, giving you more control. See Managing log levels in the isolated worker model for details on how to filter these logs.
Some key classes changed names between versions. These changes are a result either of changes in .NET APIs or in differences between in-process and isolated worker process. The following table indicates key .NET classes used by Functions that could change when migrating:
.NET Core 3.1 | .NET 5 | .NET 8 |
---|---|---|
FunctionName (attribute) |
Function (attribute) |
Function (attribute) |
ILogger |
ILogger |
ILogger , ILogger<T> |
HttpRequest |
HttpRequestData |
HttpRequestData , HttpRequest (using ASP.NET Core integration) |
IActionResult |
HttpResponseData |
HttpResponseData , IActionResult (using ASP.NET Core integration) |
FunctionsStartup (attribute) |
Uses Program.cs instead |
Uses Program.cs instead |
There might also be class name differences in bindings. For more information, see the reference articles for the specific bindings.
This section highlights other code changes to consider as you work through the migration. These changes are not needed by all applications, but you should evaluate if any are relevant to your scenarios. Make sure to check Breaking changes between 3.x and 4.x for additional changes you might need to make to your project.
By default, the isolated worker model uses System.Text.Json
for JSON serialization. To customize serializer options or switch to JSON.NET (Newtonsoft.Json
), see these instructions.
Logs can be sent to Application Insights from both the Functions host runtime and code in your project. The host.json
allows you to configure rules for host logging, but to control logs coming from your code, you'll need to configure filtering rules as part of your Program.cs
. See Managing log levels in the isolated worker model for details on how to filter these logs.
The differences between in-process and isolated worker process can be seen in HTTP triggered functions. The HTTP trigger template for version 3.x (in-process) looks like the following example:
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);
}
}
}
The HTTP trigger template for the migrated version looks like the following example:
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"]}!");
}
}
}
To update your project to Azure Functions 4.x:
Update your local installation of Azure Functions Core Tools to version 4.x.
Update your app's Azure Functions extensions bundle to 2.x or above. For more information, see breaking changes.
If needed, move to one of the Java versions supported on version 4.x.
Update the app's POM.xml
file to modify the FUNCTIONS_EXTENSION_VERSION
setting to ~4
, as in the following example:
<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>
Azure Functions provides a pre-upgrade validator to help you identify potential issues when migrating your function app to 4.x. To run the pre-upgrade validator:
In the Azure portal, navigate to your function app.
Open the Diagnose and solve problems page.
In Function App Diagnostics, start typing Functions 4.x Pre-Upgrade Validator
and then choose it from the list.
After validation completes, review the recommendations and address any issues in your app. If you need to make changes to your app, make sure to validate the changes against version 4.x of the Functions runtime, either locally using Azure Functions Core Tools v4 or by using a staging slot.
You need to update the runtime of the function app host in Azure to version 4.x before you publish your migrated project. The runtime version used by the Functions host is controlled by the FUNCTIONS_EXTENSION_VERSION
application setting, but in some cases other settings must also be updated. Both code changes and changes to application settings require your function app to restart.
The easiest way is to update without slots and then republish your app project. You can also minimize the downtime in your app and simplify rollback by updating using slots.
The simplest way to update to v4.x is to set the FUNCTIONS_EXTENSION_VERSION
application setting to ~4
on your function app in Azure. You must follow a different procedure on a site with slots.
az functionapp config appsettings set --settings FUNCTIONS_EXTENSION_VERSION=~4 -g <RESOURCE_GROUP_NAME> -n <APP_NAME>
You must also set another setting, which differs between Windows and Linux.
You might also need to update the linuxFxVersion
site setting to target your specific language version. If you already have the correct value of linuxFxVersion
set, you can skip this step. For more information, see Valid linuxFxVersion
values.
PowerShell apps aren't supported on Linux before Functions 4.x. This fact means you shouldn't need to upgrade a PowerShell function app running on Linux.
az functionapp config set --name <APP_NAME> --resource-group <RESOURCE_GROUP_NAME> --linux-fx-version "DOTNET|6.0"
If you're migrating to .NET Functions isolated worker process, use either DOTNET-ISOLATED|6.0
or DOTNET-ISOLATED|7.0
for --linux-fx-version
.
az functionapp config set --name <APP_NAME> --resource-group <RESOURCE_GROUP_NAME> --linux-fx-version "Java|11"
The --linux-fx-version
value must match your target Java version.
az functionapp config set --name <APP_NAME> --resource-group <RESOURCE_GROUP_NAME> --linux-fx-version "Node|16"
The --linux-fx-version
value must match your target Node.js version.
az functionapp config set --name <APP_NAME> --resource-group <RESOURCE_GROUP_NAME> --linux-fx-version "Python|3.9"
The --linux-fx-version
value must match your target PowerShell version.
In this example, replace <APP_NAME>
with the name of your function app and <RESOURCE_GROUP_NAME>
with the name of the resource group.
You can now republish your app project that has been migrated to run on version 4.x.
Using deployment slots is a good way to update your function app to the v4.x runtime from a previous version. By using a staging slot, you can run your app on the new runtime version in the staging slot and switch to production after verification. Slots also provide a way to minimize downtime during the update. If you need to minimize downtime, follow the steps in Minimum downtime update.
After you've verified your app in the updated slot, you can swap the app and new version settings into production. This swap requires setting WEBSITE_OVERRIDE_STICKY_EXTENSION_VERSIONS=0
in the production slot. How you add this setting affects the amount of downtime required for the update.
If your slot-enabled function app can handle the downtime of a full restart, you can update the WEBSITE_OVERRIDE_STICKY_EXTENSION_VERSIONS
setting directly in the production slot. Because changing this setting directly in the production slot causes a restart that impacts availability, consider doing this change at a time of reduced traffic. You can then swap in the updated version from the staging slot.
The Update-AzFunctionAppSetting
PowerShell cmdlet doesn't currently support slots. You must use Azure CLI or the Azure portal.
Use the following command to set WEBSITE_OVERRIDE_STICKY_EXTENSION_VERSIONS=0
in the production slot:
az functionapp config appsettings set --settings WEBSITE_OVERRIDE_STICKY_EXTENSION_VERSIONS=0 -g <RESOURCE_GROUP_NAME> -n <APP_NAME>
In this example, replace <APP_NAME>
with the name of your function app and <RESOURCE_GROUP_NAME>
with the name of the resource group. This command causes the app running in the production slot to restart.
Use the following command to also set WEBSITE_OVERRIDE_STICKY_EXTENSION_VERSIONS
in the staging slot:
az functionapp config appsettings set --settings WEBSITE_OVERRIDE_STICKY_EXTENSION_VERSIONS=0 -g <RESOURCE_GROUP_NAME> -n <APP_NAME> --slot <SLOT_NAME>
Use the following command to change FUNCTIONS_EXTENSION_VERSION
and update the staging slot to the new runtime version:
az functionapp config appsettings set --settings FUNCTIONS_EXTENSION_VERSION=~4 -g <RESOURCE_GROUP_NAME> -n <APP_NAME> --slot <SLOT_NAME>
Version 4.x of the Functions runtime requires .NET 6 in Windows. On Linux, .NET apps must also update to .NET 6. Use the following command so that the runtime can run on .NET 6:
You might also need to update the linuxFxVersion
site setting to target your specific language version. If you already have the correct value of linuxFxVersion
set, you can skip this step. For more information, see Valid linuxFxVersion
values.
PowerShell apps aren't supported on Linux before Functions 4.x. This fact means you shouldn't need to upgrade a PowerShell function app running on Linux.
az functionapp config set --name <APP_NAME> --resource-group <RESOURCE_GROUP_NAME> --linux-fx-version "DOTNET|6.0"
If you're migrating to .NET Functions isolated worker process, use either DOTNET-ISOLATED|6.0
or DOTNET-ISOLATED|7.0
for --linux-fx-version
.
az functionapp config set --name <APP_NAME> --resource-group <RESOURCE_GROUP_NAME> --linux-fx-version "Java|11"
The --linux-fx-version
value must match your target Java version.
az functionapp config set --name <APP_NAME> --resource-group <RESOURCE_GROUP_NAME> --linux-fx-version "Node|16"
The --linux-fx-version
value must match your target Node.js version.
az functionapp config set --name <APP_NAME> --resource-group <RESOURCE_GROUP_NAME> --linux-fx-version "Python|3.9"
The --linux-fx-version
value must match your target PowerShell version.
In this example, replace <APP_NAME>
with the name of your function app and <RESOURCE_GROUP_NAME>
with the name of the resource group.
If your code project required any updates to run on version 4.x, deploy those updates to the staging slot now.
Confirm that your function app runs correctly in the updated staging environment before swapping.
Use the following command to swap the updated staging slot to production:
az functionapp deployment slot swap -g <RESOURCE_GROUP_NAME> -n <APP_NAME> --slot <SLOT_NAME> --target-slot production
To minimize the downtime in your production app, you can swap the WEBSITE_OVERRIDE_STICKY_EXTENSION_VERSIONS
setting from the staging slot into production. After that, you can swap in the updated version from a prewarmed staging slot.
Use the following command to set WEBSITE_OVERRIDE_STICKY_EXTENSION_VERSIONS=0
in the staging slot:
az functionapp config appsettings set --settings WEBSITE_OVERRIDE_STICKY_EXTENSION_VERSIONS=0 -g <RESOURCE_GROUP_NAME> -n <APP_NAME> --slot <SLOT_NAME>
Use the following commands to swap the slot with the new setting into production, and at the same time restore the version setting in the staging slot.
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>
You may see errors from the staging slot during the time between the swap and the runtime version being restored on staging. This error can happen because having WEBSITE_OVERRIDE_STICKY_EXTENSION_VERSIONS=0
only in staging during a swap removes the FUNCTIONS_EXTENSION_VERSION
setting in staging. Without the version setting, your slot is in a bad state. Updating the version in the staging slot right after the swap should put the slot back into a good state, and you call roll back your changes if needed. However, any rollback of the swap also requires you to directly remove WEBSITE_OVERRIDE_STICKY_EXTENSION_VERSIONS=0
from production before the swap back to prevent the same errors in production seen in staging. This change in the production setting would then cause a restart.
Use the following command to again set WEBSITE_OVERRIDE_STICKY_EXTENSION_VERSIONS=0
in the staging slot:
az functionapp config appsettings set --settings WEBSITE_OVERRIDE_STICKY_EXTENSION_VERSIONS=0 -g <RESOURCE_GROUP_NAME> -n <APP_NAME> --slot <SLOT_NAME>
At this point, both slots have WEBSITE_OVERRIDE_STICKY_EXTENSION_VERSIONS=0
set.
Use the following command to change FUNCTIONS_EXTENSION_VERSION
and update the staging slot to the new runtime version:
az functionapp config appsettings set --settings FUNCTIONS_EXTENSION_VERSION=~4 -g <RESOURCE_GROUP_NAME> -n <APP_NAME> --slot <SLOT_NAME>
Version 4.x of the Functions runtime requires .NET 6 in Windows. On Linux, .NET apps must also update to .NET 6. Use the following command so that the runtime can run on .NET 6:
You might also need to update the linuxFxVersion
site setting to target your specific language version. If you already have the correct value of linuxFxVersion
set, you can skip this step. For more information, see Valid linuxFxVersion
values.
PowerShell apps aren't supported on Linux before Functions 4.x. This fact means you shouldn't need to upgrade a PowerShell function app running on Linux.
az functionapp config set --name <APP_NAME> --resource-group <RESOURCE_GROUP_NAME> --linux-fx-version "DOTNET|6.0"
If you're migrating to .NET Functions isolated worker process, use either DOTNET-ISOLATED|6.0
or DOTNET-ISOLATED|7.0
for --linux-fx-version
.
az functionapp config set --name <APP_NAME> --resource-group <RESOURCE_GROUP_NAME> --linux-fx-version "Java|11"
The --linux-fx-version
value must match your target Java version.
az functionapp config set --name <APP_NAME> --resource-group <RESOURCE_GROUP_NAME> --linux-fx-version "Node|16"
The --linux-fx-version
value must match your target Node.js version.
az functionapp config set --name <APP_NAME> --resource-group <RESOURCE_GROUP_NAME> --linux-fx-version "Python|3.9"
The --linux-fx-version
value must match your target PowerShell version.
In this example, replace <APP_NAME>
with the name of your function app and <RESOURCE_GROUP_NAME>
with the name of the resource group.
If your code project required any updates to run on version 4.x, deploy those updates to the staging slot now.
Confirm that your function app runs correctly in the updated staging environment before swapping.
Use the following command to swap the updated and prewarmed staging slot to production:
az functionapp deployment slot swap -g <RESOURCE_GROUP_NAME> -n <APP_NAME> --slot <SLOT_NAME> --target-slot production
The following are key breaking changes to be aware of before upgrading a 3.x app to 4.x, including language-specific breaking changes. For a full list, see Azure Functions GitHub issues labeled Breaking Change: Approved.
If you don't see your programming language, go select it from the top of the page.
Azure Functions Proxies is a legacy feature for versions 1.x through 3.x of the Azure Functions runtime. Support for Functions Proxies can be re-enabled in version 4.x so that you can successfully update your function apps to the latest runtime version. As soon as possible, you should instead switch to integrating your function apps with Azure API Management. API Management lets you take advantage of a more complete set of features for defining, securing, managing, and monetizing your Functions-based APIs. For more information, see API Management integration. To learn how to re-enable Proxies support in Functions version 4.x, see Re-enable Proxies in Functions v4.x.
Logging to Azure Storage using AzureWebJobsDashboard is no longer supported in 4.x. You should instead use Application Insights. (#1923)
Azure Functions 4.x now enforces minimum version requirements for extensions. Update to the latest version of affected extensions. For non-.NET languages, update to extension bundle version 2.x or later. (#1987)
Default and maximum timeouts are now enforced in 4.x for function apps running on Linux in a Consumption plan. (#1915)
Azure Functions 4.x uses Azure.Identity
and Azure.Security.KeyVault.Secrets
for the Key Vault provider and has deprecated the use of Microsoft.Azure.KeyVault. For more information about how to configure function app settings, see the Key Vault option in Manage key storage. (#2048)
Function apps that share storage accounts now fail to start when their host IDs are the same. For more information, see Host ID considerations. (#2049)
Azure Functions 4.x supports newer versions of .NET. See Supported languages in Azure Functions for a full list of versions.
InvalidHostServicesException
is now a fatal error. (#2045)
EnableEnhancedScopes
is enabled by default. (#1954)
Remove HttpClient
as a registered service. (#1911)
Events
Mar 17, 9 PM - Mar 21, 10 AM
Join the meetup series to build scalable AI solutions based on real-world use cases with fellow developers and experts.
Register nowTraining
Learning path
Use advance techniques in canvas apps to perform custom updates and optimization - Training
Use advance techniques in canvas apps to perform custom updates and optimization
Certification
Microsoft Certified: Azure Developer Associate - Certifications
Build end-to-end solutions in Microsoft Azure to create Azure Functions, implement and manage web apps, develop solutions utilizing Azure storage, and more.
Documentation
Migrate apps from Azure Functions version 1.x to 4.x
This article shows you how to migrate your existing function apps running on version 1.x of the Azure Functions runtime to be able to run on version 4.x of the runtime.
How to target Azure Functions runtime versions
Learn how to specify the runtime version of a function app hosted in Azure.
Azure Functions runtime versions overview
Azure Functions supports multiple versions of the runtime. Learn the differences between them and how to choose the one that's right for you.