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
In Process 모델에 대한 지원은 2026년 11월 10일에 종료됩니다. 전체 지원을 위해 앱을 격리된 작업자 모델로 마이그레이션하는 것이 좋습니다.
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 매개 변수에 제공된 값은 런타임에 사용됩니다.