しばやん雑記

Azure Serverless とメイドさんが大好きなフリーランスのプログラマーのブログ

Azure Functions の Retry Policy 機能の GA に伴う仕様変更と Cosmos DB Trigger における対応方法

しばらく前から Azure Functions で Event Hub Trigger と Timer Trigger 以外で Retry Policy を設定している場合に、以下のような警告が起動時に出るようになりました。

[2022-11-19T08:19:24.241Z] Soon retries will not be supported for function 'Function'. For more information, please visit http://aka.ms/func-retry-policies.

エラーの内容は書いてある通りですが、将来的には Event Hub Trigger や Timer Trigger など拡張側で明示的に Retry Policy に対応しているもの以外では、正しく動作しなくなるという話です。

この辺りの話は警告にある URL や、Retry Policy の GA の時にひっそりと発表されていました。実際には Event Hub と Timer 以外に Kafka でも Retry Policy が利用可能となっています。

これまでの Retry Policy ではどんな Trigger であっても設定出来ましたが、それが許可制になったという感じです。Queue は組み込みで Retry と Dead Letter Queue が使えますし、Event Grid でもサービス側がリトライを持っていますので、Retry Policy で対応するのは望ましくないケースも確かに存在します。

ここで非常に問題になるのが Cosmos DB Trigger で、何故か Cosmos DB だけは Retry のサポートが n/a になっていて、Retry Policy のサポートが削除される寸前だったのですが、Cosmos DB チームの Matias によって v4 Extension でサポートが復活しました。

元々 Checkpoint control for Event Hubs / Cosmos DB という触れ込みだった割に、サポートが削除されそうになったのは非常に納得がいかないですし、Function チームがマジで何を考えているのか不明です。

Retry Policy の仕様変更については、まだリリースされていないので問題なく動作していますが、今後も Cosmos DB Trigger で継続して使うためには v4 Extension へのアップデートが必須になりました。

C# を利用している場合

具体的な対応としては Cosmos DB Extension v4 にアップデートするだけなので、C# の場合はとても簡単です。まだバージョンは v4.0.0-rc となっていますが、コードベースとしては GA 相当です。

以前に以下のエントリで v4 Extension については書いてあるので、詳細はこちらを参照してください。Change Feed の leases は互換性がある*1ので、コンパイルが通るように修正すれば問題なく動作します。

v3 Extension で使われている古い Document DB SDK はサポートが切れるので、さっさとアップデートしておいた方がパフォーマンスと信頼性の観点からもメリットがあります。

ただし現在は v4 Extension について Azure Functions の Scale Controller 側での対応が完了していないため、Consumption Plan や Premium Plan で Runtime Scale Monitoring がオフの場合には、意図したとおりに動作しないという制約があります。詳細は以下のコメントを参照してください。

Scale Controller 側の対応が完了すれば v4 Extension は正式リリース版となります。コード側の問題ではないため、App Service Plan や Runtime Scale Monitoring が有効な環境では利用しても問題ないという認識です。

C# 以外の言語を利用している場合

C# の場合は NuGet パッケージを最新にすれば解決していたのですが、Node.js や Python などの言語では Extension Bundle という仕組みが使われているので、対応方法が大きく異なっています。その Extension Bundle 自体も v4 Preview がリリースされていて Cosmos DB Extension v4 が含まれています。

利用方法は README に書いてある通りですが host.json にある extensionBundle を以下のように書き換えるだけで対応できます。正式版とは id が異なっている点に注意が必要です。

{
  "version": "2.0",
  "extensionBundle": {
    "id": "Microsoft.Azure.Functions.ExtensionBundle.Preview",
    "version": "[4.*, 5.0.0)"
  }
}

後は C# 版と同じように function.json 内のプロパティで CollectionContainer に直すぐらいで問題ないのですが、現在のバージョンでは起動時に dll が見つからないというエラーが出て失敗します。

既に GitHub で Issue が上がっているので対応されると思いますが、Cosmos DB SDK v3 が関係している問題でもあるので、対応完了までには少し時間がかかる可能性もあります。

現状では C# 以外の言語を利用している場合には、Azure Functions Runtime のバージョンを固定しておくことで Retry Policy が利用可能な状態を保持するのが最善かも知れません。

*1:ただし v4 から v3 へのダウングレードには未対応