次の方法で共有


Azure Functions 用の Azure Data Explorer 出力バインド (プレビュー)

関数が実行されると、Azure Data Explorer 出力バインドによって Azure Data Explorer にデータが取り込まれます。

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

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

  • 分離されたワーカー モデル: ランタイムから分離されたワーカー プロセスで実行されるコンパイル済みの C# 関数。 分離ワーカー プロセスは、LTS および 非 LTS バージョンの .NET および .NET Framework で実行されている C# 関数をサポートするために必要です。
  • インプロセス モデル: Functions ランタイムと同じプロセスで実行されるコンパイル済みの C# 関数。
  • C# スクリプト: Azure portal で C# 関数を作成するときに主に使用されます。

Azure Data Explorer 出力バインドのその他のサンプルが、GitHub リポジトリで入手できます。

このセクションには、次の例が含まれています。

この例では Product クラスとそれに対応するデータベース テーブルを参照します。

public class Product
{
    [JsonProperty(nameof(ProductID))]
    public long ProductID { get; set; }

    [JsonProperty(nameof(Name))]
    public string Name { get; set; }

    [JsonProperty(nameof(Cost))]
    public double Cost { get; set; }
}
.create-merge table Products (ProductID:long, Name:string, Cost:double)

HTTP トリガー、1 つのレコードを書き込む

次の例は、データベースにレコードを追加する C# 関数を示しています。 関数では、JSON 本文として HTTP POST 要求に含まれるデータを使用しています。

using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Extensions.Kusto;
using Microsoft.Azure.Functions.Worker.Http;
using Microsoft.Azure.WebJobs.Extensions.Kusto.SamplesOutOfProc.OutputBindingSamples.Common;

namespace Microsoft.Azure.WebJobs.Extensions.Kusto.SamplesOutOfProc.OutputBindingSamples
{
    public static class AddProduct
    {
        [Function("AddProduct")]
        [KustoOutput(Database: "productsdb", Connection = "KustoConnectionString", TableName = "Products")]
        public static async Task<Product> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = "addproductuni")]
            HttpRequestData req)
        {
            Product? prod = await req.ReadFromJsonAsync<Product>();
            return prod ?? new Product { };
        }
    }
}

HTTP トリガー、マッピングを使用したレコードの書き込み

次の例では、一連のレコードをデータベースに追加する C# 関数を示します。 関数は、ProductItem に変換するマッピングを使用します。

Product から Item にデータを変換するために、この関数ではマッピング参照を使用しています。

.create-merge table Item (ItemID:long, ItemName:string, ItemCost:float)


-- Create a mapping that transforms an Item to a Product

.create-or-alter table Product ingestion json mapping "item_to_product_json" '[{"column":"ProductID","path":"$.ItemID"},{"column":"Name","path":"$.ItemName"},{"column":"Cost","path":"$.ItemCost"}]'
namespace Microsoft.Azure.WebJobs.Extensions.Kusto.SamplesOutOfProc.OutputBindingSamples.Common
{
    public class Item
    {
        public long ItemID { get; set; }

        public string? ItemName { get; set; }

        public double ItemCost { get; set; }
    }
}
using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Extensions.Kusto;
using Microsoft.Azure.Functions.Worker.Http;
using Microsoft.Azure.WebJobs.Extensions.Kusto.SamplesOutOfProc.OutputBindingSamples.Common;

namespace Microsoft.Azure.WebJobs.Extensions.Kusto.SamplesOutOfProc.OutputBindingSamples
{
    public static class AddProductsWithMapping
    {
        [Function("AddProductsWithMapping")]
        [KustoOutput(Database: "productsdb", Connection = "KustoConnectionString", TableName = "Products", MappingRef = "item_to_product_json")]
        public static async Task<Item> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = "addproductswithmapping")]
            HttpRequestData req)
        {
            Item? item = await req.ReadFromJsonAsync<Item>();
            return item ?? new Item { };
        }
    }
}

Java の Azure Data Explorer 入力バインドのその他のサンプルは、GitHub リポジトリにあります。

このセクションには、次の例が含まれています。

この例では Products クラス (別個のファイル Product.java 内) とそれに対応するデータベース テーブル Products (前に定義したもの) を参照します。

package com.microsoft.azure.kusto.common;

import com.fasterxml.jackson.annotation.JsonProperty;

public class Product {
    @JsonProperty("ProductID")
    public long ProductID;
    @JsonProperty("Name")
    public String Name;
    @JsonProperty("Cost")
    public double Cost;

    public Product() {
    }

    public Product(long ProductID, String name, double Cost) {
        this.ProductID = ProductID;
        this.Name = name;
        this.Cost = Cost;
    }
}

HTTP トリガー、レコードをテーブルに書き込む

次の例は、商品レコードをテーブルに追加する Java 関数の Azure Data Explorer 出力バインドを示します。 関数では、JSON 本文として HTTP POST 要求に含まれるデータを使用しています。 この関数には、JSON 本文を解析するために com.fasterxml.jackson.core ライブラリに対する追加の依存関係があります。

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.13.4.1</version>
</dependency>
package com.microsoft.azure.kusto.outputbindings;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.microsoft.azure.functions.HttpMethod;
import com.microsoft.azure.functions.HttpRequestMessage;
import com.microsoft.azure.functions.HttpResponseMessage;
import com.microsoft.azure.functions.HttpStatus;
import com.microsoft.azure.functions.OutputBinding;
import com.microsoft.azure.functions.annotation.AuthorizationLevel;
import com.microsoft.azure.functions.annotation.FunctionName;
import com.microsoft.azure.functions.annotation.HttpTrigger;
import com.microsoft.azure.functions.kusto.annotation.KustoOutput;
import com.microsoft.azure.kusto.common.Product;

import java.io.IOException;
import java.util.Optional;

import static com.microsoft.azure.kusto.common.Constants.*;

public class AddProduct {
    @FunctionName("AddProduct")
    public HttpResponseMessage run(@HttpTrigger(name = "req", methods = {
            HttpMethod.POST}, authLevel = AuthorizationLevel.ANONYMOUS, route = "addproductuni") HttpRequestMessage<Optional<String>> request,
            @KustoOutput(name = "product", database = "productsdb", tableName = "Products", connection = KUSTOCONNSTR) OutputBinding<Product> product)
            throws IOException {

        if (request.getBody().isPresent()) {
            String json = request.getBody().get();
            ObjectMapper mapper = new ObjectMapper();
            Product p = mapper.readValue(json, Product.class);
            product.setValue(p);
            return request.createResponseBuilder(HttpStatus.OK).header("Content-Type", "application/json").body(product)
                    .build();
        } else {
            return request.createResponseBuilder(HttpStatus.NO_CONTENT).header("Content-Type", "application/json")
                    .build();
        }
    }
}

HTTP トリガー、2 つのテーブルに書き込む

次の例は、レコードを 2 つの異なるテーブル (ProductProductChangeLog) でデータベースに追加する Java 関数の Azure Data Explorer 出力バインドを示します。 関数では、JSON 本文として HTTP POST 要求に含まれるデータと複数の出力バインドを使用しています。 この関数には、JSON 本文を解析するために com.fasterxml.jackson.core ライブラリに対する追加の依存関係があります。

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.13.4.1</version>
</dependency>

2 番目のテーブル ProductsChangeLog は、次の定義に対応します。

.create-merge table ProductsChangeLog (ProductID:long, CreatedAt:datetime)

および ProductsChangeLog.java の Java クラス:

package com.microsoft.azure.kusto.common;

import com.fasterxml.jackson.annotation.JsonProperty;

public class ProductsChangeLog {
    @JsonProperty("ProductID")
    public long ProductID;
    @JsonProperty("CreatedAt")
    public String CreatedAt;

    public ProductsChangeLog() {
    }

    public ProductsChangeLog(long ProductID, String CreatedAt) {
        this.ProductID = ProductID;
        this.CreatedAt = CreatedAt;
    }
}
package com.microsoft.azure.kusto.outputbindings;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.microsoft.azure.functions.HttpMethod;
import com.microsoft.azure.functions.HttpRequestMessage;
import com.microsoft.azure.functions.HttpResponseMessage;
import com.microsoft.azure.functions.HttpStatus;
import com.microsoft.azure.functions.OutputBinding;
import com.microsoft.azure.functions.annotation.AuthorizationLevel;
import com.microsoft.azure.functions.annotation.FunctionName;
import com.microsoft.azure.functions.annotation.HttpTrigger;
import com.microsoft.azure.functions.kusto.annotation.KustoOutput;
import com.microsoft.azure.kusto.common.Product;
import com.microsoft.azure.kusto.common.ProductsChangeLog;

import static com.microsoft.azure.kusto.common.Constants.*;

import java.io.IOException;
import java.time.Clock;
import java.time.Instant;
import java.util.Optional;

public class AddMultiTable {
    @FunctionName("AddMultiTable")
    public HttpResponseMessage run(@HttpTrigger(name = "req", methods = {
            HttpMethod.POST}, authLevel = AuthorizationLevel.ANONYMOUS, route = "addmultitable") HttpRequestMessage<Optional<String>> request,
            @KustoOutput(name = "product", database = "productsdb", tableName = "Products", connection = KUSTOCONNSTR) OutputBinding<Product> product,
            @KustoOutput(name = "productChangeLog", database = "productsdb", tableName = "ProductsChangeLog",
                    connection = KUSTOCONNSTR) OutputBinding<ProductsChangeLog> productChangeLog)
            throws IOException {

        if (request.getBody().isPresent()) {
            String json = request.getBody().get();
            ObjectMapper mapper = new ObjectMapper();
            Product p = mapper.readValue(json, Product.class);
            product.setValue(p);
            productChangeLog.setValue(new ProductsChangeLog(p.ProductID, Instant.now(Clock.systemUTC()).toString()));
            return request.createResponseBuilder(HttpStatus.OK).header("Content-Type", "application/json").body(product)
                    .build();
        } else {
            return request.createResponseBuilder(HttpStatus.NO_CONTENT).header("Content-Type", "application/json")
                    .build();
        }
    }
}

Azure Data Explorer 出力バインドのその他のサンプルが、GitHub リポジトリで入手できます。

このセクションには、次の例が含まれています。

この例では、次のデータベース テーブルを参照します。

例では、テーブル ProductsProductsChangeLog (前に定義したもの) を参照しています。

HTTP トリガー、レコードをテーブルに書き込む

次の例は、function.json ファイルの Azure Data Explorer 出力バインドと、テーブルにレコードを追加する JavaScript 関数を示しています。 関数では、JSON 本文として HTTP POST 要求に含まれるデータを使用しています。

function.json ファイルのバインド データの例を次に示します。

{
  "bindings": [
    {
      "authLevel": "function",
      "name": "req",
      "direction": "in",
      "type": "httpTrigger",
      "methods": [
        "post"
      ],
      "route": "addproduct"
    },
    {
      "name": "$return",
      "type": "http",
      "direction": "out"
    },
    {
      "name": "product",
      "type": "kusto",
      "database": "productsdb",
      "direction": "out",
      "tableName": "Products",
      "connection": "KustoConnectionString"
    }
  ],
  "disabled": false
}

これらのプロパティについては、「構成」セクションを参照してください。

次のスニペットは、JavaScript コードの例です。

// Insert the product, which will insert it into the Products table.
module.exports = async function (context, req) {
    // Note that this expects the body to be a JSON object or array of objects which have a property
    // matching each of the columns in the table to insert to.
    context.bindings.product = req.body;
    return {
        status: 201,
        body: req.body
    };
}

HTTP トリガー、2 つのテーブルに書き込む

次の例は、function.json ファイルの Azure Data Explorer 出力バインドと、2 つの異なるテーブル (ProductsProductsChangeLog) でデータベースにレコードを追加する JavaScript 関数を示しています。 関数では、JSON 本文として HTTP POST 要求に含まれるデータと複数の出力バインドを使用しています。

2 番目のテーブル ProductsChangeLog は、次の定義に対応します。

.create-merge table ProductsChangeLog (ProductID:long, CreatedAt:datetime)

次のスニペットは、function.json ファイルのバインド データの例です。

{
  "bindings": [
    {
      "authLevel": "function",
      "name": "req",
      "direction": "in",
      "type": "httpTrigger",
      "methods": [
        "post"
      ],
      "route": "addmultitable"
    },
    {
      "name": "res",
      "type": "http",
      "direction": "out"
    },
    {
      "name": "product",
      "type": "kusto",
      "database": "productsdb",
      "direction": "out",
      "tableName": "Products",
      "connection": "KustoConnectionString"
    },
    {
      "name": "productchangelog",
      "type": "kusto",
      "database": "productsdb",
      "direction": "out",
      "tableName": "ProductsChangeLog",
      "connection": "KustoConnectionString"
    }
  ],
  "disabled": false
}

これらのプロパティについては、「構成」セクションを参照してください。

次のスニペットは、JavaScript コードの例です。

module.exports = async function (context, req) {
    context.log('JavaScript HTTP trigger and Kusto output binding function processed a request.');
    context.log(req.body);

    if (req.body) {
        var changeLog = {ProductID:req.body.ProductID, CreatedAt: new Date().toISOString()};
        context.bindings.product = req.body;
        context.bindings.productchangelog = changeLog;
        context.res = {
            body: req.body,
            mimetype: "application/json",
            status: 201
        }
    } else {
        context.res = {
            status: 400,
            body: "Error reading request body"
        }
    }
}

Azure Data Explorer 出力バインドのその他のサンプルが、GitHub リポジトリで入手できます。

このセクションには、次の例が含まれています。

例では、テーブル ProductsProductsChangeLog (前に定義したもの) を参照しています。

HTTP トリガー、レコードをテーブルに書き込む

次の例は、function.json ファイルの Azure Data Explorer 出力バインドと、テーブルにレコードを追加する Python 関数を示しています。 関数では、JSON 本文として HTTP POST 要求に含まれるデータを使用しています。

次のスニペットは、function.json ファイルのバインド データの例です。

{
  "scriptFile": "__init__.py",
  "bindings": [
    {
      "authLevel": "Anonymous",
      "type": "httpTrigger",
      "direction": "in",
      "name": "req",
      "methods": [
        "post"
      ],
      "route": "addproductuni"
    },
    {
      "type": "http",
      "direction": "out",
      "name": "$return"
    },
    {
      "name": "product",
      "type": "kusto",
      "database": "sdktestsdb",
      "direction": "out",
      "tableName": "Products",
      "connection": "KustoConnectionString"
    }
  ]
}

これらのプロパティについては、「構成」セクションを参照してください。

次のスニペットは、Python コードの例です。

import azure.functions as func
from Common.product import Product


def main(req: func.HttpRequest, product: func.Out[str]) -> func.HttpResponse:
    body = str(req.get_body(),'UTF-8')
    product.set(body)
    return func.HttpResponse(
        body=body,
        status_code=201,
        mimetype="application/json"
    )

HTTP トリガー、2 つのテーブルに書き込む

次の例は、function.json ファイルの Azure Data Explorer 出力バインドと、2 つの異なるテーブル (ProductsProductsChangeLog) でデータベースにレコードを追加する JavaScript 関数を示しています。 関数では、JSON 本文として HTTP POST 要求に含まれるデータと複数の出力バインドを使用しています。 2 番目のテーブル ProductsChangeLog は、次の定義に対応します。

.create-merge table ProductsChangeLog (ProductID:long, CreatedAt:datetime)

次のスニペットは、function.json ファイルのバインド データの例です。

{
  "scriptFile": "__init__.py",
  "bindings": [
    {
      "authLevel": "Anonymous",
      "type": "httpTrigger",
      "direction": "in",
      "name": "req",
      "methods": [
        "post"
      ],
      "route": "addmultitable"
    },
    {
      "type": "http",
      "direction": "out",
      "name": "$return"
    },
    {
      "name": "product",
      "type": "kusto",
      "database": "sdktestsdb",
      "direction": "out",
      "tableName": "Products",
      "connection": "KustoConnectionString"
    },
    {
      "name": "productchangelog",
      "type": "kusto",
      "database": "sdktestsdb",
      "direction": "out",
      "tableName": "ProductsChangeLog",
      "connection": "KustoConnectionString"
    }
  ]
}

これらのプロパティについては、「構成」セクションを参照してください。

次のスニペットは、Python コードの例です。

import json
from datetime import datetime

import azure.functions as func
from Common.product import Product


def main(req: func.HttpRequest, product: func.Out[str],productchangelog: func.Out[str]) -> func.HttpResponse:
    body = str(req.get_body(),'UTF-8')
    # parse x:
    product.set(body)
    id = json.loads(body)["ProductID"]

    changelog = {
        "ProductID": id,
        "CreatedAt": datetime.now().isoformat(),
    }
    productchangelog.set(json.dumps(changelog))
    return func.HttpResponse(
        body=body,
        status_code=201,
        mimetype="application/json"
    )

属性

C# ライブラリでは KustoAttribute 属性を使用して、次のプロパティを持つ関数に対して Azure Data Explorer バインドを宣言します。

属性のプロパティ 説明
データベース 必須。 クエリを実行する必要があるデータベース。
接続 必須。 環境変数または関数アプリの設定によって解決される接続文字列を保持する変数の名前。 既定では、変数 KustoConnectionString を検索します。 実行時に、環境に対してこの変数が検索されます。 接続文字列のドキュメントについては、「Kusto 接続文字列」を参照してください。 (例: "KustoConnectionString": "Data Source=https://your_cluster.kusto.windows.net;Database=your_Database;Fed=True;AppClientId=your_AppId;AppKey=your_AppKey;Authority Id=your_TenantId)。
TableName 必須。 データを取り込むテーブル。
MappingRef 省略可能。 クラスターで既に定義されているマッピング参照を渡す属性。
ManagedServiceIdentity 省略可能。 マネージド ID を使用して、Azure Data Explorer に接続できます。 システム マネージド ID を使用するには、"system" を使用します。その他の ID 名はユーザー マネージド ID として解釈されます。
DataFormat 省略可能。 既定のデータ形式は multijson/json です。 これは、datasource 形式列挙型でサポートされている "テキスト" 形式に設定できます。 サンプルは検証され、CSV 形式と JSON 形式用に提供されます。

注釈

Java 関数ランタイム ライブラリでは、@KustoInput 注釈 (com.microsoft.azure.functions.kusto.annotation.KustoOutput) が使用されます。

要素 説明
name 必須。 関数コード内のクエリ結果を表す変数の名前。
database 必須。 クエリを実行する必要があるデータベース。
connection 必須。 環境変数または関数アプリの設定によって解決される接続文字列を保持する変数の名前。 既定では、変数 KustoConnectionString を検索します。 実行時に、環境に対してこの変数が検索されます。 接続文字列のドキュメントについては、「Kusto 接続文字列」を参照してください。 (例: "KustoConnectionString": "Data Source=https://your_cluster.kusto.windows.net;Database=your_Database;Fed=True;AppClientId=your_AppId;AppKey=your_AppKey;Authority Id=your_TenantId)。
tableName 必須。 データを取り込むテーブル。
mappingRef 省略可能。 クラスターで既に定義されているマッピング参照を渡す属性。
dataFormat 省略可能。 既定のデータ形式は multijson/json です。 これは、datasource 形式列挙型でサポートされている "テキスト" 形式に設定できます。 サンプルは検証され、CSV 形式と JSON 形式用に提供されます。
managedServiceIdentity マネージド ID を使用して、Azure Data Explorer に接続できます。 システム マネージド ID を使用するには、"system" を使用します。その他の ID 名はユーザー マネージド ID として解釈されます。

構成

次の表は、function.json ファイルで設定したバインド構成のプロパティを説明しています。

function.json のプロパティ 説明
type 必須。 kusto に設定する必要があります。
方向 必須。 out に設定する必要があります。
name 必須。 関数コード内のクエリ結果を表す変数の名前。
database 必須。 クエリを実行する必要があるデータベース。
connection 必須。 環境変数または関数アプリの設定によって解決される接続文字列を保持する変数の "名前"。 既定では、変数 KustoConnectionString を検索します。 実行時に、環境に対してこの変数が検索されます。 接続文字列のドキュメントについては、「Kusto 接続文字列」を参照してください。 (例: "KustoConnectionString": "Data Source=https://your_cluster.kusto.windows.net;Database=your_Database;Fed=True;AppClientId=your_AppId;AppKey=your_AppKey;Authority Id=your_TenantId)。
tableName 必須。 データを取り込むテーブル。
mappingRef 省略可能。 クラスターで既に定義されているマッピング参照を渡す属性。
dataFormat 省略可能。 既定のデータ形式は multijson/json です。 これは、datasource 形式列挙型でサポートされている "テキスト" 形式に設定できます。 サンプルは検証され、CSV 形式と JSON 形式用に提供されます。
managedServiceIdentity マネージド ID を使用して、Azure Data Explorer に接続できます。 システム マネージド ID を使用するには、"system" を使用します。その他の ID 名はユーザー マネージド ID として解釈されます。

ローカルで開発する場合は、Values コレクション内の local.settings.json ファイルにアプリケーション設定を追加します。

使用方法

属性のコンストラクターは、データベースと、属性 TableNameMappingRefDataFormat、および接続設定名を受け取ります。 KQL コマンドには、KQL ステートメントまたは KQL 関数を指定できます。 接続文字列の設定名は、Kusto 接続文字列を含むアプリケーション設定 (ローカル開発の場合は local.settings.json にあります) に対応します。 たとえば、"KustoConnectionString": "Data Source=https://your_cluster.kusto.windows.net;Database=your_Database;Fed=True;AppClientId=your_AppId;AppKey=your_AppKey;Authority Id=your_TenantId となります。 入力バインディングによって実行されるクエリはパラメーター化されます。 KQL パラメーターで指定された値は、実行時に使用されます。

次の手順

テーブルからデータを読み取る (入力バインド)