あけましておめでとうございます。
今日は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を使っているからです。
https://github.com/Azure/azure-functions-vs-build-sdk#q-why-is-newtonsoftjson-locked-in-the-first-place
具体的には、Azure Functionsは引数をランタイムから受け取るので、
ランタイムで作成されたNewtonsoft.Jsonのオブジェクトを受け取る際に、
Functionsの中で使用されているNewtonsoft.Jsonのバージョンが異なると、ミスマッチが起こる、
と理解しています。
このあたり汎用性を持たせるのはかなり難しそうなので、バージョンが固定されているのも納得できました。
なので、下記のコメントにある通り、
https://github.com/Azure/azure-functions-vs-build-sdk/issues/107#issuecomment-340932898
引数の受け取りに、Newtonsoft.Jsonのオブジェクトを使わなければ問題はずです。
私はこのようにすることで、今のところ問題が起きていません。
違うバージョンのNewtonsoft.Jsonを使うためには、リンク先にあるように、
<PackageReference Include="Newtonsoft.Json" Version="11.0.2" /
などと記載すれば警告は残りますが、Nugetがロールバックしなくなるので使えます。
3. Event Grid Triggerを合わせて使用する
Event Grid TriggerをV1で使おうとすると、下記にある通り、
https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-bindings-event-grid#usage
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の認証コードを書く必要があり、
https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-bindings-event-grid#event-grid-schema
こちらのほうが不要なコードが増える感じがします。
認証にしか使われないコードがあるのはロジックに集中できるというFunctionsの強みに反しているような気もします。
なので、妥協して私はJSONの配列にするほうを選びました。
4.Durable Functionsと合わせて使う
V1ではV2と違ってDurable Functionsのテンプレートが存在しませんが、
牛尾さんの記事にあるように、V2と同じコードが動きます。
Functionsの記法に慣れればこのへんはすぐわかるようになると思いますが、
初めに使うときはテンプレートを参照したほうが分かると思います。
5. まとめ
サーバレスは使いどころを考えて使っていくべきアーキテクチャだと思っていますが、
実務で使おうとすると、このように痒い所に手が届かないところや、めんどくさい部分が出てきてしまうんだなと思いました。
これからV1の開発が進んでいくことになるのか、それとも世間が皆.net Coreに対応していく世の中になるのかわかりませんが、
これからも自分なりに動向を追えればな、と思います。
ずさずさ
最新記事 by ずさずさ (全て見る)
- Azure Functions V1を使う - 2019年1月6日
- EventGridの使用を始めるときにつまずいたところ - 2018年12月2日
- サーバレス周りの話 - 2018年9月17日