しばやん雑記

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

Azure Functions v2 が GA しました

Ignite 2018 で大方の予想通り Azure Functions v2 ランタイムが GA しましたね。

実際には先週に GA 版と思われるランタイムがデプロイされていたので、App Settings の設定を間違えていなければ既に GA 版ランタイムで動いているでしょう。

v2 では .NET Core 2.1 ベースになったり、拡張モデルが新しくなってパフォーマンスも改善したりと、色々とメリットが多いですね。99.95% の SLA も提供されています。

そして既存の Functions v1 アプリを v2 にアップグレードすることが推奨されています。新しく作る場合には v2 ベースで作る以外の選択肢はまあ無いでしょう。

We strongly encourage to start any new development on 2.0 and recommend that customers upgrade their existing 1.0 apps to the 2.0 version, to experience all the benefits of this new release.

まだ使われてないですが、.NET Core 2.2 がリリースされたら Tiered Compilation での Cold Start のパフォーマンス改善とかも期待できますしね。

GA に絡めて v2 周りの情報を軽くメモしておきます。

v2 の NuGet パッケージを更新

Functions v2 の GA に伴って、いろんなパッケージが正式版にアップデートされています。特に拡張周り。

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

なので既存の Functions v2 向けのアプリの場合は、各パッケージを最新に更新しておけば良いです。

v1 から v2 へのアップグレード

アップグレードが推奨されていますが .NET Framework から .NET Core で ConfigurationManager が無かったりするので、設定を読んでる場合とか少し面倒です。

ドキュメントが用意されてますが、割と気合で頑張るという感じがします。

難しいことしていなければ、csproj を弄って再ビルドするぐらいで問題なさそうですが、.NET Standard 2.0 非対応のライブラリを使っていたりすると更に手間がかかるでしょう。

C# は ANCM v2 In-Process で動く

ASP.NET Core 2.2 とリリース予定の ASP.NET Core Module v2 (ANCM v2) が、Functions v2 では先行してデフォルトで使われています。

w3wp を Kudu で見ると、モジュールが読み込まれていることが確認できます。

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

スタートアップ時のオーバーヘッドが減るので立ち上がりの高速化が期待できます。エラーハンドリング周りでも有利という話は前から出ていますが、あまり実感としてはないですね。

あくまでも .NET Standard 2.0

Functions v2 のランタイムは .NET Core 2.1 で動いていますが、開発する Functions App は .NET Standard 2.0 になるので、.NET Core 2.0 や 2.1 で新しく追加されたクラスは使えないです。

一応、中の人も認識はしているようで TFM を netcoreapp2.0 に変えることは出来ます。

これで .NET Core 2.0 の機能は使えるようになりますが、ローカルでのデバッグが出来なくなる問題があります。この辺りの優先度は高くないみたいなので、使う時は覚悟が必要となります。

Run From Package を使う

以前は Run-From-Zip と呼ばれていた機能ですが、GA の少し前に Run From Package に名前が変わりました。同時に App Settings のキー名も変わっています。

Azure Functions のストレージの遅さを補いつつ、一貫性のあるデプロイを提供してくれる機能です。

最新の Visual Studio 2017 を使っている場合はチェックボックス一つで有効化出来るので、あえて使わない理由はないです。CI からのデプロイも Zip Deploy で簡単になっています。

特に Functions v2 では MSDeploy を使っていると dll がロックされてしまうことが多いですが、Run From Package を使うと一気に解決します。

理由が無ければ 32bit で動かす

Functions v2 は 32bit と 64bit の両方に対応していますが、そもそもが Consumption Plan では公式には S1 が使われるとなってますし、64bit にしてもメリットはほぼ得られないでしょう。

ちなみに App Service には .NET Core の 64bit 版ランタイムが入っていないので、Self-contained deployment になっています。.NET Core のバージョンが 32bit と 64bit でずれる可能性がありそうです。