Azure Functions v2.0 の Breaking Change 対応

今日 Azure Functions V2 を起動すると次のエラーが出てFunctions が認識されなくなった。

![Capture.JPG](https://qiita-image-store.s3.amazonaws.com/0/3470/27c89d37-b90f-1e54-ceac-c70436a73750.jpeg)

エラーの詳細は次の感じ

```
[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 が発表されていたので、その実施内容を書いておきたい。

* [Azure Functions Runtime 2.0.12050-alpha breaking changes notice #129](https://github.com/Azure/app-service-announcements/issues/129)

しばらく不安定かもしれないのでこの 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

１つの 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 を変えたらいいかは英語ですがブログにしておきました。

* [Azure Functions v2 Breaking Change for custom bindings](https://medium.com/@tsuyoshiushio/azure-functions-v2-custom-bindings-for-breaking-change-3fae9984e9c1)

## 他に必要となる可能性のある手順

### Durable Functions 

* [Durable Functions v1.6.0 Release](https://github.com/Azure/azure-functions-durable-extension/releases/tag/v1.6.0)

#### Host.json の書き方の変更

```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 などはこちらを入れる必要あり。

### わかりにくいエラーメッセージ

アップグレード時のエラーに関してはこちらを見ろとのこと

* [Common errors when upgrading to 2.0.12050 (or newer) #3363](https://github.com/Azure/azure-functions-host/issues/3363)

### バージョンアップしたくないケース

ランタイムを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 の開発を。