記事公開日
Cosmos DBトリガーで構築するAzure Functionsイベント駆動パターン

この設計は、処理をシンプル化し、即時性と信頼性を高める上で非常に有効です。
I. Cosmos DBトリガーの動作原理とleasesコンテナの役割
①動作の仕組み(変更フィード)
Cosmos DBトリガーの動作原理は、DB内のデータ変更の履歴ストリーム(変更フィード)を直接監視することにあります。データが書き込まれたり更新されたりすると、Azure Functionsはそれを即座に検知し、起動します。
②必須設定:leasesコンテナの役割
トリガーの安定稼働には、leasesコンテナが必要です。※leasesコンテナはマネージドIDを使用する場合、自動で作成できませんでしたので、事前にCosmosDBへ作成してください。
- 役割: 処理の進捗を記録する「しおり」として機能し、複数のAzure Functionsインスタンスが同時に動いても、処理の重複や見逃しを防ぎます。
- パーティションキー: Leasesコンテナを作成する際は、パーティションキーに/idを設定することが必須です。
③IDベース接続の利用
キーレスでセキュアな接続を行うために、マネージドIDと、Cosmos DBのURLを紐づける設定(例: CosmosDbConnection__accountEndpoint)が必要です。Azure Functions 2.x 以降での Azure Cosmos DB のトリガー
II. トリガーの設定と処理ロジック
ここでは、DBの変更を検知する最もシンプルなトリガー関数(ChangeDetector)を紹介します。 監視対象のコンテナ(例としてChangeSourceとします)、接続名、leasesコンテナ等をデコレータで定義します。DBから受け取ったデータを読み取り、シンプルなログを出力することで処理の起動を確認します。
import logging
import json
import azure.functions as func
import os
app = func.FunctionApp()
logger = logging.getLogger(__name__)
@app.function_name(name="ChangeDetector")
# トリガーの設定
@app.cosmos_db_trigger(
arg_name="documents",
# 監視対象のコンテナを持つDB名
database_name="TargetDatabase",
# 監視対象のコンテナ名
container_name="ChangeSource",
# Cosmos DBへの接続設定名
connection="CosmosDbConnection",
# リースコンテナ(しおり)の設定
lease_container_name="leases",
lease_connection="CosmosDbConnection",
)
def change_detector(
documents: func.DocumentList,
) -> None:
"""DBの変更を検知し、ログを出力する関数"""
# 処理ロジック
logger.info(f"--- Cosmos DB Trigger Activated: {len(documents)} document(s) detected. ---")
for i, doc in enumerate(documents):
# 変更検知したドキュメントを処理
try:
doc_id = doc.get("id")
logger.info(
f"Success: [Doc {i+1}] ID {doc_id} detected.",
)
except Exception as e:
logger.error(f"Error processing document: {e}")
環境変数はCosmosDbConnectionに合わせて以下を定義してください。
これでマネージドIDが使用できるようになります。
"CosmosDbConnection__accountEndpoint": "https://{Azure Cosmos DB account Name}.documents.azure.com:443",
"CosmosDbConnection__clientId": "{マネージドIDのクライアントID}",
III. 実行結果/この設計が有効な場面
この設計により、複雑なライフサイクルを回避し、DBへのデータ書き込み完了を契機に、後続の処理を確実かつ即時に起動できます。実行結果
DBにデータが書き込まれた瞬間に本Azure Functionが起動し、コンソールに以下のようなログが即座に出力されます。
どのような場面で有用か
- 信頼性が求められる非同期処理(通知、データ同期)を実行したい場合。
- 追加リソースの管理コストを削減し、構成をシンプルにしたい場合。
- DBへの書き込みを起点とする処理全般。
(例: ユーザーがプロフィールを更新したら、外部システムに即時連携する場合など)。
まとめ
いかがだったでしょうか。本記事で紹介したCosmos DBトリガーによるイベント駆動設計は、追加リソースの管理を不要にし、シンプルかつ確実な処理起動を実現します。非同期処理や外部連携を簡潔に構築したい場合に、非常に有効なパターンです。
ぜひAzure Functionsでこの設計を試してみてください!
QUICK E-Solutionsでは、「AIチャットボット構築サービス」をはじめとして、各AIサービスを利用したシステム導入のお手伝いをしております。それ以外でも様々なアプリケーションの開発・導入を行っております。提供するサービス・ソリューションにつきましては こちら に掲載しております。
システム開発・構築でお困りの問題や弊社が提供するサービス・ソリューションにご興味を抱かれましたら、是非一度 お問い合わせ ください。
※このブログで参照されている、Microsoft、Azure、その他のマイクロソフト製品およびサービスは、米国およびその他の国におけるマイクロソフトの商標または登録商標です。
※その他の会社名、製品名は各社の登録商標または商標です。


