Azure Cosmos DB と Azure Functions を使用したサーバーレス データベース コンピューティングServerless database computing using Azure Cosmos DB and Azure Functions

サーバーレス コンピューティングとは、繰り返し可能でステートレスな個々のロジックに集中できる機能です。Serverless computing is all about the ability to focus on individual pieces of logic that are repeatable and stateless. 個々のロジックにインフラストラクチャの管理は必要ありません。秒単位またはミリ秒単位の実行時間のみリソースを使用します。These pieces require no infrastructure management and they consume resources only for the seconds, or milliseconds, they run for. サーバーレス コンピューティングのムーブメントの中心には、関数があります。関数は、Azure エコシステムのAzure Functions で使用できます。At the core of the serverless computing movement are functions, which are made available in the Azure ecosystem by Azure Functions. Azure での他のサーバーレス実行環境については、「Azure でのサーバーレス」ページをご覧ください。To learn about other serverless execution environments in Azure see serverless in Azure page.

Azure Cosmos DB と Azure Functions 間のネイティブ統合を使用すると、Azure Cosmos DB アカウントからデータベースのトリガー、入力バインディング、出力バインディングを直接作成できます。With the native integration between Azure Cosmos DB and Azure Functions, you can create database triggers, input bindings, and output bindings directly from your Azure Cosmos DB account. Azure Functions と Azure Cosmos DB を使用すると、グローバル ユーザー ベース向けの、リッチ データに低待機時間でアクセスできる、イベント ドリブンのサーバーレス アプリケーションを作成およびデプロイすることができます。Using Azure Functions and Azure Cosmos DB, you can create and deploy event-driven serverless apps with low-latency access to rich data for a global user base.

概要Overview

Azure Cosmos DB と Azure Functions を使用して、次の方法でデータベースとサーバーレス アプリケーションを統合できます。Azure Cosmos DB and Azure Functions enable you to integrate your databases and serverless apps in the following ways:

  • イベント ドリブンの Cosmos DB 用 Azure Functions トリガーを作成します。Create an event-driven Azure Functions trigger for Cosmos DB. このトリガーは、変更フィード ストリームを使用して Azure Cosmos コンテナーの変更を監視します。This trigger relies on change feed streams to monitor your Azure Cosmos container for changes. コンテナーに変更が加えられると、変更フィード ストリームがトリガーに送信され、それによって Azure Functions が呼び出されます。When any changes are made to a container, the change feed stream is sent to the trigger, which invokes the Azure Function.
  • あるいは、入力バインディングを使用して、Azure 関数を Azure Cosmos コンテナーにバインドします。Alternatively, bind an Azure Function to an Azure Cosmos container using an input binding. 関数が実行されると、入力バインディングはコンテナーのデータを読み取ります。Input bindings read data from a container when a function executes.
  • 出力バインディングを使用して、関数を Azure Cosmos コンテナーにバインドします。Bind a function to an Azure Cosmos container using an output binding. 関数が完了すると、出力バインディングはコンテナーにデータを書き込みます。Output bindings write data to a container when a function completes.

注意

現時点では、Cosmos DB 用 Azure Functions トリガー、入力バインディング、および出力バインディングは、SQL API で使用する場合にのみサポートされます。Currently, Azure Functions trigger, input bindings, and output bindings for Cosmos DB are supported for use with the SQL API only. 他のすべての Azure Cosmos DB API については、API 用の静的クライアントを使用して関数からデータベースにアクセスする必要があります。For all other Azure Cosmos DB APIs, you should access the database from your function by using the static client for your API.

次の各図は、これら 3 つの統合を示しています。The following diagram illustrates each of these three integrations:

Azure Cosmos DB と Azure Functions を統合する方法

Azure Cosmos DB 用 Azure Functions トリガー、入力バインディング、および出力バインディングは、次の組み合わせで使用できます。The Azure Functions trigger, input binding, and output binding for Azure Cosmos DB can be used in the following combinations:

  • Cosmos DB 用 Azure Functions トリガーは、別の Azure Cosmos コンテナーへの出力バインディングで使用できます。An Azure Functions trigger for Cosmos DB can be used with an output binding to a different Azure Cosmos container. 関数が変更フィードの項目に対してアクションを実行した後に、別のコンテナーに書き込むことができます (同じコンテナーに書き込むと、実質的に再帰的ループが作成されます)。After a function performs an action on an item in the change feed you can write it to another container (writing it to the same container it came from would effectively create a recursive loop). または、Cosmos DB 用 Azure Functions トリガーと出力バインディングを使用して、実質的に 1 つのコンテナー内の変更されたすべての項目を別のコンテナーに移行できます。Or, you can use an Azure Functions trigger for Cosmos DB to effectively migrate all changed items from one container to a different container, with the use of an output binding.
  • Azure Cosmos DB の入力バインディングと出力バインディングは、同じ Azure Functions で使用できます。Input bindings and output bindings for Azure Cosmos DB can be used in the same Azure Function. この方法は、入力バインディングで特定のデータを検索し、Azure Functions で変更し、変更後に同じコンテナーまたは別のコンテナーに保存する場合に適しています。This works well in cases when you want to find certain data with the input binding, modify it in the Azure Function, and then save it to the same container or a different container, after the modification.
  • Azure Cosmos コンテナーへの入力バインディングは Cosmos DB 用 Azure Functions トリガーと同じ関数で使用でき、また出力バインディングの有無にかかわらず使用できます。An input binding to an Azure Cosmos container can be used in the same function as an Azure Functions trigger for Cosmos DB, and can be used with or without an output binding as well. この組み合わせを使用すると、ショッピング カート サービスの新しい注文の変更フィードに最新の為替情報を適用できます (為替コンテナーに対する入力バインディングで取得します)。You could use this combination to apply up-to-date currency exchange information (pulled in with an input binding to an exchange container) to the change feed of new orders in your shopping cart service. 最新の為替換算を適用して更新した後のショッピング カート合計は、出力バインディングを使用して 3 つ目のコンテナーに書き込むことができます。The updated shopping cart total, with the current currency conversion applied, can be written to a third container using an output binding.

ユース ケースUse cases

次のユース ケースでは、データをイベント ドリブンの Azure Functions に接続して Azure Cosmos DB データを最大限に活用する方法をいくつか紹介します。The following use cases demonstrate a few ways you can make the most of your Azure Cosmos DB data - by connecting your data to event-driven Azure Functions.

IoT のユース ケース - Cosmos DB 用 Azure Functions トリガーと出力バインディングIoT use case - Azure Functions trigger and output binding for Cosmos DB

IoT 実装では、接続されている車のエンジンのチェック ランプが点灯したときに、関数を呼び出すことができます。In IoT implementations, you can invoke a function when the check engine light is displayed in a connected car.

実装: Cosmos DB 用 Azure Functions トリガーと出力バインディングを使用するImplementation: Use an Azure Functions trigger and output binding for Cosmos DB

  1. Cosmos DB 用 Azure Functions トリガーを使用して、接続されている車のエンジンのチェック ランプの点灯など、車の警告に関連するイベントをトリガーします。An Azure Functions trigger for Cosmos DB is used to trigger events related to car alerts, such as the check engine light coming on in a connected car.
  2. エンジンのチェック ランプが点灯すると、センサー データが Azure Cosmos DB に送信されます。When the check engine light comes, the sensor data is sent to Azure Cosmos DB.
  3. Azure Cosmos DB で新しいセンサー データ ドキュメントが作成または更新された後、それらの変更が Cosmos DB 用 Azure Functions トリガーにストリームされます。Azure Cosmos DB creates or updates new sensor data documents, then those changes are streamed to the Azure Functions trigger for Cosmos DB.
  4. トリガーは、センサー データ コレクションに対するデータの変更ごとに呼び出されます。また、変更が変更フィード経由でストリームされたときにも呼び出されます。The trigger is invoked on every data-change to the sensor data collection, as all changes are streamed via the change feed.
  5. 関数でしきい値の条件を使用して、センサー データを保証部門に送信します。A threshold condition is used in the function to send the sensor data to the warranty department.
  6. 温度が特定の値を超えた場合も、警告が所有者に送信されます。If the temperature is also over a certain value, an alert is also sent to the owner.
  7. 関数への出力バインディングによって、別の Azure Cosmos コンテナー内の車の記録が更新され、エンジンのチェック イベントに関する情報が格納されます。The output binding on the function updates the car record in another Azure Cosmos container to store information about the check engine event.

次の図は、このトリガーで Azure Portal で書き込まれるコードを示しています。The following image shows the code written in the Azure portal for this trigger.

Azure portal で Cosmos DB 用 Azure Functions トリガーを作成する

財務ユース ケース - タイマー トリガーと入力バインディングFinancial use case - Timer trigger and input binding

財務実装では、銀行口座の残高が一定額を下回ったときに関数を呼び出すことができます。In financial implementations, you can invoke a function when a bank account balance falls under a certain amount.

実装: タイマー トリガーと Azure Cosmos DB 入力バインディングImplementation: A timer trigger with an Azure Cosmos DB input binding

  1. タイマー トリガーを使用すると、入力バインディングを使用して、Azure Cosmos コンテナーに格納されている銀行口座残高の情報を一定の間隔で取得できます。Using a timer trigger, you can retrieve the bank account balance information stored in an Azure Cosmos container at timed intervals using an input binding.
  2. ユーザーが設定した残高の下限しきい値を下回った場合、Azure Functions のアクションが実行されます。If the balance is below the low balance threshold set by the user, then follow up with an action from the Azure Function.
  3. 出力バインディングは、サービス アカウントから、低い残高の各口座に指定された電子メール アドレスに対して電子メールが送信される SendGrid 統合です。The output binding can be a SendGrid integration that sends an email from a service account to the email addresses identified for each of the low balance accounts.

次の図は、このシナリオ用の Azure Portal のコードを示しています。The following images show the code in the Azure portal for this scenario.

財務シナリオのタイマー トリガーの Index.js ファイル

財務シナリオのタイマー トリガーの Run.csx ファイル

ゲームのユース ケース - Cosmos DB 用 Azure Functions トリガーと出力バインディングGaming use case - Azure Functions trigger and output binding for Cosmos DB

ゲームでは、新しいユーザーを作成するときに、Azure Cosmos DB Gremlin API を使用して、知っている可能性のある他のユーザーを検索することができます。In gaming, when a new user is created you can search for other users who might know them by using the Azure Cosmos DB Gremlin API. 簡単に取得できるように、結果を [Azure Cosmos DB SQL データベース] に書き込むことができます。You can then write the results to an [Azure Cosmos DB SQL database] for easy retrieval.

実装: Cosmos DB 用 Azure Functions トリガーと出力バインディングを使用するImplementation: Use an Azure Functions trigger and output binding for Cosmos DB

  1. Azure Cosmos DB のグラフ データベースを使用してすべてのユーザーを格納することで、Cosmos DB 用 Azure Functions トリガーを使用する新しい関数を作成できます。Using an Azure Cosmos DB graph database to store all users, you can create a new function with an Azure Functions trigger for Cosmos DB.
  2. 新しいユーザーが挿入されるたびに関数が呼び出され、結果は出力バインディングを使用して格納されます。Whenever a new user is inserted, the function is invoked, and then the result is stored using an output binding.
  3. この関数は、グラフ データベースに対して、新しいユーザーに直接関連するすべてのユーザーを検索するクエリを実行し、そのデータセットを関数に返します。The function queries the graph database to search for all the users that are directly related to the new user and returns that dataset to the function.
  4. このデータは、Azure Cosmos DB に格納されます。新規ユーザーに接続されている友人を表示する任意のフロントエンド アプリケーションから、このデータを簡単に取得できます。This data is then stored in an Azure Cosmos DB which can then be easily retrieved by any front-end application that shows the new user their connected friends.

小売のユース ケース - 複数の関数Retail use case - Multiple functions

小売の実装では、ユーザーがアイテムをバスケットに追加したときに、オプションのビジネス パイプライン コンポーネントの関数を柔軟に作成し、呼び出すことができるようになります。In retail implementations, when a user adds an item to their basket you now have the flexibility to create and invoke functions for optional business pipeline components.

実装: 1 つのコンテナーをリッスンする複数の Cosmos DB 用 Azure Functions トリガーImplementation: Multiple Azure Functions triggers for Cosmos DB listening to one container

  1. それぞれに Cosmos DB 用 Azure Functions トリガーが追加された複数の Azure 関数を作成できます。これらはすべて、ショッピング カート データの同じ変更フィードをリッスンします。You can create multiple Azure Functions by adding Azure Functions triggers for Cosmos DB to each - all of which listen to the same change feed of shopping cart data. 複数の関数が同じ変更フィードをリッスンする際は、各関数に新しいリース コレクションが必要になることに注意してください。Note that when multiple functions listen to the same change feed, a new lease collection is required for each function. リース コレクションの詳細については、「Change Feed Processor ライブラリの概要」を参照してください。For more information about lease collections, see Understanding the Change Feed Processor library.
  2. 新しい項目がユーザーのショッピング カートに追加されるたびに、各関数はショッピング カート コンテナーの変更フィードから個別に呼び出されます。Whenever a new item is added to a users shopping cart, each function is independently invoked by the change feed from the shopping cart container.
    • 1 つの関数で現在のバスケットの内容を使用して、ユーザーが関心を持つ可能性がある他の項目の表示を変更することができます。One function may use the contents of the current basket to change the display of other items the user might be interested in.

    • 別の関数で在庫の合計を更新できます。Another function may update inventory totals.

    • また、別の関数は特定の製品に関する顧客情報をマーケティング部門に送信できます。マーケティング部門は宣伝メールを送信します。Another function may send customer information for certain products to the marketing department, who sends them a promotional mailer.

      任意の部門で変更フィードをリッスンして Cosmos DB 用 Azure Functions を作成し、プロセスの重要な注文処理イベントが遅れないようにすることができます。Any department can create an Azure Functions for Cosmos DB by listening to the change feed, and be sure they won't delay critical order processing events in the process.

これらのいずれのユース ケースでも、関数でアプリケーション自体が分離されるので、常に新しいアプリケーション インスタンスを起動する必要はありません。In all of these use cases, because the function has decoupled the app itself, you don’t need to spin up new app instances all the time. その代わりに必要に応じて Azure Functions が個々の関数を起動して各プロセスを完了します。Instead, Azure Functions spins up individual functions to complete discrete processes as needed.

ツールTooling

Azure portal と Visual Studio 2019 では、Azure Cosmos DB と Azure Functions 間のネイティブ統合を使用できます。Native integration between Azure Cosmos DB and Azure Functions is available in the Azure portal and in Visual Studio 2019.

  • Azure Functions ポータルで、トリガーを作成できます。In the Azure Functions portal, you can create a trigger. クイック スタートの手順については、Azure portal での Cosmos DB 用 Azure Functions トリガーの作成に関するページをご覧ください。For quickstart instructions, see Create an Azure Functions trigger for Cosmos DB in the Azure portal.

  • Azure Cosmos DB ポータルで、同じリソース グループ内の既存の Azure Functions アプリに Cosmos DB 用 Azure Functions トリガーを追加できます。In the Azure Cosmos DB portal, you can add an Azure Functions trigger for Cosmos DB to an existing Azure Function app in the same resource group.

  • Visual Studio 2019 で、Azure Functions Tools を使用してトリガーを作成できます。In Visual Studio 2019, you can create the trigger using the Azure Functions Tools:

サーバーレス コンピューティングに Azure Functions 統合を選択する理由Why choose Azure Functions integration for serverless computing?

Azure Functions には、スケーラブルなユニットの作業や、オンデマンドで実行できるロジックの簡潔な部分を作成する機能があります。インフラストラクチャをプロビジョニングまたは管理する必要はありません。Azure Functions provides the ability to create scalable units of work, or concise pieces of logic that can be run on demand, without provisioning or managing infrastructure. Azure Functions を使用すると、Azure Cosmos データベース内の変更に応答する本格的なアプリを作成する必要はなく、特定のタスクのための小さな再利用可能な関数を作成できます。By using Azure Functions, you don't have to create a full-blown app to respond to changes in your Azure Cosmos database, you can create small reusable functions for specific tasks. また、HTTP 要求または適時のトリガーなどのイベントに応答して、Azure Functions への入力または出力として Azure Cosmos DB データを使用することもできます。In addition, you can also use Azure Cosmos DB data as the input or output to an Azure Function in response to event such as an HTTP requests or a timed trigger.

Azure Cosmos DB は、サーバーレス コンピューティング アーキテクチャに推奨されるデータベースです。その理由は次のとおりです。Azure Cosmos DB is the recommended database for your serverless computing architecture for the following reasons:

  • すべてのデータにすぐにアクセス:Azure Cosmos DB の既定では、すべてのデータのインデックスが自動的に作成され、それらのインデックスをすぐに使用できるため、格納されているすべての値に対するアクセス権を細かくすることができます。Instant access to all your data: You have granular access to every value stored because Azure Cosmos DB automatically indexes all data by default, and makes those indexes immediately available. つまり、データベースに対して新しい項目のクエリ、更新、追加をいつでも実行し、Azure Functions 経由ですぐにアクセスできます。This means you are able to constantly query, update, and add new items to your database and have instant access via Azure Functions.

  • スキーマレスSchemaless. Azure Cosmos DB はスキーマレスです。そのため、Azure Functions からすべてのデータ出力を一意に処理できます。Azure Cosmos DB is schemaless - so it's uniquely able to handle any data output from an Azure Function. この "すべてを処理する" アプローチによって、すべてを Azure Cosmos DB に出力する多様な関数を簡単に作成できます。This "handle anything" approach makes it straightforward to create a variety of Functions that all output to Azure Cosmos DB.

  • スケーラブルなスループットScalable throughput. Azure Cosmos DB のスループットのスケール アップとスケール ダウンはすぐに行うことができます。Throughput can be scaled up and down instantly in Azure Cosmos DB. 数百から数千単位の Functions のクエリがあり、同じコンテナーに書き込む場合、負荷を処理する RU/秒をスケール アップできます。If you have hundreds or thousands of Functions querying and writing to the same container, you can scale up your RU/s to handle the load. すべての関数は、割り当てられた RU/秒を使用して並列処理できます。また、データの整合性が保証されます。All functions can work in parallel using your allocated RU/s and your data is guaranteed to be consistent.

  • グローバル レプリケーションGlobal replication. ユーザーのいる場所に最も近いデータの位置を特定することで、世界中の Azure Cosmos DB データをレプリケートして待機時間を短縮できます。You can replicate Azure Cosmos DB data around the globe to reduce latency, geo-locating your data closest to where your users are. すべての Azure Cosmos DB クエリと同様に、イベント ドリブン トリガーのデータは、ユーザーに最も近い Azure Cosmos DB から読み取られます。As with all Azure Cosmos DB queries, data from event-driven triggers is read data from the Azure Cosmos DB closest to the user.

Azure Functions と統合してデータを格納し、深いインデックス作成が必要ない場合、または添付ファイルとメディア ファイルを格納する必要がある場合、Azure Blob Storage トリガーが適している可能性があります。If you're looking to integrate with Azure Functions to store data and don't need deep indexing or if you need to store attachments and media files, the Azure Blob Storage trigger may be a better option.

Azure Functions の利点:Benefits of Azure Functions:

  • イベント ドリブンです。Event-driven. Azure Functions はイベント ドリブンです。また、Azure Cosmos DB の変更フィードをリッスンできます。Azure Functions are event-driven and can listen to a change feed from Azure Cosmos DB. つまり、リッスン ロジックを作成する必要はなく、リッスンしている変更のみに注目するだけで済みます。This means you don't need to create listening logic, you just keep an eye out for the changes you're listening for.

  • 無制限No limits. 関数は並列して実行され、必要な数のサービスを起動できます。Functions execute in parallel and the service spins up as many as you need. また、必要に応じてパラメーターを設定します。You set the parameters.

  • クイック タスクに適していますGood for quick tasks. イベントが発生するたびに、サービスは関数の新しいインスタンスを起動します。関数が完了すると、イベントは直ちに閉じられます。The service spins up new instances of functions whenever an event fires and closes them as soon as the function completes. ユーザーは、関数が実行された時間に対してだけ支払います。You only pay for the time your functions are running.

Flow、Logic Apps、Azure Functions、または WebJobs が実装に適しているかどうかがわからない場合は、「Flow、Logic Apps、Functions、WebJobs の比較」を参照してください。If you're not sure whether Flow, Logic Apps, Azure Functions, or WebJobs are best for your implementation, see Choose between Flow, Logic Apps, Functions, and WebJobs.

次の手順Next steps

それでは実際に Azure Cosmos DB と Azure Functions を接続してみましょう。Now let's connect Azure Cosmos DB and Azure Functions for real: