Azure FunctionsのCosmos DBトリガーがAllVersionsAndDeletesに対応へ:変更点と確認ポイント

Azure FunctionsでAzure Cosmos DBの変更フィードを使っている場合、今回の「Azure Functions documentation update: feat(cosmos): support AllChangesAndDelete changefeed mode」は、削除イベントや中間更新をFunctions側で扱いやすくする重要な更新です。結論から言うと、.NET isolated worker向けのCosmos DB拡張機能にChangeFeedMode設定が追加され、従来の最新バージョンだけを処理する方式に加えて、AllVersionsAndDeletes、つまり「すべてのバージョンと削除」モードを指定できるようになります。既存のCosmos DBトリガーは既定でLatestVersionのまま動くため、明示的に設定を変えない限り挙動は大きく変わりません。ただし、本番利用前にはパッケージバージョン、Cosmos DBアカウントの継続的バックアップ、受け取り型、リース設定、削除イベント処理の冪等性を必ず確認する必要があります。(GitHub)

目次

Azure Functions documentation update: feat(cosmos): support AllChangesAndDelete changefeed modeで変わること

今回の更新は、Azure Functionsの.NET isolated worker向けCosmos DB拡張機能に、Cosmos DB変更フィードの読み取りモードを指定する仕組みを追加するものです。GitHub上のPR #3420では、Microsoft.Azure.Functions.Worker.Extensions.CosmosDBのバージョンを4.16.0へ上げ、基盤となるMicrosoft.Azure.WebJobs.Extensions.CosmosDB依存関係も4.16.0へ更新する変更が入っています。あわせて、CosmosDBChangeFeedMode enumとCosmosDBTriggerAttribute.ChangeFeedModeプロパティが追加されています。(GitHub)

注意したいのは、PRタイトルではAllChangesAndDeleteという表記が使われていますが、コードとリリースノート上の正式な指定値はAllVersionsAndDeletesです。記事内では、Azure Cosmos DBの機能名に合わせてAllVersionsAndDeletesを中心に説明します。PRのrelease notesにも「support AllVersionsAndDeletes changefeed mode」と記載されています。(GitHub)

項目変更前変更後
Cosmos DBトリガーの変更フィードモード基本的に最新バージョンモードChangeFeedModeでモード指定が可能
既定値最新バージョンのみLatestVersionのまま
削除イベントの取得通常は取得できないAllVersionsAndDeletes指定時に取得対象になる
中間更新の取得短時間に複数回更新されると途中状態を取り逃がす可能性がある保持期間内であれば中間変更も処理対象になる
影響を受ける主な開発者Cosmos DB Triggerを使う.NET isolated worker開発者削除・中間更新をFunctionsで処理したい開発者

そもそもAllVersionsAndDeletesとは何か

Azure Cosmos DBの変更フィードには、大きく分けてLatestVersionモードとAllVersionsAndDeletesモードがあります。LatestVersionは、項目の作成や更新の最新状態を扱うモードです。削除は変更フィードに現れず、同じ項目に短時間で複数回更新が入った場合、途中の更新をすべて処理できるとは限りません。(Microsoft Learn)

一方、AllVersionsAndDeletesは、作成、更新、削除をより細かく追跡するためのモードです。削除イベントやTTL期限切れによる削除も扱えるため、監査ログ、データ同期、外部検索インデックスの削除反映、イベントソーシング寄りの処理で役立ちます。ただし、利用にはAzure Cosmos DBアカウントの継続的バックアップが必要で、読み取れる変更はバックアップ保持期間内に限られます。(Microsoft Learn)

比較項目LatestVersionAllVersionsAndDeletes
作成イベント取得できる取得できる
更新イベント最新状態を取得中間更新も取得対象
削除イベント取得できない取得できる
TTLによる削除取得できない削除理由のメタデータとして扱える
保持期間コンテナー内に項目が存在する範囲で扱いやすい継続的バックアップの保持期間に依存
開始位置先頭、特定時刻、現在、チェックポイントなど現時点または継続トークン/リースからの再開が中心
向いている用途キャッシュ更新、検索インデックス更新、一般的なデータ同期削除検知、監査、CDC、データ移行、外部システムへの正確な反映

今回の更新で影響を受ける対象者

最も影響を受けるのは、Azure Functionsの.NET isolated workerでCosmos DB Triggerを使っている開発チームです。Microsoft.Azure.Functions.Worker.Extensions.CosmosDBにChangeFeedModeが追加されたため、関数コード側で変更フィードモードを明示できるようになります。PR #3420では、CosmosDBTriggerAttributeにChangeFeedModeプロパティが追加され、既定値はCosmosDBChangeFeedMode.LatestVersionとされています。(GitHub)

一方で、すべてのAzure Functionsアプリが自動的にAllVersionsAndDeletesを使えるわけではありません。対象は、利用している言語、Functionsの実行モデル、Cosmos DB拡張機能のバージョン、拡張機能バンドルの更新状況によって変わります。Microsoft LearnのCosmos DBバインド資料では、Azure Functions v4向けのCosmos DB拡張機能はNuGetパッケージまたは拡張機能バンドルで導入する形になっており、.NETの実行モデルによって参照するパッケージも異なります。(Microsoft Learn)

立場確認すべきこと
Azure管理者Cosmos DBアカウントがNoSQL APIか、継続的バックアップが有効か、機能が有効化されているか
Functions開発者Cosmos DB拡張機能のバージョン、ChangeFeedMode指定、受け取り型、削除イベント処理
SRE/運用担当リースコンテナー、RU消費、Application Insightsログ、再処理時の冪等性
アーキテクトLatestVersionのままでよいか、AllVersionsAndDeletesへ切り替える価値があるか

管理者が最初に確認すべき設定

AllVersionsAndDeletesは、コードだけを変えても動きません。まずAzure Cosmos DB側の前提条件を確認します。

確認項目確認内容見落とすと起きること
アカウント種別Azure Cosmos DB for NoSQLアカウントか対象外APIでは利用できない
バックアップ設定継続的バックアップが有効かAllVersionsAndDeletesを読めない
機能有効化「すべてのバージョンと削除」変更フィードモードが有効かトリガー側で指定しても期待通り処理できない
保持期間変更をどの期間までさかのぼって読む必要があるか保持期間外の変更は読めない
リース設計既存トリガーとリースを分けるか既存処理のチェックポイントと混ざり、検証が難しくなる
RU監視監視対象コンテナーとリースコンテナーのRUを監視しているか遅延、スロットリング、処理詰まりが起きやすい

Microsoft Learnでは、AllVersionsAndDeletesを使うには継続的バックアップが必要で、機能有効化にはAzure portalの「機能」ページを使う方法が案内されています。有効化プロセスには時間がかかる場合があり、その間はアカウント変更を避けるべきとされています。(Microsoft Learn)

開発者が確認すべきコード変更

今回の中心は、Cosmos DB TriggerにChangeFeedModeを指定できるようになる点です。PR #3420で追加されたenumには、最新バージョンのみを扱うLatestVersionと、中間更新・削除を扱うAllVersionsAndDeletesが定義されています。CosmosDBTriggerAttribute.ChangeFeedModeの既定値はLatestVersionなので、既存コードは基本的に従来モードのままです。(GitHub)

PackageReferenceの確認

.NET isolated workerでは、Microsoft.Azure.Functions.Worker.Extensions.CosmosDBを参照します。PR上では4.16.0への更新が記載されていますが、実際の導入時はNuGet Galleryや社内のパッケージフィードで、対象バージョンが公開済みかを確認してください。GitHub Releasesでは、基盤側のMicrosoft.Azure.WebJobs.Extensions.CosmosDB 4.16.0が2026年5月20日に公開され、AllVersionsAndDelete changefeed modeのサポートとMicrosoft.Azure.Cosmos 3.60.0への更新が記載されています。(GitHub)

<ItemGroup>
  <PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.CosmosDB" Version="4.16.0" />
</ItemGroup>

上記は確認ポイントを示す例です。実際には、利用中のFunctions Worker、Cosmos DB拡張、Azure Functions runtime、CI/CD環境で復元されるパッケージの整合性を確認してから固定してください。

ChangeFeedMode指定の基本イメージ

AllVersionsAndDeletesを使う場合は、Cosmos DB Triggerの属性にChangeFeedModeを指定します。以下は読み方を示すための簡略例です。

using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.Logging;

public class CosmosChangeFeedFunction
{
    private readonly ILogger<CosmosChangeFeedFunction> _logger;

    public CosmosChangeFeedFunction(ILogger<CosmosChangeFeedFunction> logger)
    {
        _logger = logger;
    }

    [Function(nameof(CosmosChangeFeedFunction))]
    public void Run(
        [CosmosDBTrigger(
            databaseName: "appdb",
            containerName: "items",
            Connection = "CosmosDbConnection",
            LeaseContainerName = "leases",
            ChangeFeedMode = CosmosDBChangeFeedMode.AllVersionsAndDeletes)]
        string changes)
    {
        _logger.LogInformation("Cosmos DB change feed received: {Changes}", changes);
    }
}

最初の検証では、いきなりPOCOに強く型付けするより、ログでペイロードの形を確認する方が安全です。AllVersionsAndDeletesでは、作成・置換・削除でレスポンスの形が変わり、削除イベントではcurrent本文ではなくmetadata中心の情報になるためです。Cosmos DBの公式ドキュメントでも、削除操作のレスポンス例はoperationType、id、partitionKey、timeToLiveExpiredなどのメタデータを持つ形で説明されています。(Microsoft Learn)

ChangeFeedItemを使う場面に注意する

Cosmos DB SDKでは、AllVersionsAndDeletesの変更を型付きで扱うためにChangeFeedItem<T>が用意されています。これは、現在の項目、以前の情報、メタデータを含む変更フィードリソースを表す型です。(Microsoft Learn)

基盤側のWebJobs拡張では、AllVersionsAndDeletes利用時に項目型をChangeFeedItem<T>でラップする必要がある旨がコードコメントや過去PRで示されています。特にインプロセスやWebJobs拡張側の処理では、Tだけを受け取ると削除イベントのメタデータを扱えず、期待したバインドにならない可能性があります。(GitHub)

ただし、.NET isolated workerではホストとワーカー間のバインディング形状が異なるため、対象バージョンでの実際の受け取り型を検証することが重要です。2026年5月22日時点では、out-of-process worker向けにAllVersionsAndDeletesの型シムを修正するPR #1000も開かれており、ワーカー側ではJObjectとして渡るケースへの対応が議論されています。したがって、本番投入前に最新の修正版リリース、E2Eテスト結果、実ペイロードを確認してください。(GitHub)

LatestVersionからAllVersionsAndDeletesへ切り替えるべきか

すべてのCosmos DB TriggerをAllVersionsAndDeletesへ変える必要はありません。むしろ、目的が「最新の状態を別システムへ反映する」だけなら、LatestVersionの方がシンプルです。

利用シーン推奨モード理由
商品マスタの最新状態を検索インデックスへ反映するLatestVersion最新状態だけ分かればよい
キャッシュを更新するLatestVersion中間更新より最終状態が重要
物理削除を外部システムにも反映したいAllVersionsAndDeletes削除イベントを検知できる
監査ログや変更履歴を残したいAllVersionsAndDeletes作成、更新、削除をイベントとして扱いやすい
短時間に同一項目が何度も更新され、その都度処理したいAllVersionsAndDeletes中間更新を取りこぼしにくい
保持期間を超えて全履歴を読み直したいLatestVersionまたは別設計AllVersionsAndDeletesは継続的バックアップ保持期間に依存する

重要なのは、AllVersionsAndDeletesを「高機能な上位互換」と考えないことです。削除や中間更新まで処理できる分、イベント数は増え、処理ロジックも複雑になります。保持期間、再処理、順序、重複実行、失敗時のリトライまで含めて設計する必要があります。

移行時に失敗しやすいポイント

既存トリガーをそのまま切り替えてしまう

既存のLatestVersionトリガーをいきなりAllVersionsAndDeletesへ変えると、処理対象イベントの意味が変わります。これまで「更新されたドキュメント」として処理していたコードに、削除イベントやメタデータ中心のイベントが流れる可能性があります。

特に、以下のようなコードは見直しが必要です。

// 例: すべての変更に current item がある前提の処理
foreach (var item in items)
{
    await searchIndex.UpsertAsync(item.Id, item);
}

AllVersionsAndDeletesでは、削除イベントを受けたときに検索インデックスから削除する、外部DBのレコードを論理削除する、監査ログにdeleteとして記録するなど、操作種別ごとの分岐が必要になります。

リースコンテナーを分けずに検証する

FunctionsのCosmos DB Triggerは、リースコンテナーを使って処理位置を管理します。検証段階で既存のリース設定を使い回すと、どこから読み始めたのか、どのモードのチェックポイントなのかが分かりにくくなります。

安全に検証するなら、最初は以下のいずれかを選びます。

  • 検証用のLeaseContainerNameを用意する
  • LeaseContainerPrefixで既存処理と分離する
  • ステージングスロットまたは検証用Function Appで動かす
  • 本番データに近いCosmos DBアカウントを使い、削除イベントまでE2Eで確認する

Azure Functionsのhost.jsonにはCosmos DB拡張のleasePrefix設定もあり、同じリースコンテナーを共有する場合の識別に使えます。(Microsoft Learn)

StartFromBeginningやStartFromTimeの期待値を誤る

LatestVersionでは、先頭や特定時刻から変更フィードを読む設計が比較的しやすい一方、AllVersionsAndDeletesでは制約があります。Microsoft Learnでは、AllVersionsAndDeletesはコンテナーの先頭や過去のタイムスタンプから開始する機能が現在サポートされておらず、現時点または以前のリース/継続トークンから開始すると説明されています。(Microsoft Learn)

つまり、「過去30日分の削除イベントをすぐにFunctionsで再処理したい」という要件は、保持期間と開始位置の制約を踏まえて設計しなければなりません。過去分の厳密な再構築が必要なら、変更フィードだけでなく、監査テーブル、イベントストア、バックアップ復元、外部ログ基盤との組み合わせも検討してください。

削除イベントの冪等性を考えていない

Azure Functionsのイベント処理では、同じ変更が再処理される可能性を前提にするべきです。削除イベントを受けたとき、外部システム側ですでに削除済みでもエラーにしない設計が必要です。

実務では、次のような実装が安全です。

処理避けたい実装安全な実装
検索インデックス削除対象なしで例外終了対象なしは成功扱い
外部DB更新deleteイベントを通常更新として扱うoperationTypeで分岐
通知送信再処理のたびに通知イベントIDやLSN相当の値で重複抑止
監査ログ同じイベントを何度も登録一意キーでupsertまたは重複排除

展開前チェックリスト

本番展開前には、コードレビューだけでなく、実際のCosmos DBアカウントを使った結合テストが欠かせません。特にdeleteとTTL期限切れは、ローカルの単体テストだけでは見落としやすいポイントです。

チェック合格条件
パッケージ対象のCosmos DB拡張バージョンがCI/CDで復元されている
Cosmos DB設定NoSQLアカウント、継続的バックアップ、All versions and deletes機能が有効
トリガー設定ChangeFeedMode = CosmosDBChangeFeedMode.AllVersionsAndDeletesを明示
受け取り型作成、更新、削除、TTL削除の各イベントで期待通りにデシリアライズできる
リース既存処理と分離したリースコンテナーまたはprefixで検証済み
監視Application Insightsで処理件数、例外、遅延、RU消費を確認できる
冪等性同一イベントの再処理でも外部システムが壊れない
ロールバックLatestVersionへ戻す手順、旧パッケージへ戻す手順がある
ドキュメント運用手順に削除イベントの扱いを追記している

管理者・開発者別の対応手順

管理者の手順

手順作業
現状確認対象Function App、Cosmos DBアカウント、利用中パッケージを一覧化する
Cosmos DB確認NoSQL API、継続的バックアップ、保持期間を確認する
機能有効化Azure portalまたは対応APIでAll versions and deletes変更フィードモードを有効化する
検証環境準備本番とは別のリース設定、ステージングスロット、監視設定を用意する
展開判定処理遅延、RU、例外、削除イベント処理の結果を見て本番適用を判断する

開発者の手順

手順作業
依存関係更新Cosmos DB拡張機能の対象バージョンを更新する
トリガー修正ChangeFeedModeを明示する
ペイロード確認create、replace、delete、TTL deleteの実データをログで確認する
分岐実装operationTypeに応じてupsert、delete、監査記録を分ける
冪等化外部システムへの反映処理を再実行に強くする
テスト実Cosmos DBアカウントでE2Eテストを行う

今回の更新を使うべきケース、使わない方がよいケース

AllVersionsAndDeletesは、削除や中間更新を「ビジネス上のイベント」として扱いたい場合に価値があります。たとえば、ユーザーがデータを削除したことを別システムにも反映したい、外部DWHへ正確な変更ログを送りたい、短時間の複数更新をそれぞれ処理したい、といったケースです。

反対に、単に最新状態を保てればよいシステムでは、LatestVersionのままの方が運用しやすいです。削除はソフト削除フラグで十分、変更履歴は別の監査ログに保存している、イベント数を増やしたくない、保持期間の制約を受けたくない場合は、無理に切り替える必要はありません。

まとめ:まずは影響範囲を小さくして検証する

Azure Functionsの「Azure Functions documentation update: feat(cosmos): support AllChangesAndDelete changefeed mode」は、Cosmos DB Triggerで削除イベントや中間更新を扱いたいチームにとって大きな前進です。ポイントは、PR名のAllChangesAndDeleteではなく、実際の指定値としてはAllVersionsAndDeletesを使うこと、既定値はLatestVersionのままであること、そしてCosmos DB側の継続的バックアップと機能有効化が必要なことです。

次に取るべき行動はシンプルです。まず、対象Function AppのCosmos DB拡張機能バージョンと実行モデルを確認します。次に、検証用リース設定を用意し、作成・更新・削除・TTL削除の4パターンをステージング環境で流します。最後に、削除イベントの冪等処理と監視を整えてから、本番へ段階的に展開してください。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次