今日 Azure Functions V2 を起動すると次のエラーが出てFunctions が認識されなくなった。
エラーの詳細は次の感じ
[04/09/2018 00:12:14] Error indexing method 'StrikesRepository.CreatePackage'
[04/09/2018 00:12:14] Microsoft.Azure.WebJobs.Host: Error indexing method 'StrikesRepository.CreatePackage'. Microsoft.Azure.WebJobs.Host: Cannot bind parameter 'packages' to type IAsyncCollector`1. Make sure the parameter Type is supported by the binding. If you're using binding extensions (e.g. ServiceBus, Timers, etc.) make sure you've called the registration method for the extension(s) in your startup code (e.g. config.UseServiceBus(), config.UseTimers(), etc.).
[04/09/2018 00:12:14] Function 'StrikesRepository.CreatePackage' failed indexing and will be disabled.
VSのコンソールでバージョンを確認するとBreaking Change 対象のバージョンにバージョンアップしてた。
Azure Functions Core Tools (2.0.1-beta.36)
Function Runtime Version: 2.0.12050.0
予想通りだけど、先日 Breaking Change が発表されていたので、その実施内容を書いておきたい。
しばらく不安定かもしれないのでこの Issue を Subscribe しておくとよさげ。
Breaking Change の内容
Storage が Extensions 化した
今回の Breaking Change の内容は、もともと、Azure Functions のランタイムに含まれていた Storage のコードが、Extensions として外だしされることになった。メリットとしては、自分でExtensionsのバージョンを変えることができるので、Extensions で使われているSDKのバージョンを選択できる。これはいい感じだ。
コンフィグが変わった
host.json に `"version": "2.0" が必要になった。
Function App のシークレットのストレージの変更
下はファイルシステムにストアされていたのを、Blobにストアするように変更。これは自動でマイグレートしてくれる様子。
ただ、自分で、直接ファイルアクセスとか、SCM APIで、シークレットを管理していると動かなくなる様子。
Single language functions in a Function App
1つの Function App で複数の言語を動かすことができなくなった。(理由の明記はなし)
対処のステップ
自分で実践したステップを書いておく
host.json の変更
{ "version": "2.0" }
AppSettings / local.settings.json
下記の追加だが、すでに追加されていた。
"FUNCTIONS_WORKER_RUNTIME": "dotnet",
ローカル開発
Breaking Change に対応したNuget package に変更していく。少なくとも下記のもののバージョン以上に
しないと多分動かない。
NuGet | Package Version |
---|---|
Microsoft.NET.Sdk.Functions | 1.0.19 |
Microsoft.Azure.WebJobs.Extensions.CosmosDB | 3.0.1-beta1 |
Microsoft.Azure.WebJobs.Extensions.DurableTask | 1.6.0 |
Microsoft.Azure.WebJobs.Extensions.MicrosoftGraph | 1.0.0-beta4 |
Microsoft.Azure.WebJobs.ServiceBus | 3.0.0-beta8 |
Microsoft.Azure.WebJobs.Extensions.EventHubs | 3.0.0-beta8 |
Microsoft.Azure.WebJobs.Extensions.SendGrid | 3.0.0-beta8 |
Microsoft.Azure.WebJobs.Extensions.EventGrid | 2.0.0-beta4 |
Microsoft.Azure.WebJobs.Extensions.Storage | 3.0.0-beta8 |
Microsoft.Azure.WebJobs.Extensions.Twilio | 3.0.0-beta8 |
Microsoft.Azure.WebJobs.Script.ExtensionsMetadataGenerator | 1.0.0 |
実施した手順
-
Microsoft.NET.Sdk.Functions
を1.0.19
にする。Storage や、Http等も Extensionとして自動で入る様子。 -
Microsoft.Azure.WebJobs.Extensions.CosmosDB
をv3.0.0-beta7
から、v3.0.1-beta2
へ - 関連ライブラリのバージョンを上記に合わせる
ここまでで、今まで作っていた、Azure Functions + CosmosDB Bindings の部分は動作したところが、自前で書いていた DIBinding
が動作しなくなった。これは、このBreaking Change のためである。内部のライブラリも変わっている様子。
どのように、Custom Bindings を変えたらいいかは英語ですがブログにしておきました。
他に必要となる可能性のある手順
Durable Functions
Host.json の書き方の変更
{
"version":"2.0",
"extensions": {
"durableTask": {
"hubName": "MyTaskHubV2",
"azureStorageConnectionStringName": "storagewestus12345"
}
}
}
REST API のURLの変更
旧
GET /runtime/webhooks/DurableTaskExtension/instances/{instanceId}?code=XYZ
新
GET /runtime/webhooks/durabletask/instances/{instanceId}?code=XYZ
Storage Extension
新しくできたので、Queue Trigger などはこちらを入れる必要あり。
わかりにくいエラーメッセージ
アップグレード時のエラーに関してはこちらを見ろとのこと
バージョンアップしたくないケース
ランタイムをApp Settings で FUNCTIONS_EXTENSION_VERSION
to 2.0.11961-alpha
に固定する。ちなみに、私はラやないので試してないが、一番最初の Issue のページには Visual Studio のCore tools のバージョンを固定する方法も書かれていますので、必要な人はご参照ください。
まとめ
Custom Bindings のところは多少苦労しましたが、そうでなければ基本的に設定の変更と、host.json の変更だけで事住みました。VS のAzure Functions Core Tools は知らない間にアップデートされていた様子です。よい Azure Functions の開発を。