複数の Azure Cosmos DB 用 Azure Functions トリガーの作成

適用対象: NoSQL

この記事では、複数の Azure Cosmos DB 用 Azure Functions トリガーが並列で動作し、変更に対して個別に対応するよう構成する方法について説明します。

Azure Cosmos DB 用 Azure Functions トリガーと連携し、リース コンテナーを共有するサーバーレスのイベントベース Functions

イベントベースのアーキテクチャの要件

Azure Functions を使用してサーバーレス アーキテクチャを構築する際は、サイズが大きく実行時間の長い関数ではなく、連携する小さい関数のセットを作成することをお勧めします

Azure Cosmos DB 用 Azure Functions トリガーを使用してイベントベースのサーバーレス フローを構築する際に、特定の Azure Cosmos DB コンテナーに新しいイベントがあるたびに複数のことを実行したくなる状況に直面します。 トリガーするアクションが互いに独立している場合、理想的な解決策として、実行したいアクションごとに 1 つの Azure Cosmos DB 用 Azure Functions トリガーを作成し、すべてで同一の Azure Cosmos DB コンテナーに対する変更をリッスンします。

複数のトリガーのコンテナーの最適化

Azure Cosmos DB 用 Azure Functions トリガーの "要件" を考えると、状態を格納するための 2 番目のコンテナー ("リース コンテナー" とも呼ばれます) が必要です。 これは、Azure 関数ごとに個別のリース コンテナーが必要になるという意味でしょうか。

ここでは、次の 2 つの選択肢があります。

  • 関数ごとにリース コンテナーを 1 つ作成する: このアプローチは、共有スループット データベースを使用していない限り、追加コストにつながる可能性があります。 コンテナー レベルでの最小スループットは 400 要求ユニットであり、リース コンテナーの場合は進行状況のチェックポイント処理と状態の維持にのみ使用されることを覚えておいてください。
  • すべての関数に対して 1 つのリース コンテナーを用意して共有する: この 2 番目の選択肢では、複数の Azure 関数で同じプロビジョニング済みのスループットを共有および使用できるようになるため、コンテナー上でプロビジョニングされた要求ユニットをより有効に活用できます。

この記事の目的は、2 番目の選択肢で作業を遂行することです。

共有リース コンテナーの構成

共有リース コンテナーを構成するには、トリガーに対して行う必要がある唯一の追加の構成として、LeaseContainerPrefix属性 (C# を使用している場合) または leaseContainerPrefix属性 (JavaScript を使用している場合) を追加します。 この属性の値は、その特定のトリガーの論理的な記述子である必要があります。

たとえば、メールを送信するトリガー、マテリアライズドビューを作成するために集計を実行するトリガー、後で分析するために変更を別のストレージに送信するトリガーという 3 つのトリガーがある場合、最初のトリガーには "emails"、2 番目のトリガーには "materialized"、3 番目のトリガーには "analytics" を LeaseContainerPrefix に割り当てることができます。

重要なのは、3 つのすべてのトリガーが同じリース コンテナー構成 (アカウント、データベース、およびコンテナー名) を使用できるということです。

C# の LeaseContainerPrefix 属性を使用した非常に単純なコード サンプルは次のようになります。

using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host;
using System.Collections.Generic;
using Microsoft.Extensions.Logging;

[FunctionName("SendEmails")]
public static void SendEmails([CosmosDBTrigger(
    databaseName: "ToDoItems",
    containerName: "Items",
    Connection = "CosmosDBConnection",
    LeaseContainerName = "leases",
    LeaseContainerPrefix = "emails")]IReadOnlyList<MyItem> items,
    ILogger log)
{
    ...
}

[FunctionName("MaterializedViews")]
public static void MaterializedViews([CosmosDBTrigger(
    databaseName: "ToDoItems",
    containerName: "Items",
    Connection = "CosmosDBConnection",
    LeaseContainerName = "leases",
    LeaseContainerPrefix = "materialized")]IReadOnlyList<MyItem> items,
    ILogger log)
{
    ...
}

JavaScript の場合は、leaseContainerPrefix 属性を使用して function.json ファイルに構成を適用できます。

{
    "type": "cosmosDBTrigger",
    "name": "documents",
    "direction": "in",
    "leaseContainerName": "leases",
    "connection": "CosmosDBConnection",
    "databaseName": "ToDoItems",
    "containerName": "Items",
    "leaseContainerPrefix": "emails"
},
{
    "type": "cosmosDBTrigger",
    "name": "documents",
    "direction": "in",
    "leaseContainerName": "leases",
    "connection": "CosmosDBConnection",
    "databaseName": "ToDoItems",
    "containerName": "Items",
    "leaseContainerPrefix": "materialized"
}

Note

共有リース コンテナーでプロビジョニングされた要求ユニットを常に監視してください。 これを共有する各トリガーではスループットの平均消費量が増加するため、これを使用している Azure 関数の数を増やすのに合わせてプロビジョニングされたスループットを増やす必要がある場合があります。

次のステップ