Azure Functions 2.x 以降のAzure Cosmos DB出力バインド

Azure Cosmos DB出力バインドを使用すると、SQL API を使用してAzure Cosmos DB データベースに新しいドキュメントを書き込みます。

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

重要

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

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

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

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

A C# 関数は、次の C# モードのいずれかを使用して作成できます。

  • 分離されたワーカー モデル: ランタイムから分離されたワーカー プロセスで実行されるコンパイル済みの C# 関数。 分離ワーカー プロセスは、.NETおよび .NET Framework の LTS および LTS 以外のバージョンで実行されている C# 関数をサポートするために必要です。 分離ワーカー プロセス関数の拡張機能では、Microsoft.Azure.Functions.Worker.Extensions.* 名前空間が使用されます。
  • インプロセス モデル: Functions ランタイムと同じプロセスで実行されるコンパイル済みの C# 関数。 このモデルの一部では、主に C# ポータルの編集のためにサポートされている C# スクリプトを使用して Functions を実行できます。 インプロセス関数の拡張機能では、Microsoft.Azure.WebJobs.Extensions.* 名前空間を使用します。

例

特に明記されていない限り、この記事の例では、Azure Cosmos DB 拡張機能のバージョン 3.x を対象とします。 拡張機能バージョン 4.x で使用するには、プロパティ名と属性名の文字列 collection を container に置き換え、 connection_string_setting を connectionに置き換える必要があります。

このバインドに関しては現在、Goのサポートは利用できません。

次のコードでは、MyDocument 型を定義しています。

次の例では、戻り値の型は IReadOnlyList<T> です。これは、トリガー バインディング パラメーターからのドキュメントの変更された一覧です。

キュー トリガー、戻り値を使用したメッセージのデータベースへの保存

次の例は、キュー ストレージ内のメッセージからのデータを含むドキュメントをデータベースに追加するJava関数を示しています。

@FunctionName("getItem")
@CosmosDBOutput(name = "database",
  databaseName = "ToDoList",
  collectionName = "Items",
  connectionStringSetting = "AzureCosmosDBConnection")
public String cosmosDbQueryById(
    @QueueTrigger(name = "msg",
      queueName = "myqueue-items",
      connection = "AzureWebJobsStorage")
    String message,
    final ExecutionContext context)  {
     return "{ id: \"" + System.currentTimeMillis() + "\", Description: " + message + " }";
   }

HTTP トリガー、戻り値を使用した 1 つのドキュメントのデータベースへの保存

次の例は、シグネチャに @CosmosDBOutput で注釈を付け、String 型の戻り値を持つJava関数を示しています。 関数によって返された JSON ドキュメントは、対応するAzure Cosmos DB コレクションに自動的に書き込まれます。

    @FunctionName("WriteOneDoc")
    @CosmosDBOutput(name = "database",
      databaseName = "ToDoList",
      collectionName = "Items",
      connectionStringSetting = "Cosmos_DB_Connection_String")
    public String run(
            @HttpTrigger(name = "req",
              methods = {HttpMethod.GET, HttpMethod.POST},
              authLevel = AuthorizationLevel.ANONYMOUS)
            HttpRequestMessage<Optional<String>> request,
            final ExecutionContext context) {

        // Item list
        context.getLogger().info("Parameters are: " + request.getQueryParameters());

        // Parse query parameter
        String query = request.getQueryParameters().get("desc");
        String name = request.getBody().orElse(query);

        // Generate random ID
        final int id = Math.abs(new Random().nextInt());

        // Generate document
        final String jsonDocument = "{\"id\":\"" + id + "\", " +
                                    "\"description\": \"" + name + "\"}";

        context.getLogger().info("Document to be saved: " + jsonDocument);

        return jsonDocument;
    }

HTTP トリガー、OutputBinding を使用した 1 つのドキュメントのデータベースへの保存

次の例は、OutputBinding<T> 出力パラメーターを使用してAzure Cosmos DBするドキュメントを書き込むJava関数を示しています。 この例では、outputItem パラメーターに関数シグネチャではなく @CosmosDBOutput の注釈を付ける必要があります。 OutputBinding<T> を使用すると、関数はバインドを利用してドキュメントをAzure Cosmos DBに書き込み、JSON や XML ドキュメントなどの別の値を関数の呼び出し元に返すことができます。

    @FunctionName("WriteOneDocOutputBinding")
    public HttpResponseMessage run(
            @HttpTrigger(name = "req",
              methods = {HttpMethod.GET, HttpMethod.POST},
              authLevel = AuthorizationLevel.ANONYMOUS)
            HttpRequestMessage<Optional<String>> request,
            @CosmosDBOutput(name = "database",
              databaseName = "ToDoList",
              collectionName = "Items",
              connectionStringSetting = "Cosmos_DB_Connection_String")
            OutputBinding<String> outputItem,
            final ExecutionContext context) {

        // Parse query parameter
        String query = request.getQueryParameters().get("desc");
        String name = request.getBody().orElse(query);

        // Item list
        context.getLogger().info("Parameters are: " + request.getQueryParameters());

        // Generate random ID
        final int id = Math.abs(new Random().nextInt());

        // Generate document
        final String jsonDocument = "{\"id\":\"" + id + "\", " +
                                    "\"description\": \"" + name + "\"}";

        context.getLogger().info("Document to be saved: " + jsonDocument);

        // Set outputItem's value to the JSON document to be saved
        outputItem.setValue(jsonDocument);

        // return a different document to the browser or calling client.
        return request.createResponseBuilder(HttpStatus.OK)
                      .body("Document created successfully.")
                      .build();
    }

HTTP トリガー、OutputBinding を使用した複数のドキュメントのデータベースへの保存

次の例は、OutputBinding<T> 出力パラメーターを使用して複数のドキュメントをAzure Cosmos DBに書き込むJava関数を示しています。 この例では、outputItem パラメーターには関数シグネチャではなく @CosmosDBOutput の注釈が付けられています。 出力パラメーター outputItem には、そのテンプレート パラメーターの型として ToDoItem オブジェクトの一覧が含まれています。 OutputBinding<T> を使用すると、バインドを利用してドキュメントをAzure Cosmos DBに書き込み、JSON や XML ドキュメントなどの別の値を関数の呼び出し元に返すことができます。

    @FunctionName("WriteMultipleDocsOutputBinding")
    public HttpResponseMessage run(
            @HttpTrigger(name = "req",
              methods = {HttpMethod.GET, HttpMethod.POST},
              authLevel = AuthorizationLevel.ANONYMOUS)
            HttpRequestMessage<Optional<String>> request,
            @CosmosDBOutput(name = "database",
              databaseName = "ToDoList",
              collectionName = "Items",
              connectionStringSetting = "Cosmos_DB_Connection_String")
            OutputBinding<List<ToDoItem>> outputItem,
            final ExecutionContext context) {

        // Parse query parameter
        String query = request.getQueryParameters().get("desc");
        String name = request.getBody().orElse(query);

        // Item list
        context.getLogger().info("Parameters are: " + request.getQueryParameters());

        // Generate documents
        List<ToDoItem> items = new ArrayList<>();

        for (int i = 0; i < 5; i ++) {
          // Generate random ID
          final int id = Math.abs(new Random().nextInt());

          // Create ToDoItem
          ToDoItem item = new ToDoItem(String.valueOf(id), name);

          items.add(item);
        }

        // Set outputItem's value to the list of POJOs to be saved
        outputItem.setValue(items);
        context.getLogger().info("Document to be saved: " + items);

        // return a different document to the browser or calling client.
        return request.createResponseBuilder(HttpStatus.OK)
                      .body("Documents created successfully.")
                      .build();
    }

Java関数ランタイム ライブラリで、Azure Cosmos DBに書き込まれるパラメーターに対して @CosmosDBOutput 注釈を使用します。 注釈パラメーターの型は OutputBinding<T> にする必要があります。ここで、T はネイティブ Java型または POJO のいずれかです。

次の例は、次の形式で JSON を受信するキューの、ストレージ キューによってトリガーされる TypeScript 関数を示しています。

{
    "name": "John Henry",
    "employeeId": "123456",
    "address": "A town nearby"
}

この関数は、レコードごとに次の形式でAzure Cosmos DBドキュメントを作成します。

{
    "id": "John Henry-123456",
    "name": "John Henry",
    "employeeId": "123456",
    "address": "A town nearby"
}

TypeScript コードを次に示します。

複数のドキュメントを出力するには、1 つのオブジェクトではなく配列を返します。 次に例を示します。

次の例は、次の形式で JSON を受信するキューの、ストレージ キューによってトリガーされる JavaScript 関数を示しています。

{
    "name": "John Henry",
    "employeeId": "123456",
    "address": "A town nearby"
}

この関数は、レコードごとに次の形式でAzure Cosmos DBドキュメントを作成します。

{
    "id": "John Henry-123456",
    "name": "John Henry",
    "employeeId": "123456",
    "address": "A town nearby"
}

JavaScript コードを次に示します。

複数のドキュメントを出力するには、1 つのオブジェクトではなく配列を返します。 次に例を示します。

次の例は、出力バインドを使用してAzure Cosmos DBにデータを書き込む方法を示しています。 バインドは、関数の構成ファイル (functions.json) で宣言され、キュー メッセージからデータを受け取り、Azure Cosmos DB ドキュメントに書き出します。

{ 
  "name": "EmployeeDocument",
  "type": "cosmosDB",
  "databaseName": "MyDatabase",
  "collectionName": "MyCollection",
  "createIfNotExists": true,
  "connectionStringSetting": "MyStorageConnectionAppSetting",
  "direction": "out" 
} 

run.ps1 ファイルで、関数から返されるオブジェクトは、データベース内で保持されている EmployeeDocument オブジェクトにマップされます。

param($QueueItem, $TriggerMetadata) 

Push-OutputBinding -Name EmployeeDocument -Value @{ 
    id = $QueueItem.name + '-' + $QueueItem.employeeId 
    name = $QueueItem.name 
    employeeId = $QueueItem.employeeId 
    address = $QueueItem.address 
} 

次の例では、関数の出力としてドキュメントを Azure Cosmos DB データベースに書き込む方法を示します。 この例は、v1 または v2 のどちらのプログラミング モデルPythonを使用するかによって異なります。

import logging
import azure.functions as func

app = func.FunctionApp()

@app.route()
@app.cosmos_db_output(arg_name="documents", 
                      database_name="DB_NAME",
                      collection_name="COLLECTION_NAME",
                      create_if_not_exists=True,
                      connection_string_setting="CONNECTION_SETTING")
def main(req: func.HttpRequest, documents: func.Out[func.Document]) -> func.HttpResponse:
    request_body = req.get_body()
    documents.set(func.Document.from_json(request_body))
    return 'OK'

属性

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

属性のプロパティ 説明
接続 監視対象のAzure Cosmos DB アカウントに接続する方法を指定するアプリ設定または設定コレクションの名前。 詳細については、「接続」を参照してください。
DatabaseName 監視対象のコンテナーを含むAzure Cosmos DB データベースの名前。
ContainerName 監視対象のコンテナーの名前。
CreateIfNotExists コンテナーが存在しない場合に作成するかどうかを示すブール値。 新しいコンテナーは予約されたスループットで作成され、それがコストに影響を与えるため、既定値は false です。 詳細については、 価格に関するページを参照してください。
PartitionKey CreateIfNotExists が true の場合は、作成されるコンテナーのパーティション キーのパスを定義します。 バインディング パラメーターを含めることもできます。
ContainerThroughput CreateIfNotExists が true の場合は、作成されるコンテナーのスループットを定義します。
PreferredLocations (省略可能)Azure Cosmos DB サービス内の geo レプリケートされたデータベース アカウントの優先する場所 (リージョン) を定義します。 複数の値はコンマで区切る必要があります。 たとえば、East US,South Central US,North Europe のようにします。

デコレータ

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

デコレーターを使用して定義Python v2 関数の場合、cosmos_db_outputの次のプロパティ。

プロパティ 説明
arg_name 変更されるドキュメントの一覧を表す、関数コードで使用する変数の名前。
database_name 監視対象のコンテナーを含むAzure Cosmos DB データベースの名前。
container_name 監視対象のAzure Cosmos DB コンテナーの名前。
create_if_not_exists データベースとコレクションが存在しない場合に作成する必要があるかどうかを示すブール値。
connection_string_setting 監視対象のAzure Cosmos DBの接続文字列。

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

注釈

Java関数ランタイム ライブラリ から、Azure Cosmos DBに書き込むパラメーターに対して @CosmosDBOutput 注釈を使用します。 この注釈では、次のプロパティがサポートされます。

構成

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

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

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

function.json のプロパティ 説明
接続 監視対象のAzure Cosmos DB アカウントに接続する方法を指定するアプリ設定または設定コレクションの名前。 詳細については、「接続」を参照してください。
databaseName 監視対象のコンテナーを含むAzure Cosmos DB データベースの名前。
containerName 監視対象のコンテナーの名前。
createIfNotExists コンテナーが存在しない場合に作成するかどうかを示すブール値。 新しいコンテナーは予約されたスループットで作成され、それがコストに影響を与えるため、既定値は false です。 詳細については、 価格に関するページを参照してください。
partitionKey createIfNotExists が true の場合は、作成されるコンテナーのパーティション キーのパスを定義します。 バインディング パラメーターを含めることもできます。
containerThroughput createIfNotExists が true の場合は、作成されるコンテナーのスループットを定義します。
preferredLocations (省略可能)Azure Cosmos DB サービス内の geo レプリケートされたデータベース アカウントの優先する場所 (リージョン) を定義します。 複数の値はコンマで区切る必要があります。 たとえば、East US,South Central US,North Europe のようにします。

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

使用法

既定では、関数の出力パラメーターに書き込むと、ドキュメントがデータベースに作成されます。 出力パラメーターに渡される JSON オブジェクトで id プロパティを指定することにより、出力ドキュメントのドキュメント ID を指定する必要があります。

注

既存のドキュメントの ID を指定した場合、既存のドキュメントは新しい出力ドキュメントによって上書きされます。

出力関数パラメーターは、 func.Out[func.Document]として定義する必要があります。 詳細については、 出力例 を参照してください。

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

関数で 1 つのドキュメントに書き込む場合、Cosmos DB の出力バインドは次の型にバインドできます。

タイプ 説明
JSON シリアル化可能な型 ドキュメントの JSON コンテンツを表すオブジェクト。 Functions は、単純な従来の CLR オブジェクト (POCO) 型を JSON データにシリアル化しようとします。

関数で複数のドキュメントに書き込む場合、Cosmos DB の出力バインドは次の型にバインドできます。

タイプ 説明
T[] (T は JSON シリアル化可能な型) 複数のドキュメントを含む配列。 各エントリは 1 つのドキュメントを表します。

その他の出力シナリオでは、CosmosClient を作成し、Microsoft.Azure の他の型と共に使用します。Cosmos 直接。 依存関係の挿入を使用してAzure SDKからクライアントの種類を作成する例については、「クライアントをAzure登録する」を参照してください。

接続

connectionおよびleaseConnectionプロパティはアプリケーション設定内のキーに設定されており、Functionsランタイムが拡張機能で使うAzure Cosmos DBアカウントエンドポイントに接続するために使う値を返します。 これらのプロパティ設定の価値は、接続の種類によって異なります:

  • マネージドアイデンティティ接続: connection プロパティは複数の設定で共有される一つの <CONNECTION_NAME_PREFIX> であり、それらが共にアカウントへのアイデンティティベースの接続を定義します。 詳細については、「 同一性接続の定義」を参照してください。
  • Key Vault参照:connectionプロパティ設定は、接続文字列が中央管理されている場所への参照Azure Key Vaultを返します。 詳細については、「Key Vault connectionsの定義」をご覧ください。
  • App Configuration reference:connectionプロパティ設定は接続文字列またはKey Vault参照を返すAzure App Configuration参照を返します。 詳細については、接続記事のAzure App Configurationをご覧ください。
  • Connection string:connectionプロパティ設定は実際のアカウント接続文字列を返します。 接続文字列には共有の秘密鍵が含まれているため、可能であれば管理型アイデンティティ接続の使用を検討すべきです。 詳細については、「 接続の定義」を参照してください。

バインディング接続について詳しく知りたい方は、Azure Functionsの「Manage connection in Connection」をご覧ください。 接続文字列を取得するには、Azure Cosmos DBアカウントにアクセスし、Keysを選択し、PRIMARY CONNECTION STRINGまたはSECONDARY CONNECTION STRINGの値をコピーしてください。 これらの接続文字列には共有の秘密鍵が含まれており、安全に保たなければなりません。

拡張の初期バージョンでは、接続プロパティは connectionStringSetting と leaseConnectionStringSettingと呼ばれていました。

例外とリターン コード

バインド リファレンス
Azure Cosmos DB Azure Cosmos DB

次のステップ