Azure Functions の CosmosDB バインドでConnection Policy系のオプションが設定可能に

Azure Functions の CosmosDBバインドでは、これまでコネクション系のオプションを変更できませんでしたが、 azure-functions-hostv1.0.11913 でようやくバインディングのオプションとして設定できるようになったのでざっと説明しておきます。

CosmosDBのSQL APIを.NETで使う場合、 パフォーマンスチューニングのベストプラクティス がいくつかあり、特に以下の二つはネットワーク系の設定としてほぼ必須と言っても良い項目でした。

  • コネクションモード: Direct を選択する(デフォルトは Gateway
  • プロトコル: Tcp を選択する(デフォルトは Https )

上記二つを設定することのメリットは .NET での Azure Cosmos DB のパフォーマンスに関するヒント | Microsoft Docs あたりを読んで下さい。

Function App での設定

これらのオプションを変更したい場合は host.json で設定します。host.json でCosmosDB関連のオプション設定が出来てきたのは今回がはじめてです。そのためか、このエントリー執筆時点ではまだ公式ドキュメント Azure Functions の host.json のリファレンス | Microsoft Docs に設定方法が記載されていませんが、対応するランタイムがリリースされているので普通に使えるはずです。

設定方法は以下の通りで、V1とV2で若干異なるので両方掲載しておきます。

host.json(V1)

{
"documentDB": {
"connectionMode": "Direct",
"protocol": "Tcp"
}
}

host.json(V2)

{
"cosmosDB": {
"connectionMode": "Direct",
"protocol": "Tcp"
}
}

Azure FunctionsからCosmosDBへの接続はAzureネットワーク内で完結するので、Gatewayモードを利用しなければならない場面はほとんどないはずです。デフォルトを DirectTcp にしても良いくらいだと思いますが、一応明示的な設定は必要なので毎回設定することをオススメします。

ただ、ローカル環境でAzure Functions Core Tools等でデバッグする場合は、ローカルからCosmosDBへのネットワークでTcpモードでの接続ができるかどうか(ポート: 10000 ~ 20000 を開けておく)を確認した上で実施して下さい。

ちなみにこの機能は、HackFestを実施中に @sandayuu さんに必要性を訴え、CosmosDBチームの @Ealsur さんがすばやくリリース対応してくれたものです。私は直接のコントリビュータではないですが、実現の前倒しには少し貢献できたかなと思っています。