しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

Azure Functions が .NET 9 に対応したのでアップグレードする

先週開催された .NET Conf 2024 で .NET 9 が正式リリースされましたが、同じタイミングで App Service と Azure Functions についても .NET 9 GA 版への対応が行われたため、現時点では Flex Consumption 以外で利用可能になっています。

Azure Functions チームの中の人は Linux Consumption はロールアウト中とツイートしていましたが、今日確認すると Linux Consumption でも問題なく .NET 9 な Azure Functions をデプロイ出来ました。

Flex Consumption が .NET 9 に対応していないのは非常に残念ですが、恐らく今週開催される Ignite 2024 で Flex Consumption 自体の GA が発表される可能性が高いため、そのタイミングで何らかの動きがあるのではないかと見ています。今晩以降は要チェックですね。

.NET 9 サポートについては以下の Issue で随時進捗が共有されているので、アップデート方法含めてこちらを見ておくと間違いありません。Visual Studio と VS Code でのサポートについても書かれています。

VS Code の場合は Azure Functions 拡張によってテンプレートが自動的に更新されるようですが、Visual Studio の場合はオプションにある以下の画面からアップデートを行う必要があります。Azure Functions プロジェクトを作成するタイミングなどで自動更新される可能性がありますが、意外に古い状態のままになっているケースが多いので手動で行うと安心です。

Azure Functions の .NET 9 サポートは最新のテンプレートに更新されていれば、作成時に .NET 9 Isolated を選ぶと最新のパッケージを含む形で自動生成されるので楽ですが、既存の .NET 8 Isolated からのアップデートを行う際には SDK 含むコアパッケージを 2.0.0 に上げる必要があります。

コアパッケージ v2 については公式ドキュメントで紹介されているので、この辺りを参照すればアップデート方法は分かるはずです。大きな改善として初期化で ASP.NET Core で使われている Builder Pattern が導入されています。実質 .NET Aspire 対応という感じですが、扱いやすくなっています。

これまでの HostBuilder を使った方法と、コアパッケージ v2 で導入された FunctionsApplication を使った方法を載せておきますので、違いを見比べてみてください。最近の ASP.NET Core を使ったことのある人なら馴染み深いインターフェースになっているはずです。

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();
using Microsoft.Azure.Functions.Worker.Builder;
using Microsoft.Extensions.Hosting;

var builder = FunctionsApplication.CreateBuilder(args);

builder.ConfigureFunctionsWebApplication();

// Application Insights isn't enabled by default. See https://aka.ms/AAt8mw4.
// builder.Services
//     .AddApplicationInsightsTelemetryWorkerService()
//     .ConfigureFunctionsApplicationInsights();

builder.Build().Run();

今回の変更には ASP.NET Core 周りを開発しているチームが協力しているようなので、今後も .NET Isolated については .NET チームがガンガン関与して良いものにして欲しい気持ちでいっぱいです。

ASP.NET Core と同じ Builder Pattern が導入されているので、Configuration や Logging 周りの設定は ASP.NET Core のドキュメントで紹介されている方法と同じものが利用できます。これまでのようにメソッドにラムダ式を渡して、そこで初期化する必要がなくなったので劇的に使い勝手が良くなっています。

アプリケーション側の .NET 9 対応が終われば、後は Azure 側で .NET 9 対応を行うだけです。前述したように既に Flex Consumption 以外は .NET 9 Isolated に対応しているため、Azure Portal で .NET バージョンを変更するだけで完了します。

.NET 8 Isolated から .NET 9 Isolated にアップデートする際には、まず Azure 側を .NET 9 Isolated に変更して、その後に .NET 9 にアップグレードしたアプリケーションをデプロイするとスムーズにいくはずです。

現在 .NET 6/8 の In-Process を利用している場合には .NET 9 にアップグレードすることは出来ないため、先に .NET Isolated への移行を行ってから .NET 9 にアップグレードするといった手順を踏みます。.NET Isolated への移行はドキュメントが用意されているので、こちらを読みながら進める形になります。

完全に対応しているわけではありませんが、Visual Studio に .NET Upgrade Assistant 拡張をインストールすると、右クリックメニューから .NET 9 Isolated への移行をある程度まで自動で行うことが出来るので、組み合わせて移行するのが最適解だと考えています。

何回か .NET Upgrade Assistant を使って .NET Isolated への移行を試してみましたが、Function の実装については 8 割ぐらいは自動的に移行していくれるという印象です。但し新しく追加された FunctionsApplication を使うようには書き換えてくれなかったので、その部分は手動での対応が必要でした。