しばやん雑記

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

Azure Functions v4 が正式リリースされたので既存の環境とアプリケーションをアップグレードする

Visual Studio 2022 のローンチイベントで .NET 6 の GA と同時に Azure Functions v4 の GA が発表されました。これまでは .NET のリリースから遅れて対応するバージョンの Azure Functions がリリースされていましたが、今回は Day 0 サポートがアピールポイントです。

.NET 5 は LTS ではなかったので In-Process 版のサポートではなく Out-of-Process でのサポートになりましたが、.NET 6 は LTS なので In-Process と Out-of-Process の両方がサポートされています。

これまで Azure Functions v3 を使って開発していた場合は、比較的スムーズに v4 へのアップグレードが行えます。Breaking changes をいくつか存在するので、そのあたりに注意すれば問題ないはずです。今回、開発環境を含め一通り Azure Functions v4 向けに更新したので、メモを兼ねて残します。

Visual Studio を使っている場合

最新の Visual Studio 2022 をインストール

Visual Studio 2022 のインストール時に Azure の開発ワークロードを選択すると、自動的に Azure Functions v4 の開発に必要なパッケージがインストールされます。

Azure Functions プロジェクトを作成すると .NET 6 と .NET 6 Isolated が選択できるようになっています。

f:id:shiba-yan:20211101233802p:plain

まだ .NET 6 に LTS 表示はついていないですが、今後 LTS の表示が追加されるのだと思います。

稀に表示されない場合がありますが、一旦は放置してプロジェクトを作り直すと出てくるようになります。バックグラウンドで Azure Functions Core Tools のインストールを行っているようなので、若干新バージョンがリリースされた時はラグが発生します。

Visual Studio Code を使っている場合

Azure Functions Core Tools のアップグレード

Windows 以外の環境では CLI や Visual Studio Code を使って Azure Functions の開発を行っていると思いますが、この場合は Core Tools が自動的に v4 に更新されないので、以下のドキュメントを参考に v4 をインストールする必要があります。

最近では Azure Functions Core Tools のバージョンマネージャーがリリースされたので、これを使うと簡単に Azure Functions v3 と v4 が共存する環境を用意できます。

最近だとプロジェクト単位でバージョンを指定出来るのと、インストールもメジャーバージョンを指定すれば最新が入るので結構便利です。npm を使ってインストールしていた環境では検討しても良いと思います。

.NET 6 SDK と最新の Azure Functions 拡張をインストール

Azure Functions Core Tools の実行には .NET 6 SDK は必要ないですが、C# の Function App を使う際には必要となるのでインストールしておきましょう。同時に Azure Functions の Visual Studio Code 拡張も最新バージョンが入っているか確認します。

古いバージョンの拡張では .NET 6 対応されていないので注意が必要です。

.NET 6 SDK と v4 系の Azure Functions Core Tools が入っている環境では、Visual Studio Code を使った Azure Function プロジェクトの新規作成時に .NET 6 の選択肢が表示されるようになります。

f:id:shiba-yan:20211101233830p:plain

これは funcvm を使っていても正しく反映されるので、v3 系に切り替えてから新規作成すると .NET Core 3.1 の選択肢が出てきます。基本は v4 に移行するのが良いのですが、移行中には両方使いたいことがあると思うので便利に使えます。

Dev Container 向けの Core Tools イメージはまだ v4 向けが提供されていないので利用できません。Dockerfile やビルドパイプラインは用意されているので、近日中にリリースはされると思いますが注意しましょう。

Azure Functions v4 へのアップグレード

環境の準備ができた後に、既存の Azure Function プロジェクトを Azure Functions v4 対応にアップグレードしていくわけですが、マイグレーションのドキュメントが用意されているので Breaking changes を主に確認しておくことをお勧めします。

こまめに Extension のバージョンを上げていれば、ほぼ csproj の修正ぐらいで終わる内容です。v4 は .NET 6 対応とレガシー機能の削除が行われているぐらいで、内部的に大きな違いはないので当たり前ではあります。

実際の手順としては大体以下のようになります。ドキュメントには書かれていないですが .NET 5 の時に大勢を悩ませた Microsoft.* パッケージのバージョンミスマッチ問題も一気に解消できるので、一緒に対応しておくのがお勧めです。ようやく EF Core 5.0 から追加された機能が安心して利用できます。

上のリストには書いていないですが Azure Functions Proxies は v4 では完全に削除されていて利用できなくなっています。ドキュメントには API Management に移行しろとありますが、全くユースケースを理解しているとは思えない提案で、コスト的にも圧倒的不利なケースが多いので代替ソリューションを用意しました。

別エントリで Azure Functions Proxies の移行については紹介する予定です。

Azure Functions v4 対応の Function App を作成・更新

Azure Functions v4 に対応した Function App の新規作成は Azure Portal では .NET 6 を選べば済みますが、既存の Function App の場合は Runtime version を 4 もしくは FUNCTIONS_EXTENSION_VERSION~4 に変更しつつ、同時に .NET 6 を有効化する必要があります。

f:id:shiba-yan:20211110143536p:plain

既存のインスタンスを .NET 6 対応にするには ARM Explorer などを使って netFrameworkVersionv6.0 に変更するだけで完了します。App Service にプリインストールされるまでは JIT インストールになるので、インスタンスの新規起動時には多少のオーバーヘッドが発生しますが、無視できる程度でしょう。

暫くすると自動的に JIT インストールからプリインストールに変更され、オーバーヘッドは消滅します。

Terraform でも ARM Explorer を使う場合と同じように dotnet_framework_versionv6.0 に変更すれば良いです。AzureRM Provider のバージョンにだけ注意が必要です。

ちなみに Visual Studio からデプロイする際は自動的に設定変更してくれるので、開発中やテスト目的で使っている Function App の場合は Visual Studio に従えばいい感じに設定してくれます。