次の方法で共有


Azure Functions 2.x 以降のAzure Cosmos DB トリガー

Azure Cosmos DB トリガーは、Azure Cosmos DB変更フィードを使用して、パーティション間での挿入と更新をリッスンします。 変更フィードは、削除による更新を含めずに、新規および更新された項目を公開します。 Azure Cosmos DB トリガーを使用するエンド ツー エンドのシナリオについては、「Quickstart: Azure Functionsを参照してください。

セットアップと構成の詳細については、概要に関するページをご覧ください。

従量課金プランと Premium プランに対する Cosmos DB のスケーリングの決定は、ターゲットベースのスケーリングによって行われます。 詳しくは、「ターゲット ベースのスケーリング」をご覧ください。

重要

この記事では、タブを使用して、Node.js プログラミング モデルの複数のバージョンに対応しています。 v4 モデルは一般提供されており、JavaScript と TypeScript の開発者にとって、より柔軟で直感的なエクスペリエンスが得られるように設計されています。 v4 モデルの動作の詳細については、Azure Functions Node.js 開発者ガイドを参照してください。 v3 と v4 の違いの詳細については、移行ガイドを参照してください。

Azure Functionsでは、Python用の 2 つのプログラミング モデルがサポートされています。 バインドを定義する方法は、選択したプログラミング モデルによって異なります。

Python v2 プログラミング モデルを使用すると、Python関数コードでデコレーターを使用してバインドを直接定義できます。 詳細については、Python 開発者ガイドを参照してください。

この記事は、両方のプログラミング モデルをサポートしています。

トリガーの使用方法は、拡張機能パッケージのバージョンと、関数アプリで使用される C# のモダリティによって異なり、次のいずれかになります。

分離ワーカー プロセス クラス ライブラリでコンパイルされた C# 関数は、ランタイムから分離されたプロセスで実行されます。

次の例は、指定した C# モードの拡張機能のバージョンによって異なります。

この例では、アプリ設定の参照を使用し、エラー処理を含めます。 まず、モデルの種類を定義します。

public class ToDoItem
{
    public string? Id { get; set; }
    public string? Description { get; set; }
}

次の関数は、指定したデータベースとコンテナーで挿入または更新が行われるときに実行されます。

[Function("CosmosTrigger")]
public void Run([CosmosDBTrigger(
    databaseName: "%COSMOS_DATABASE_NAME%",
    containerName: "%COSMOS_CONTAINER_NAME%",
    Connection = "COSMOS_CONNECTION",
    LeaseContainerName = "leases",
    CreateLeaseContainerIfNotExists = true)] IReadOnlyList<ToDoItem> documents,
    FunctionContext context)
{
    if (documents is not null && documents.Any())
    {
        _logger.LogInformation("Documents modified: {count}", documents.Count);
        foreach (var doc in documents)
        {
            try
            {
                _logger.LogInformation("Processing document Id: {id}", doc.Id);
                // Add your business logic here
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "Error processing document {id}", doc.Id);
                // Continue processing remaining documents
            }
        }
    }
}

[Function("health")]
public IActionResult HealthCheck([HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "health")] HttpRequest req)
{
    return new OkResult();
}

前の例では、ハードコードされた値ではなく、アプリ設定の参照 (%VAR_NAME%) を使用しています。 構成の詳細については、インプロセス タブのアプリ設定とローカル開発ガイダンスを参照してください。

この関数は、指定したデータベースとコンテナーに挿入または更新がある場合に呼び出されます。

Azure Cosmos DB SDK でスキーマが変更されたため、Azure Cosmos DB拡張機能のバージョン 4.x には、Java関数の azure-functions-java-library V3.0.0 が必要です。

    @FunctionName("CosmosDBTriggerFunction")
    public void run(
        @CosmosDBTrigger(
            name = "items",
            databaseName = "ToDoList",
            containerName = "Items",
            leaseContainerName="leases",
            connection = "AzureCosmosDBConnection",
            createLeaseContainerIfNotExists = true
        )
        Object inputItem,
        final ExecutionContext context
    ) {
        context.getLogger().info("Items modified: " + inputItems.size());
    }

Java関数ランタイム ライブラリで、値がAzure Cosmos DBから取得されるパラメーターに対して @CosmosDBTrigger 注釈を使用します。 Optional<T>を使用して、ネイティブ Java型、プレーン old Java オブジェクト (POJO)、または null 許容値と共にこの注釈を使用します。

次の例は、Azure Cosmos DB トリガー TypeScript 関数を示しています。 この関数は、Azure Cosmos DBレコードが追加または変更されたときにログ メッセージを書き込みます。

import { app, InvocationContext } from '@azure/functions';

export async function cosmosDBTrigger1(documents: unknown[], context: InvocationContext): Promise<void> {
    context.log(`Cosmos DB function processed ${documents.length} documents`);
}

app.cosmosDB('cosmosDBTrigger1', {
    connection: '<connection-app-setting>',
    databaseName: 'Tasks',
    containerName: 'Items',
    createLeaseContainerIfNotExists: true,
    handler: cosmosDBTrigger1,
});

次の例は、Azure Cosmos DB トリガー JavaScript 関数を示しています。 この関数は、Azure Cosmos DBレコードが追加または変更されたときにログ メッセージを書き込みます。

const { app } = require('@azure/functions');

app.cosmosDB('cosmosDBTrigger1', {
    connection: '<connection-app-setting>',
    databaseName: 'Tasks',
    containerName: 'Items',
    createLeaseContainerIfNotExists: true,
    handler: (documents, context) => {
        context.log(`Cosmos DB function processed ${documents.length} documents`);
    },
});

次の例は、Azure Cosmos DBでデータの変更として関数を実行する方法を示しています。

{
    "type": "cosmosDBTrigger",
    "name": "documents",
    "direction": "in",
    "leaseCollectionName": "leases",
    "connectionStringSetting": "<connection-app-setting>",
    "databaseName": "Tasks",
    "collectionName": "Items",
    "createLeaseCollectionIfNotExists": true
}

バインド属性名の一部は、Azure Cosmos DB拡張機能のバージョン 4.x で変更されていることに注意してください。

run.ps1 ファイルで、$Documents パラメーターを使用して関数をトリガーするドキュメントにアクセスできます。

param($Documents, $TriggerMetadata) 

Write-Host "First document Id modified : $($Documents[0].id)" 

次の例は、Azure Cosmos DB トリガー バインドを示しています。 この例は、v1 または v2 のどちらのプログラミング モデルPythonを使用するかによって異なります。

import logging
import azure.functions as func

app = func.FunctionApp()

@app.function_name(name="CosmosDBTrigger")
@app.cosmos_db_trigger(arg_name="documents", 
                       database_name="%COSMOS_DATABASE_NAME%", 
                       container_name="%COSMOS_CONTAINER_NAME%",
                       connection="COSMOS_CONNECTION",
                       lease_container_name="leases",
                       create_lease_container_if_not_exists="true")
def cosmos_trigger(documents: func.DocumentList) -> str:
    if documents:
        for doc in documents:
            try:
                logging.info('Processing document id: %s', doc['id'])
                # Add your business logic here
            except Exception as e:
                logging.error('Error processing document %s: %s', doc.get('id', 'unknown'), str(e))
                # Continue processing remaining documents

@app.function_name(name="health")
@app.route(route="health", methods=["GET"])
def health_check(req: func.HttpRequest) -> func.HttpResponse:
    """Health check endpoint for monitoring."""
    return func.HttpResponse("OK", status_code=200)

前の例では、ハードコードされた値ではなく、アプリ設定の参照 (%VAR_NAME%) を使用しています。

アプリの設定

ID ベースの接続用に次のアプリケーション設定を構成します。

Setting 説明
COSMOS_DATABASE_NAME Azure Cosmos DB データベースの名前 my-database
COSMOS_CONTAINER_NAME 監視するコンテナーの名前 my-container
COSMOS_CONNECTION__accountEndpoint Azure Cosmos DB アカウント エンドポイント https://mycosmosdb.documents.azure.com:443/
COSMOS_CONNECTION__credential UAMI の managedidentity に設定 managedidentity
COSMOS_CONNECTION__clientId ユーザー割り当てマネージド ID のクライアント ID 00000000-0000-0000-0000-000000000000

ローカル開発

ローカル開発の場合は、 local.settings.json ファイルを作成します。

{
    "IsEncrypted": false,
    "Values": {
        "AzureWebJobsStorage": "UseDevelopmentStorage=true",
        "FUNCTIONS_WORKER_RUNTIME": "python",
        "COSMOS_DATABASE_NAME": "my-database",
        "COSMOS_CONTAINER_NAME": "my-container",
        "COSMOS_CONNECTION__accountEndpoint": "https://mycosmosdb.documents.azure.com:443/"
    }
}

ヒント

ローカル開発の場合は、 COSMOS_CONNECTION__credentialCOSMOS_CONNECTION__clientIdを省略します。 DefaultAzureCredentialは、Azure CLIログイン資格情報を含め、複数の資格情報を順番に試行します。

ローカル開発の前提条件:

属性

インプロセス分離プロセスの両方の C# ライブラリは、CosmosDBTriggerAttributeを使用して関数を定義します。 C# スクリプトでは、C# スクリプト ガイドで説明されているように、代わりに function.json 構成ファイルを使用します。

特定のプロパティは、プロセス モデルと拡張機能のバージョンの両方によって異なります。

分離されたワーカー プロセス ライブラリでは、Microsoft.Azure.Functions.Worker 名前空間の CosmosDBTriggerAttribute を使用します。これらのプロパティは次のとおりです。

属性のプロパティ 説明
接続 監視対象のAzure Cosmos DB アカウントに接続する方法を指定するアプリ設定または設定コレクションの名前。 詳細については、「接続」を参照してください。
DatabaseName 監視対象のコンテナーを含むAzure Cosmos DB データベースの名前。
ContainerName 監視対象のコンテナーの名前。
LeaseConnection (省略可能)リース コンテナーを保持するAzure Cosmos DB アカウントに接続する方法を指定するアプリ設定または設定コレクションの名前。

この値を設定しない場合、Connection という値が使用されます。 このパラメーターは、ポータルでバインドが作成されるときに自動で設定されます。 リース コンテナーの接続文字列には書き込みアクセス許可が必要です。
LeaseDatabaseName (省略可能) リースの格納に使用するコンテナーを保持するデータベースの名前。 この値を設定しない場合、databaseName の設定の値が使用されます。
LeaseContainerName (省略可能) リースの格納に使用するコンテナーの名前。 この値を設定しない場合、leases という値が使用されます。
CreateLeaseContainerIfNotExists (省略可能) true に設定すると、リース コンテナーが存在していない場合に自動的に作成します。 既定値は false です。 値を true に設定した場合、Microsoft Entra ID を使用する場合、コンテナーの作成は 許可された操作ではなく、関数を起動できません。
LeasesContainerThroughput (省略可能) リース コンテナーの作成時に割り当てる要求ユニットの数を定義します。 この設定は、CreateLeaseContainerIfNotExiststrue に設定されている場合のみ使用できます。 このパラメーターは、ポータルを使用してバインドを作成するときに自動的に設定されます。
LeaseContainerPrefix (省略可能) 設定すると、この関数のリース コンテナーで作成されたリースへのプレフィックスとして値が追加されます。 プレフィックスを使用すると、2 つの個別のAzure Functionsで、異なるプレフィックスを使用して同じリース コンテナーを共有できます。
FeedPollDelay (省略可能) 現在のすべての変更がドレインされた後、フィードの新しい変更についてパーティションをポーリングする間の遅延時間 (ミリ秒)。 既定値は 5,000 ミリ秒 (5 秒) です。
LeaseAcquireInterval (省略可能) 設定すると、パーティションが既知のホスト インスタンス間で均等に分散されているかどうかを計算するタスクを開始する間隔がミリ秒単位で定義されます。 既定値は 13,000 (13 秒) です。
LeaseExpirationInterval (省略可能) 設定すると、パーティションを表すリースでリースを取得する間隔がミリ秒単位で定義されます。 この間隔内にリースが更新されない場合、リースは期限切れとなり、パーティションの所有権は別のインスタンスに移動します。 既定値は 60,000 (60 秒) です。
LeaseRenewInterval (省略可能) 設定すると、インスタンスが現在保持しているパーティションのすべてのリースの更新間隔がミリ秒単位で定義されます。 既定値は 17,000 (17 秒) です。
MaxItemsPerInvocation (省略可能) 設定すると、関数呼び出しごとに、受信するアイテムの最大数がこのプロパティによって設定されます。 ストアド プロシージャを使って監視対象コンテナーの操作を実行した場合、変更フィードから項目を読み取るときにトランザクション スコープは保持されます。 その結果、受信した項目数が指定した値よりも多くなり、同じトランザクションで変更された項目が 1 つのアトミック バッチの一部として返される可能性があります。
StartFromBeginning (省略可能) このオプションを指定すると、現在の時刻から開始するのではなく、コンテナーの変更履歴の先頭から変更を読み取るようにトリガーに指示できます。 以降の実行ではチェックポイントが既に保存されているため、先頭からの読み取りが機能するのは、トリガーが初めて開始されたときのみです。 既にリースが作成されているときにこのオプションを true に設定しても効果はありません。
StartFromTime (省略可能) 変更フィードの読み取り操作を初期化する日時を取得または設定します。 推奨される形式は、2021-02-16T14:19:29Z のように、UTC 指定子を使った ISO 8601 です。 これは、最初のトリガー状態を設定するためにのみ使われます。 トリガーがリース状態になった後にこの値を変更しても効果はありません。
PreferredLocations (省略可能)Azure Cosmos DB サービス内の geo レプリケートされたデータベース アカウントの優先する場所 (リージョン) を定義します。 複数の値はコンマで区切る必要があります。 たとえば、"East US,South Central US,North Europe" などです。

デコレータ

Python v2 プログラミング モデルにのみ適用されます。

デコレーターを使用して定義Python v2 関数の場合、cosmos_db_trigger (Extension 4.x) は次のプロパティをサポートします。

プロパティ 説明
arg_name 変更されるドキュメントの一覧を表す、関数コードで使用する変数の名前。
database_name Azure Cosmos DB データベースの名前。 アプリ設定を参照するための %VAR_NAME% 構文をサポートします。
container_name 監視対象のAzure Cosmos DB コンテナーの名前。 %VAR_NAME%構文をサポートします。
connection ID ベースの接続のアプリ設定または設定プレフィックスの名前 (たとえば、 COSMOS_CONNECTIONCOSMOS_CONNECTION__accountEndpointに解決されます)。
lease_container_name リースの格納に使用されるコンテナーの名前。
create_lease_container_if_not_exists trueすると、リース コンテナーが存在しない場合は自動的に作成されます。

function.json を使用して定義Python関数については、「Configuration」セクションを参照してください。

注釈

Azure Cosmos DB SDK でスキーマが変更されたため、Azure Cosmos DB拡張機能のバージョン 4.x には、Java関数の azure-functions-java-library V3.0.0 が必要です。

Azure Cosmos DBからデータを読み取るパラメーターには、@CosmosDBTrigger注釈を使用します。 この注釈では、次のプロパティがサポートされます。

属性のプロパティ 説明
connection 監視対象のAzure Cosmos DB アカウントに接続する方法を指定するアプリ設定または設定コレクションの名前。 詳細については、「接続」を参照してください。
name 関数の名前です。
databaseName 監視対象のコンテナーを含むAzure Cosmos DB データベースの名前。
containerName 監視対象のコンテナーの名前。
leaseConnectionStringSetting (省略可能)リース コンテナーを保持するAzure Cosmos DB アカウントに接続する方法を指定するアプリ設定または設定コレクションの名前。

この値を設定しない場合、Connection という値が使用されます。 このパラメーターは、ポータルでバインドが作成されるときに自動で設定されます。 リース コンテナーの接続文字列には書き込みアクセス許可が必要です。
leaseDatabaseName (省略可能) リースの格納に使用するコンテナーを保持するデータベースの名前。 この値を設定しない場合、databaseName の設定の値が使用されます。
leaseContainerName (省略可能) リースの格納に使用するコンテナーの名前。 この値を設定しない場合、leases という値が使用されます。
createLeaseContainerIfNotExists (省略可能) true に設定すると、リース コンテナーが存在していない場合に自動的に作成します。 既定値は false です。 値を true に設定した場合、Microsoft Entra ID を使用する場合、コンテナーの作成は許可される操作ではなく、関数アプリの起動が許可されません。
leasesContainerThroughput (省略可能) リース コンテナーの作成時に割り当てる要求ユニットの数を定義します。 この設定は、CreateLeaseContainerIfNotExiststrue に設定されている場合のみ使用できます。 このパラメーターは、ポータルを使用してバインドを作成するときに自動的に設定されます。
leaseContainerPrefix (省略可能) 設定すると、この関数のリース コンテナーで作成されたリースへのプレフィックスとして値が追加されます。 プレフィックスを使用すると、2 つの個別のAzure Functionsで、異なるプレフィックスを使用して同じリース コンテナーを共有できます。
feedPollDelay (省略可能) 現在のすべての変更がドレインされた後、フィードの新しい変更についてパーティションをポーリングする間の遅延時間 (ミリ秒)。 既定値は 5,000 ミリ秒 (5 秒) です。
leaseAcquireInterval (省略可能) 設定すると、パーティションが既知のホスト インスタンス間で均等に分散されているかどうかを計算するタスクを開始する間隔がミリ秒単位で定義されます。 既定値は 13,000 (13 秒) です。
leaseExpirationInterval (省略可能) 設定すると、パーティションを表すリースでリースを取得する間隔がミリ秒単位で定義されます。 この期間内にリースが更新されない場合、リースは期限切れになり、パーティションの所有権は別のインスタンスに移動します。 既定値は 60,000 (60 秒) です。
leaseRenewInterval (省略可能)設定すると、インスタンスによって現在保持されているパーティションのすべてのリースの更新間隔がミリ秒単位で定義されます。 既定値は 17,000 (17 秒) です。
maxItemsPerInvocation (省略可能) 設定すると、関数呼び出しごとに、受信するアイテムの最大数がこのプロパティによって設定されます。 ストアド プロシージャを使って監視対象コンテナーの操作を実行した場合、変更フィードから項目を読み取るときにトランザクション スコープは保持されます。 その結果、受信した項目数が指定した値よりも多くなり、同じトランザクションで変更された項目が 1 つのアトミック バッチの一部として返される可能性があります。
startFromBeginning (省略可能) このオプションを指定すると、現在の時刻から開始するのではなく、コンテナーの変更履歴の先頭から変更を読み取るようにトリガーに指示できます。 以降の実行ではチェックポイントが既に保存されているため、先頭からの読み取りが機能するのは、トリガーが初めて開始されたときのみです。 既にリースが作成されているときにこのオプションを true に設定しても効果はありません。
preferredLocations (省略可能)Azure Cosmos DB サービス内の geo レプリケートされたデータベース アカウントの優先する場所 (リージョン) を定義します。 複数の値はコンマで区切る必要があります。 たとえば、「 East US,South Central US,North Europe 」のように入力します。

構成

Python v1 プログラミング モデルにのみ適用されます。

次の表では、app.cosmosDB() メソッドに渡すoptions オブジェクトに設定できるプロパティについて説明します。 typedirectionname の各プロパティは v4 モデルには適用されません。

次の表では、function.json ファイルで設定するバインド構成のプロパティについて説明します。これらのプロパティは、拡張機能バージョンによって異なります。

function.json のプロパティ 説明
type cosmosDBTrigger に設定する必要があります。
direction in に設定する必要があります。 このパラメーターは、Azure ポータルでトリガーを作成するときに自動的に設定されます。
name 変更されるドキュメントの一覧を表す、関数コードで使用する変数の名前。
connection 監視対象のAzure Cosmos DB アカウントに接続する方法を指定するアプリ設定または設定コレクションの名前。 詳細については、「接続」を参照してください。
databaseName 監視対象のコンテナーを含むAzure Cosmos DB データベースの名前。
containerName 監視対象のコンテナーの名前。
leaseConnection (省略可能)リース コンテナーを保持するAzure Cosmos DB アカウントに接続する方法を指定するアプリ設定または設定コンテナーの名前。

この値を設定しない場合、connection という値が使用されます。 このパラメーターは、ポータルでバインドが作成されるときに自動で設定されます。 リース コンテナーの接続文字列には書き込みアクセス許可が必要です。
leaseDatabaseName (省略可能) リースの格納に使用するコンテナーを保持するデータベースの名前。 この値を設定しない場合、databaseName の設定の値が使用されます。
leaseContainerName (省略可能) リースの格納に使用するコンテナーの名前。 この値を設定しない場合、leases という値が使用されます。
createLeaseContainerIfNotExists (省略可能) true に設定すると、リース コンテナーが存在していない場合に自動的に作成します。 既定値は false です。 値を true に設定した場合、Microsoft Entra ID を使用する場合、コンテナーの作成は 許可された操作ではなく、関数を起動できません。
leasesContainerThroughput (省略可能) リース コンテナーの作成時に割り当てる要求ユニットの数を定義します。 この設定は、createLeaseContainerIfNotExiststrue に設定されている場合のみ使用できます。 このパラメーターは、ポータルを使用してバインドを作成するときに自動的に設定されます。
leaseContainerPrefix (省略可能) 設定すると、この関数のリース コンテナーで作成されたリースへのプレフィックスとして値が追加されます。 プレフィックスを使用すると、2 つの個別のAzure Functionsで、異なるプレフィックスを使用して同じリース コンテナーを共有できます。
feedPollDelay (省略可能) 現在のすべての変更がドレインされた後、フィードの新しい変更についてパーティションをポーリングする間の遅延時間 (ミリ秒)。 既定値は 5,000 ミリ秒 (5 秒) です。
leaseAcquireInterval (省略可能) 設定すると、パーティションが既知のホスト インスタンス間で均等に分散されているかどうかを計算するタスクを開始する間隔がミリ秒単位で定義されます。 既定値は 13,000 (13 秒) です。
leaseExpirationInterval (省略可能) 設定すると、パーティションを表すリースでリースを取得する間隔がミリ秒単位で定義されます。 この間隔内にリースが更新されない場合、リースは期限切れとなり、パーティションの所有権は別のインスタンスに移動します。 既定値は 60,000 (60 秒) です。
leaseRenewInterval (省略可能) 設定すると、インスタンスが現在保持しているパーティションのすべてのリースの更新間隔がミリ秒単位で定義されます。 既定値は 17,000 (17 秒) です。
maxItemsPerInvocation (省略可能) 設定すると、関数呼び出しごとに、受信するアイテムの最大数がこのプロパティによって設定されます。 ストアド プロシージャを使って監視対象コンテナーの操作を実行した場合、変更フィードから項目を読み取るときにトランザクション スコープは保持されます。 その結果、受信した項目数が指定した値よりも多くなり、同じトランザクションで変更された項目が 1 つのアトミック バッチの一部として返される可能性があります。
startFromBeginning (省略可能) このオプションを指定すると、現在の時刻から開始するのではなく、コンテナーの変更履歴の先頭から変更を読み取るようにトリガーに指示できます。 以降の実行ではチェックポイントが既に保存されているため、先頭からの読み取りが機能するのは、トリガーが初めて開始されたときのみです。 既にリースが作成されているときにこのオプションを true に設定しても効果はありません。
startFromTime (省略可能) 変更フィードの読み取り操作を初期化する日時を取得または設定します。 推奨される形式は、2021-02-16T14:19:29Z のように、UTC 指定子を使った ISO 8601 です。 これは、最初のトリガー状態を設定するためにのみ使われます。 トリガーがリース状態になった後にこの値を変更しても効果はありません。
preferredLocations (省略可能)Azure Cosmos DB サービス内の geo レプリケートされたデータベース アカウントの優先する場所 (リージョン) を定義します。 複数の値はコンマで区切る必要があります。 たとえば、"East US,South Central US,North Europe" などです。

完全な例については、「例」 セクションを参照してください。

使用法

トリガーは、パーティションに リース を保存するために使用する 2 つ目のコレクションを必要とします。 トリガーは、監視しているコレクションとリースを含むコレクションの両方が使用可能な場合にのみ機能します。

重要

同じコレクションに対して Azure Cosmos DB トリガーを使用するように複数の関数を構成する場合、各関数は専用のリース コレクションを使用するか、関数ごとに異なる LeaseCollectionPrefixを指定する必要があります。 それ以外の場合は、関数のうち 1 つのみがトリガーされます。 プレフィックスの詳細については、「属性」セクションを参照してください。

重要

同じコレクションに対して Azure Cosmos DB トリガーを使用するように複数の関数を構成する場合、各関数は専用のリース コレクションを使用するか、関数ごとに異なる leaseCollectionPrefixを指定する必要があります。 それ以外の場合は、関数のうち 1 つのみがトリガーされます。 プレフィックスの詳細については、「注釈」セクションを参照してください。

重要

同じコレクションに対して Azure Cosmos DB トリガーを使用するように複数の関数を構成する場合、各関数は専用のリース コレクションを使用するか、関数ごとに異なる leaseCollectionPrefixを指定する必要があります。 それ以外の場合は、関数のうち 1 つのみがトリガーされます。 プレフィックスの詳細については、「構成」セクションを参照してください。

トリガーは、ドキュメントが更新されたか挿入されたかを示しません。 ドキュメント自体を提供するだけです。 更新と挿入を異なる方法で処理する必要がある場合は、挿入または更新用のタイムスタンプ フィールドを実装します。

Azure Cosmos DB トリガーでサポートされるパラメーターの種類は、Functions ランタイムのバージョン、拡張機能パッケージのバージョン、使用される C# モダリティによって異なります。

関数で 1 つのドキュメントを処理するとき、Cosmos DB トリガーは次の型にバインドできます。

タイプ 説明
JSON シリアル化可能な型 Functions は、ドキュメントの JSON データを Cosmos DB 変更フィードから単純な従来の CLR オブジェクト (POCO) 型に逆シリアル化しようとします。

関数でドキュメントのバッチを処理するとき、Cosmos DB トリガーは次の型にバインドできます。

タイプ 説明
IEnumerable<T> (T は JSON シリアル化可能な型) バッチに含まれるエンティティの列挙型。 各エントリは、Cosmos DB 変更フィードの 1 つのドキュメントを表します。

接続

connectionStringSetting / connection および leaseConnectionStringSetting/leaseConnection プロパティは、アプリがAzure Cosmos DBに接続する方法を指定する環境構成を参照します。 次を指定できます。

  • 接続文字列を含むアプリケーション設定の名前。
  • マネージド ID 接続を定義する複数のアプリケーション設定の共有プレフィックスの名前。 このオプションは、connectionconnection および バージョンでのみ使用できます。

構成された値が、1 つの設定に完全一致し、プレフィックスがその他の設定とも一致する場合は、完全一致が使用されます。

ヒント

セキュリティを強化するために、接続文字列よりもマネージド ID 接続をお勧めします。 接続文字列には公開できる資格情報が含まれますが、マネージド ID ではシークレットを管理する必要がなくなります。

バージョン 4.x 以上の拡張機能を使用している場合は、シークレットで接続文字列を使用する代わりに、アプリで Microsoft Entra ID を使用できます。 これを行うには、トリガーとバインドの構成の接続プロパティにマップされる共通のプレフィックスで設定を定義します。

このモードでは、拡張機能には次のアプリケーション設定が必要です。

テンプレートベースの設定 説明 IDの種類
<CONNECTION_NAME_PREFIX>__accountEndpoint Azure Cosmos DB アカウント エンドポイント URI。 システム割り当てまたはユーザー割り当て
<CONNECTION_NAME_PREFIX>__credential managedidentity に設定する必要があります。 ユーザーによって割り当てられた
<CONNECTION_NAME_PREFIX>__clientId ユーザー割り当てマネージド ID のクライアント ID ユーザーによって割り当てられた

<CONNECTION_NAME_PREFIX>に置き換える値は、バインド拡張機能によって接続設定の名前として扱われます。

たとえば、バインド構成でユーザー割り当てマネージド ID を持つ connection = "CosmosDBConnection" を指定する場合は、次のアプリケーション設定を構成します。

{
    "CosmosDBConnection__accountEndpoint": "https://mycosmosdb.documents.azure.com:443/",
    "CosmosDBConnection__credential": "managedidentity",
    "CosmosDBConnection__clientId": "00000000-0000-0000-0000-000000000000"
}

ヒント

複数のリソースにわたる ID アクセス許可をきめ細かく制御する必要がある運用シナリオでは、ユーザー割り当てマネージド ID を使用します。

テンプレートの追加設定を使用して、接続をさらにカスタマイズできます。 「ID ベース接続に共通のプロパティ」を参照してください。

Azure Functions サービスでホストされている場合、ID ベースの接続では、管理 ID が使用されます。 ユーザー割り当て ID を credential および clientID プロパティで指定できますが、システム割り当て ID が既定で使用されます。 リソース ID を使用したユーザー割り当て ID の構成はサポートされていないことに注意してください。 ローカル開発などの他のコンテキストで実行する場合は、代わりに開発者 ID が使用されますが、カスタマイズすることもできます。 ID ベースの接続によるローカル開発に関するページをご覧ください。

ID にアクセス許可を付与する

使用されている ID が何であれ、目的のアクションを実行するためのアクセス許可が必要です。 ほとんどのAzure サービスでは、これらのアクセス許可を提供する組み込みロールまたはカスタム ロールを使用して、Azure RBAC でロールを割り当てする必要があります。

重要

すべてのコンテキストに必要ではない一部のアクセス許可がターゲット サービスによって公開される場合があります。 可能であれば、最小限の特権の原則に従い、必要な特権だけを ID に付与します。 たとえば、アプリがデータ ソースからの読み取りのみを行う必要がある場合は、読み取りアクセス許可のみを持つロールを使用します。 サービスへの書き込みも可能なロールを割り当てることは、読み取り操作に対するアクセス許可が過剰になるため、不適切です。 同様に、ロールの割り当てが、読み取る必要のあるリソースだけに限定されていることを確認する必要があります。

Cosmos DB では、データ操作に Azure RBAC は使用されません。 代わりに、同様の概念に基づいて構築された Cosmos DB の組み込み RBAC システムが使われます。 実行時にデータベース アカウントへのアクセスを提供するロールの割り当てを作成する必要があります。 Owner などの RBAC 管理ロールAzureでは不十分です。 次の表に、通常の操作でAzure Cosmos DB拡張機能を使用する場合に推奨される組み込みロールを示します。 アプリケーションでは、記述したコードに基づいて追加のアクセス許可が必要になる場合があります。

[バインドの種類] 組み込みロールの例 1
トリガー 2 Cosmos DB 組み込みデータ共同作成者
入力バインド Cosmos DB 組み込みデータ リーダー
出力バインド Cosmos DB 組み込みデータ共同作成者

1 これらのロールは、Azure RBAC ロールの割り当てでは使用できません。 これらのロールの割り当て方法について詳しくは、Cosmos DB の組み込み RBAC システムに関するドキュメントをご覧ください。

2 ID を使うと、Cosmos DB はコンテナーの作成を管理操作として扱います。 トリガーのデータ プレーン操作としては使用できません。 関数を設定する前に、トリガーで必要なコンテナー (リース コンテナーを含む) を作成する必要があります。

次のステップ