しばらく前から 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
内のプロパティで Collection
を Container
に直すぐらいで問題ないのですが、現在のバージョンでは起動時に dll が見つからないというエラーが出て失敗します。
既に GitHub で Issue が上がっているので対応されると思いますが、Cosmos DB SDK v3 が関係している問題でもあるので、対応完了までには少し時間がかかる可能性もあります。
現状では C# 以外の言語を利用している場合には、Azure Functions Runtime のバージョンを固定しておくことで Retry Policy が利用可能な状態を保持するのが最善かも知れません。
*1:ただし v4 から v3 へのダウングレードには未対応