Azure Functions용 Azure Data Explorer 출력 바인딩(미리 보기)
함수가 실행되면 Azure Data Explorer 출력 바인딩은 데이터를 Azure Data Explorer로 수집합니다.
설정 및 구성 세부 정보에 대한 자세한 내용은 개요를 참조하세요.
예제
C# 함수는 다음 C# 모드 중 하나를 사용하여 만들 수 있습니다.
- 격리된 작업자 모델: 런타임에서 격리된 작업자 프로세스에서 실행되는 컴파일된 C# 함수입니다. LTS 및 비 LTS 버전 .NET 및 .NET Framework에서 실행되는 C# 함수를 지원하려면 격리된 작업자 프로세스가 필요합니다.
- In Process 모델: Functions 런타임과 동일한 프로세스에서 실행되는 컴파일된 C# 함수입니다.
- C# 스크립트: Azure Portal에서 C# 함수를 만들 때 주로 사용됩니다.
Important
2026년 11월 10일에 In-process 모델에 대한 지원이 종료됩니다. 모든 지원을 위해 앱을 격리된 작업자 모델로 마이그레이션하는 것이 좋습니다.
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 트리거, 하나의 레코드 쓰기
다음 예에서는 데이터베이스에 레코드를 추가하는 C# 함수를 보여 줍니다. 이 함수는 HTTP POST 요청에 제공된 데이터를 JSON 본문으로 사용합니다.
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# 함수를 보여 줍니다. 이 함수는 Product
를 Item
으로 변환하는 매핑을 사용합니다.
데이터를 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 출력 바인딩을 보여 줍니다. 이 함수는 HTTP POST 요청에 제공된 데이터를 JSON 본문으로 사용합니다. 이 함수는 com.fasterxml.jackson.core 라이브러리에 대한 또 다른 종속성을 사용하여 JSON 본문을 구문 분석합니다.
<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 트리거, 두 테이블에 쓰기
다음 예에서는 서로 다른 두 테이블(Product
및 ProductChangeLog
)의 데이터베이스에 레코드를 추가하는 Java 함수의 Azure Data Explorer 출력 바인딩을 보여 줍니다. 이 함수는 HTTP POST 요청에 JSON 본문 및 다중 출력 바인딩으로 제공된 데이터를 사용합니다. 이 함수는 com.fasterxml.jackson.core 라이브러리에 대한 또 다른 종속성을 사용하여 JSON 본문을 구문 분석합니다.
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.4.1</version>
</dependency>
두 번째 테이블 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 리포지토리에서 사용할 수 있습니다.
이 섹션에는 다음 예제가 포함되어 있습니다.
예는 데이터베이스 테이블을 참조하세요.
예는 테이블 Products
및 ProductsChangeLog
(앞서 정의됨)를 참조하세요.
HTTP 트리거, 테이블에 레코드 쓰기
다음 예에서는 function.json 파일의 Azure Data Explorer 출력 바인딩과 테이블에 레코드를 추가하는 JavaScript 함수를 보여 줍니다. 이 함수는 HTTP POST 요청에 제공된 데이터를 JSON 본문으로 사용합니다.
다음 예에서는 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 트리거, 두 테이블에 쓰기
다음 예에서는 function.json 파일의 Azure Data Explorer 출력 바인딩과 서로 다른 두 테이블(Products
및 ProductsChangeLog
)의 데이터베이스에 레코드를 추가하는 JavaScript 함수를 보여 줍니다. 이 함수는 HTTP POST 요청에 JSON 본문 및 다중 출력 바인딩으로 제공된 데이터를 사용합니다.
두 번째 테이블 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 리포지토리에서 사용할 수 있습니다.
이 섹션에는 다음 예제가 포함되어 있습니다.
예는 테이블 Products
및 ProductsChangeLog
(앞서 정의됨)를 참조하세요.
HTTP 트리거, 테이블에 레코드 쓰기
다음 예에서는 function.json 파일의 Azure Data Explorer 출력 바인딩과 테이블에 레코드를 추가하는 Python 함수를 보여 줍니다. 이 함수는 HTTP POST 요청에 제공된 데이터를 JSON 본문으로 사용합니다.
다음 코드 조각은 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 트리거, 두 테이블에 쓰기
다음 예에서는 function.json 파일의 Azure Data Explorer 출력 바인딩과 서로 다른 두 테이블(Products
및 ProductsChangeLog
)의 데이터베이스에 레코드를 추가하는 JavaScript 함수를 보여 줍니다. 이 함수는 HTTP POST 요청에 JSON 본문 및 다중 출력 바인딩으로 제공된 데이터를 사용합니다. 두 번째 테이블 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 바인딩을 선언합니다.
특성 속성 | 설명 |
---|---|
데이터베이스 | 필수입니다. 쿼리를 실행해야 하는 데이터베이스입니다. |
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 | 선택 사항. 클러스터에 이미 정의된 매핑 참조를 전달하는 특성입니다. |
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 로 설정해야 합니다. |
direction | 필수입니다. 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 파일에 애플리케이션 설정을 추가합니다.
사용
특성의 생성자는 데이터베이스와 특성 TableName
, MappingRef
, DataFormat
및 연결 설정 이름을 사용합니다. 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 매개 변수에 제공된 값은 런타임에 사용됩니다.