Azure Functions V1を使う

あけましておめでとうございます。

今日はAzure Functions V1を使う上でのTipsを書きます。

1. Azure Functionsのバージョン

Azure Functionsには今V1とV2の2つのバージョンが存在します。

V1は.net Frameworkに対応して作成されており、

V2は.net Coreに対応しています。

これから開発が進んでいくのはV2ですので、特に理由がなければV2を選ぶべきですが、

他に使いたいライブラリが.net frameworkにしか対応していない、などの理由で、

V1を使わざるを得ないときもあると思います。

そのようなときに困ったこととその対処法を以下で書いていきます。

2. Newtonsoft.Jsonのバージョンの対処法

Microsoft.NET.Sdk.Functionsの説明を読むとわかりますが、

Newtonsoft.Jsonのバージョンが

V1は9.0.1固定で、

V2は11.0.2固定です。

つまり、他の使いたいライブラリが他のバージョンのNewtonsoft.Jsonに依存していると、

困るという事態になります。

この理由はAzure上のランタイムがそのバージョンのNewtonsoft.Jsonを使っているからです。

Azure/azure-functions-vs-build-sdk
MSBuild task for Azure Functions. Contribute to Azure/azure-functions-vs-build-sdk development by creating an account on GitHub.

具体的には、Azure Functionsは引数をランタイムから受け取るので、

ランタイムで作成されたNewtonsoft.Jsonのオブジェクトを受け取る際に、

Functionsの中で使用されているNewtonsoft.Jsonのバージョンが異なると、ミスマッチが起こる、

と理解しています。

このあたり汎用性を持たせるのはかなり難しそうなので、バージョンが固定されているのも納得できました。

なので、下記のコメントにある通り、

Dependency on specific Newtonsoft.Json package version = 9.0.1 · Issue #107 · Azure/azure-functions-vs-build-sdk
The latest version 1.0.2 of Microsoft.NET.Sdk.Functions has a specific Newtonsoft.Json package dependency = 9.0.1. The alpha releases supported Newtonsoft.Json ...

引数の受け取りに、Newtonsoft.Jsonのオブジェクトを使わなければ問題はずです。

私はこのようにすることで、今のところ問題が起きていません。

違うバージョンのNewtonsoft.Jsonを使うためには、リンク先にあるように、

<PackageReference Include="Newtonsoft.Json" Version="11.0.2" /

などと記載すれば警告は残りますが、Nugetがロールバックしなくなるので使えます。

3. Event Grid Triggerを合わせて使用する

Event Grid TriggerをV1で使おうとすると、下記にある通り、

Azure Functions の Event Grid トリガー
Azure Functions で Event Grid イベントを処理する方法を説明します。

JObjectかStringでしか受け取れません。

しかもJObjectは2.で述べたような制限があると使用できません。

EventGridEventクラスで受け取ろうとすると、

Microsoft.Azure.WebJobs.Extensions.EventGrid.EventGridEvent

クラスになりますが、こちらはもう非推奨のクラスです。

一方で、V2だと新しいかつ扱いやすいクラスの

Microsoft.Azure.EventGrid.Models.EventGridEvent

で受け取れますので、受け取ったまま便利に扱えますが、V1だとこれは叶いません。

なので、V1でNewtonsoft.Jsonの制限がありつつ、

EventGridEventを便利に扱うためには、

Stringで受信して、それをEventGridEventにする必要があります。

ここでもう一点面倒なことに、V1のStringでEventGridEventを受信すると、

配列のJSONで来ません。

単体のJSONで来ます。

StringをEventGridEventにするためには、

EventGridSubscriberクラスのDeserializeEventGridEventsメソッドを使用するのが便利ですが、

これは配列のJSON形式を前提としているメソッドです。

つまり、JSONを中身が一つしか入っていないJSONの配列に変換する必要があります。

[]をつければ配列になるので、処理は簡単ですが、あんまり綺麗な感じはしません。

別の手としてはHTTP Triggerにして、EventGridEventに変換する手があります。

HTTP Triggerだと配列で来た気がします(違ったらすみません)。

しかし、こちらでは、Event GridのHTTP Triggerの認証コードを書く必要があり、

Azure Functions の Event Grid トリガー
Azure Functions で Event Grid イベントを処理する方法を説明します。

こちらのほうが不要なコードが増える感じがします。

認証にしか使われないコードがあるのはロジックに集中できるというFunctionsの強みに反しているような気もします。

なので、妥協して私はJSONの配列にするほうを選びました。

4.Durable Functionsと合わせて使う

V1ではV2と違ってDurable Functionsのテンプレートが存在しませんが、

牛尾さんの記事にあるように、V2と同じコードが動きます。

Functionsの記法に慣れればこのへんはすぐわかるようになると思いますが、

初めに使うときはテンプレートを参照したほうが分かると思います。

5. まとめ

サーバレスは使いどころを考えて使っていくべきアーキテクチャだと思っていますが、

実務で使おうとすると、このように痒い所に手が届かないところや、めんどくさい部分が出てきてしまうんだなと思いました。

これからV1の開発が進んでいくことになるのか、それとも世間が皆.net Coreに対応していく世の中になるのかわかりませんが、

これからも自分なりに動向を追えればな、と思います。

The following two tabs change content below.

ずさずさ

機械工学を学んでねずみの研究をしていましたが、 紆余曲折あってメーカに就職。 機械学習をやろうと思いきや、 サーババックエンド側の担当になりました。 好きなのは認知科学です。 これからの時代、ネット上に個人の興味をアピールすべきと思っていたところ、木村君に拾われました。

最新記事 by ずさずさ (全て見る)

コメント