Azure FunctionsとCosmos DBで作る!イベント駆動型マイクロサービス構築入門
生徒
「Azure(アジュール)を使って、データが入った瞬間に自動で処理が動くような仕組みを作りたいのですが、どうすればいいですか?」
先生
「それは『イベント駆動(くどう)型』のシステムですね。Azure Functions(アジュール・ファンクションズ)とCosmos DB(コスモス・ディービー)を組み合わせるのが最適ですよ。」
生徒
「イベント駆動型って難しそうですね。初心者でもマイクロサービスのような高度な設計ができるのでしょうか?」
先生
「大丈夫です!設定さえ覚えれば、サーバーの管理を意識せずに作れる『サーバーレス』という技術を使います。具体的な構築方法を一緒に見ていきましょう!」
1. Azure FunctionsとCosmos DBの基本知識
まずは、今回使用する二つの主要なサービスについて解説します。Azure Functionsは、特定のイベント(データの追加やタイマーなど)が発生したときにだけプログラムを実行する「サーバーレスコンピューティング」サービスです。必要な時だけ動くので、コストを抑えられるのが大きなメリットです。
一方、Cosmos DBは、世界規模で利用できる超高速なデータベースサービスです。一般的な表形式のデータベース(SQL)だけでなく、柔軟な形式のデータを扱える「NoSQL(ノーエスキューエル)」としての特徴を持っています。この二つを組み合わせることで、「データベースにデータが保存されたら、即座に別の処理を行う」という連動がスムーズに実現できます。
2. イベント駆動型マイクロサービスとは?
イベント駆動(Event-Driven)とは、「何かが起きたこと」をきっかけに処理を開始する仕組みのことです。例えば、スマホアプリで注文ボタンを押した(イベント)瞬間に、在庫を減らし、確認メールを送る、といった一連の動作をバラバラの小さなプログラム(マイクロサービス)で処理します。
従来のシステムでは、一つの大きなプログラムが全ての面倒を見ていましたが、マイクロサービスでは役割ごとにプログラムを分割します。これにより、一部が故障してもシステム全体が止まりにくくなり、修正や機能追加も簡単になります。Azureでは、Cosmos DBの変更を監視する「変更(へんこう)フィード」という機能を使って、これを実現します。
3. 開発環境の準備と設定方法
構築を始める前に、開発環境を整えましょう。主に以下のツールを使用します。これらはマイクロソフトが提供している無料のツールで、プログラミング初心者でも扱いやすいのが特徴です。
- Visual Studio Code(ビジュアル・スタジオ・コード):コードを書くためのエディタ。
- Azure Functions Core Tools:自分のパソコンでFunctionsを動かすためのツール。
- C#(シーシャープ)拡張機能:プログラミング言語C#を書くために必要。
準備ができたら、まずはAzureポータルでCosmos DBのアカウントを作成します。データベース名やコンテナー(テーブルのようなもの)を設定するだけで、データの受け皿が完成します。
4. Cosmos DBへのデータ登録(トリガーの準備)
まずは、データベースにデータが入る様子をイメージしましょう。以下のSQLのようなクエリでデータを操作することも可能ですが、Cosmos DBではJSON(ジェイソン)形式のデータが一般的です。まずは、現在のデータ状態を確認する例を見てみましょう。
id | product_name | price | category
---+--------------+-------+-----------
1 | ゲーミングPC | 150000| パソコン
2 | 4Kモニター | 45000 | 周辺機器
3 | メカニカルキーボード| 12000 | 周辺機器
4 | 無線マウス | 8000 | 周辺機器
ここに新しいデータが追加されたときに、Azure Functionsが「おっ、データが増えたな!」と検知して動き出します。
5. C#で書くAzure Functionsのコード例
それでは、Cosmos DBにデータが追加されたときに動くC#のコードを書いてみましょう。このプログラムは、新しい注文が入った時にログを出力するシンプルな例です。
using System;
using System.Collections.Generic;
using Microsoft.Azure.WebJobs;
using Microsoft.Extensions.Logging;
public static class CosmosTriggerFunction
{
[FunctionName("NotifyNewOrder")]
public static void Run([CosmosDBTrigger(
databaseName: "OrdersDB",
containerName: "Orders",
Connection = "CosmosDBConnection",
LeaseContainerName = "leases",
CreateLeaseContainerIfNotExists = true)] IReadOnlyList<dynamic> input,
ILogger log)
{
if (input != null && input.Count > 0)
{
log.LogInformation("新しい注文を " + input.Count + " 件検知しました。");
foreach (var doc in input)
{
log.LogInformation("商品ID: " + doc.id);
}
}
}
}
このコードの中にあるCosmosDBTriggerという部分が重要です。これがあるおかげで、自分で行を監視するプログラムを書かなくても、Azureが勝手に監視を代行してくれます。これを宣言的(せんげんてき)プログラミングと呼び、開発者の負担を大きく減らしてくれます。
6. データの加工と外部サービスとの連携
検知したデータを元に、別の処理を行うコードも見てみましょう。次は、受け取った数値に消費税を加算して計算するロジックです。これもマイクロサービスの一部として、計算専用の機能を切り出すイメージです。
public static class PriceCalculator
{
public static double CalculateTax(double price)
{
// 消費税10%を計算するシンプルなロジック
double taxRate = 0.1;
return price * (1 + taxRate);
}
public static void ProcessOrder(dynamic order, ILogger log)
{
double finalPrice = CalculateTax((double)order.price);
log.LogInformation($"商品名: {order.product_name}, 税込価格: {finalPrice}円");
}
}
このように、一つの関数(Function)を小さく保つことで、テストがしやすくなり、バグを見つけやすくなります。これがマイクロサービスの醍醐味です。
7. 実行結果とログの確認方法
プログラムが正常に動くと、Azureポータルの「ログ」画面に実行結果が表示されます。実際に新しいデータが登録された後の出力例を見てみましょう。
[2026-03-31T10:00:00.000Z] Executing 'NotifyNewOrder' (Reason='New changes on collection Orders', Id=...)
[2026-03-31T10:00:00.100Z] 新しい注文を 1 件検知しました。
[2026-03-31T10:00:00.105Z] 商品ID: 5
[2026-03-31T10:00:00.110Z] 商品名: Webカメラ, 税込価格: 5500円
[2026-03-31T10:00:00.115Z] Executed 'NotifyNewOrder' (Succeeded)
データベース側でも、新しいレコードが正しく保存されていることが確認できます。Cosmos DBは非常に高速なので、書き込みからFunctionsの実行までは、通常一秒もかかりません。
id | product_name | price | category
---+--------------+-------+-----------
1 | ゲーミングPC | 150000| パソコン
2 | 4Kモニター | 45000 | 周辺機器
...
5 | Webカメラ | 5000 | 周辺機器
8. コマンドラインでのデプロイ手順
作成したプログラムをAzure上に公開(デプロイ)するには、コマンドラインを使用するのが早くて便利です。以下のコマンドを使って、クラウド上に自分のマイクロサービスを送り出します。
func azure functionapp publish MyUniqueFunctionApp
Getting site publishing info...
Uploading package...
Upload completed successfully.
Deployment completed successfully.
デプロイが成功すれば、自分のパソコンを閉じていても、世界中のどこかでデータが更新されるたびに、あなたの作ったプログラムが24時間365日休まずに働き続けます。これこそがクラウド時代の開発スタイルです。
9. Cosmos DBのデータ操作をSQLで試す
Cosmos DBはNoSQLですが、実はSQL(エスキューエル)を使ってデータを検索することができます。これも初心者には嬉しいポイントです。以下のようなクエリで、特定のカテゴリのデータだけを抽出して、関数のテストデータに使うことができます。
SELECT c.id, c.product_name, c.price
FROM c
WHERE c.category = '周辺機器'
ORDER BY c.price DESC;
実行結果は以下のようになります。この結果を元に、Azure Functionsが大量のデータを一気に処理する「バッチ処理」のテストを行うことも可能です。
id | product_name | price
---+--------------+-------
2 | 4Kモニター | 45000
3 | メカニカルキーボード| 12000
4 | 無線マウス | 8000
5 | Webカメラ | 5000
10. 今後の学習ステップ
今回は、Azure FunctionsとCosmos DBを連携させた「イベント駆動型マイクロサービス」の第一歩を学びました。ここからさらにステップアップするには、以下のようなテーマに挑戦してみると良いでしょう。
- 疎結合(そけつごう): サービス同士をさらに独立させるために、Azure Service Busなどのメッセージサービスを間に挟む方法。
- セキュリティ: APIキーや認証を使って、特定のユーザーだけがデータを送れるように制限する方法。
- コスト最適化: データの保存容量や関数の実行回数を見直して、より安く運用する工夫。
最初は難しく感じるかもしれませんが、実際に手を動かしてコードが動いた時の感動は格別です。少しずつ機能を増やして、自分だけの強力なシステムを作り上げていきましょう!
まとめ
今回の記事では、Azure Functions(アジュール・ファンクションズ)とCosmos DB(コスモス・ディービー)を中核に据えた、イベント駆動型マイクロサービスの構築方法について詳しく解説しました。クラウドネイティブなシステム開発において、サーバーの管理を必要としない「サーバーレス」という考え方は、開発スピードの向上と運用コストの削減に直結する非常に重要な要素です。
特に、Cosmos DBの変更フィード(Change Feed)機能をトリガーにしてAzure Functionsを起動させる仕組みは、リアルタイム性が求められる現代のWebサービスにおいて欠かせない技術です。データの追加や更新といった「イベント」を即座に検知し、後続の処理(通知、集計、他システム連携など)を自動化することで、ユーザー体験を飛躍的に高めることが可能になります。
主要な技術ポイントの振り返り
本記事を通じて学んだ、実務でも役立つ重要なポイントを整理します。
- イベント駆動設計: データの変化をきっかけにプログラムを動かすため、常にサーバーを起動させておく必要がなく、リソースを効率的に利用できます。
- スケーラビリティ: Azure Functionsは負荷に応じて自動で拡張するため、急激なアクセス増加にも柔軟に対応可能です。
- C#による実装: 強力な型システムを持つC#を用いることで、保守性の高いマイクロサービスを記述できます。
- SQLによる柔軟なクエリ: NoSQLでありながら使い慣れたSQL構文でデータを操作できるため、開発の学習コストを抑えられます。
実践的なコード例の補足
まとめとして、Cosmos DBから取得した複数のデータに対して、特定の条件に基づいたフィルタリングや加工を行い、その結果を確認するためのロジックを再度確認しておきましょう。以下のC#コードは、取得した注文リストから高額商品のみを抽出するイメージです。
using System;
using System.Linq;
using System.Collections.Generic;
public class OrderProcessor
{
public static void FilterHighValueOrders(IEnumerable<dynamic> orders)
{
// 50,000円以上の注文を抽出してログ出力する例
var expensiveOrders = orders.Where(o => (double)o.price >= 50000);
foreach (var order in expensiveOrders)
{
Console.WriteLine($"高額注文検知: {order.product_name} (価格: {order.price}円)");
}
}
}
このようなロジックをAzure Functionsの中に組み込むことで、特定の条件を満たした時だけ管理者にアラートを送るような、高度な監視システムも簡単に構築できます。
データベース操作の再確認
実際の開発現場では、プログラムを動かす前にデータベースの現在の状態をSQLで把握しておくことが不可欠です。例えば、以下のようなテーブル状態から、特定の条件でデータを抽出する操作を繰り返してデバッグを行います。
id | product_name | price | category
---+-------------------+--------+-----------
1 | ゲーミングPC | 150000 | パソコン
2 | 4Kモニター | 45000 | 周辺機器
3 | メカニカルキーボード| 12000 | 周辺機器
4 | 無線マウス | 8000 | 周辺機器
5 | Webカメラ | 5000 | 周辺機器
6 | 高級チェア | 85000 | 家具
上記のデータに対して、価格が10,000円以上の「周辺機器」を取得するSQLクエリを実行してみます。
SELECT *
FROM Items c
WHERE c.price >= 10000
AND c.category = '周辺機器';
実行結果は以下の通りです。
id | product_name | price | category
---+-------------------+--------+-----------
2 | 4Kモニター | 45000 | 周辺機器
3 | メカニカルキーボード| 12000 | 周辺機器
このように、Azureポータル上のデータエクスプローラーを活用してSQLを叩く習慣をつけると、Azure Functionsの実装効率も格段に向上します。
最後に
クラウドサービスを組み合わせる開発手法は、最初こそ設定項目の多さに戸惑うかもしれませんが、一度コツを掴めばこれほど強力な武器はありません。本記事で紹介した構成は、Eコマース、IoTデータの解析、ログの自動監視など、あらゆる場面で応用可能です。ぜひ、ご自身のプロジェクトにも取り入れて、モダンなシステム開発を体感してください。
生徒
「先生、まとめまで読んでみて、ようやく全体の流れが掴めてきました!Cosmos DBにデータが入ると、Azure Functionsが自動的に起きて仕事をしてくれる…まさに魔法みたいですね。」
先生
「その通りです!これまではサーバーが『誰か来ないかな?』とずっと待ち構えている必要がありましたが、今は『何かが起きた時だけ動く』という効率的な働き方が主流なんです。」
生徒
「記事の中で紹介されていたC#のコードも、思っていたより短くて驚きました。CosmosDBTriggerのおかげで、面倒な接続処理をAzureが全部やってくれるから、自分は本当にやりたい処理(ロジック)に集中できるんですね。」
先生
「素晴らしい気づきですね!それがマイクロサービスの大きなメリットの一つです。複雑な仕組みを、小さくてシンプルな部品の集まりとして作っていく感覚を忘れないでください。」
生徒
「はい!あとはSQLも使えるのが心強いです。NoSQLって聞いた時は『専用の難しい言語を覚えないといけないのかな?』と不安でしたが、これなら今までの知識も活かせそうです。」
先生
「そうですね。Cosmos DBは非常に柔軟です。まずは基本的なデータの読み書きから始めて、慣れてきたらLinuxコマンドを使ってfunc azure functionapp publishで自分のサービスを世界に公開してみましょう!」
生徒
「ワクワクしてきました!さっそくVisual Studio Codeを開いて、最初の関数を作ってみます。先生、ありがとうございました!」