Azure Data Explorer의 자동 프로비전

자동 프로비전은 Azure Data Explorer 클러스터를 실행하는 데 필요한 리소스를 신속하게 배포하고 구성하는 프로세스입니다. DevOps 또는 DataOps 워크플로의 중요한 부분입니다. 프로비저닝 프로세스에서는 클러스터를 수동으로 구성할 필요가 없고, 사용자 개입이 필요하지 않으며, 쉽게 설정할 수 있습니다.

CI/CD(연속 통합 및 지속적인 업데이트) 파이프라인의 일부로 자동화된 프로비저닝을 사용하여 데이터와 함께 미리 구성된 클러스터를 배포할 수 있습니다. 이 작업의 몇 가지 주요 장점은 다음과 같습니다.

  • 여러 환경을 정의하고 유지 관리합니다.
  • 원본 제어에서 배포를 추적합니다.
  • 이전 버전으로 더 쉽게 롤백할 수 있습니다.
  • 전용 테스트 환경을 프로비전하여 자동화된 테스트를 용이하게 합니다.

이 문서에서는 인프라, 스키마 엔터티 및 데이터 수집을 포함하여 Azure Data Explorer 환경의 프로비전을 자동화하는 다양한 메커니즘에 대한 개요를 제공합니다. 또한 프로비전 프로세스를 자동화하는 데 사용되는 다양한 도구 및 기술에 대한 참조를 제공합니다.

배포 일반 흐름을 보여 주는 이미지.

인프라 배포

인프라 배포는 클러스터, 데이터베이스 및 데이터 연결을 포함한 Azure 리소스의 배포와 관련이 있습니다. 다음과 같은 여러 유형의 인프라 배포가 있습니다.

ARM 템플릿 및 Terraform 스크립트는 Azure Data Explorer 인프라를 배포하는 두 가지 주요 선언적 방법입니다.

ARM 템플릿 배포

ARM 템플릿은 배포의 인프라 및 구성을 정의하는 JSON 또는 Bicep 파일입니다. 템플릿을 사용하여 클러스터, 데이터베이스, 데이터 연결 및 기타 여러 인프라 구성 요소를 배포할 수 있습니다. 자세한 정보는 Azure Resource Manager 템플릿을 사용하여 Azure Data Explorer 클러스터와 데이터베이스 만들기를 참조하세요.

ARM 템플릿을 사용하여 데이터베이스 스키마를 만들고 정책을 정의하는 데 도움이 되는 명령 스크립트를 배포할 수도 있습니다. 자세한 내용은 Kusto 쿼리 언어 스크립트를 사용하여 데이터베이스 구성을 참조하세요.

Azure 빠른 시작 템플릿 사이트에서 더 많은 예제 템플릿을 찾을 수 있습니다.

Terraform 배포

Terraform은 오픈 소스, Infrastructure-as-Code 소프트웨어 도구입니다. 클라우드 서비스를 관리하는 일관된 CLI 워크플로를 제공합니다. Terraform은 클라우드 API를 선언적 구성 파일로 코딩합니다.

Terraform은 ARM 템플릿과 동일한 기능을 제공합니다. Terraform을 사용하여 클러스터, 데이터베이스, 데이터 연결 및 기타 여러 인프라 구성 요소를 배포할 수 있습니다.

Terraform을 사용하여 데이터베이스 스키마를 만들고 정책을 정의하는 데 도움이 되는 명령 스크립트를 배포할 수도 있습니다.

명령적 배포

지원되는 플랫폼을 사용하여 인프라를 명령적으로 배포할 수도 있습니다.

스키마 엔터티 배포

스키마 엔터티 프로비저닝은 테이블, 함수, 정책, 권한 배포와 관련이 있습니다. 관리 명령으로 구성된 스크립트를 실행하여 엔터티를 만들거나 업데이트할 수 있습니다.

다음 방법을 사용하여 스키마 엔터티 배포를 자동화할 수 있습니다.

  • ARM 템플릿
  • Terraform 스크립트
  • Kusto CLI
  • SDK
  • 도구
    • Kusto 동기화. 이 대화형 개발자 도구를 사용하여 데이터베이스 스키마 또는 관리 명령 스크립트를 추출합니다. 그런 다음, 자동 배포를 위해 추출된 콘텐츠 명령 스크립트를 사용할 수 있습니다.
    • Delta Kusto: CI/CD 파이프라인에서 이 도구를 호출합니다. 데이터베이스 스키마 또는 관리 명령 스크립트와 같은 두 원본을 비교하고 델타 관리 명령 스크립트를 계산할 수 있습니다. 그런 다음, 자동 배포를 위해 추출된 콘텐츠 명령 스크립트를 사용할 수 있습니다.
    • Azure Data Explorer에 대한 Azure DevOps 태스크.

데이터 수집

클러스터에 데이터를 수집할 때가 있습니다. 예를 들어 테스트를 실행하거나 환경을 다시 만들기 위해 데이터를 수집할 수 있습니다. 다음 메서드를 사용하여 데이터를 수집할 수 있습니다.

CI/CD 파이프라인을 사용한 배포 예제

다음 예제에서는 인프라, 스키마 엔터티 및 데이터의 배포를 자동화하는 도구를 실행하는 Azure DevOps CI/CD 파이프라인을 사용합니다. 특정 도구 세트를 사용하는 파이프라인의 한 예이지만 다른 도구와 단계를 사용할 수도 있습니다. 예를 들어 프로덕션 환경에서는 데이터를 수집하지 않는 파이프라인을 만들 수 있습니다. 생성된 클러스터에서 자동화된 테스트를 실행하는 등의 단계를 파이프라인에 추가할 수도 있습니다.

여기서는 다음 도구를 사용합니다.

배포 유형 도구 Task
인프라 ARM 템플릿 클러스터 및 데이터베이스 만들기
스키마 엔터티 Kusto CLI 데이터베이스에서 테이블 만들기
데이터 LightIngest 한 테이블에 데이터 수집

배포 예 흐름을 보여 주는 이미지.

다음 단계를 수행하여 파이프라인을 만듭니다.

1단계: 서비스 연결 만들기

Azure Resource Manager 유형의 서비스 연결을 정의합니다. 클러스터를 배포할 구독 및 리소스 그룹에 대한 연결을 가리킵니다. Azure 서비스 주체가 만들어지고 이를 사용하여 ARM 템플릿을 배포합니다. 동일한 보안 주체를 사용하여 스키마 엔터티를 배포하고 데이터를 수집할 수 있습니다. 자격 증명을 Kusto CLI 및 LightIngest 도구에 명시적으로 전달해야 합니다.

2단계: 파이프라인 만들기

클러스터를 배포하고, 스키마 엔터티를 만들고, 데이터를 수집하는 데 사용할 파이프라인(배포 환경)을 정의합니다.

파이프라인을 사용하려면 먼저 다음 비밀 변수를 만들어야 합니다.

변수 이름 Description
clusterName Azure Data Explorer 클러스터의 이름입니다.
serviceConnection ARM 템플릿을 배포하는 데 사용되는 Azure DevOps 연결의 이름입니다.
appId 클러스터와 상호 작용하는 데 사용되는 서비스 주체의 클라이언트 ID입니다.
appSecret 서비스 주체의 비밀입니다.
appTenantId 서비스 주체의 테넌트 ID입니다.
location 클러스터를 배포할 Azure 지역입니다. 예들 들어 eastus입니다.
resources:
- repo: self

stages:
- stage: deploy_cluster
  displayName: Deploy cluster
  variables: []
    clusterName: specifyClusterName
    serviceConnection: specifyServiceConnection
    appId: specifyAppId
    appSecret: specifyAppSecret
    appTenantId: specifyAppTenantId
    location: specifyLocation
  jobs:
  - job: e2e_deploy
    pool:
      vmImage: windows-latest
    variables: []
    steps:
    - bash: |
        nuget install Microsoft.Azure.Kusto.Tools -Version 5.3.1
        # Rename the folder (including the most recent version)
        mv Microsoft.Azure.Kusto.Tools.* kusto.tools
      displayName: Download required Kusto.Tools Nuget package
    - task: AzureResourceManagerTemplateDeployment@3
      displayName: Deploy Infrastructure
      inputs:
        deploymentScope: 'Resource Group'
        # subscriptionId and resourceGroupName are specified in the serviceConnection
        azureResourceManagerConnection: $(serviceConnection)
        action: 'Create Or Update Resource Group'
        location: $(location)
        templateLocation: 'Linked artifact'
        csmFile: deploy-infra.json
        overrideParameters: "-clusterName $(clusterName)"
        deploymentMode: 'Incremental'
    - bash: |
        # Define connection string to cluster's database, including service principal's credentials
        connectionString="https://$(clusterName).$(location).kusto.windows.net/myDatabase;Fed=true;AppClientId=$(appId);AppKey=$(appSecret);TenantId=$(appTenantId)"
        # Execute a KQL script against the database
        kusto.tools/tools/Kusto.Cli $connectionString -script:MyDatabase.kql
      displayName: Create Schema Entities
    - bash: |
        connectionString="https://ingest-$(CLUSTERNAME).$(location).kusto.windows.net/;Fed=true;AppClientId=$(appId);AppKey=$(appSecret);TenantId=$(appTenantId)"
        kusto.tools/tools/LightIngest $connectionString -table:Customer -sourcePath:customers.csv -db:myDatabase -format:csv -ignoreFirst:true
      displayName: Ingest Data

3단계: 클러스터를 배포하는 ARM 템플릿 만들기

클러스터를 구독 및 리소스 그룹에 배포하는 데 사용할 ARM 템플릿(deploy-infra.json)을 정의합니다.

{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "clusterName": {
            "type": "string",
            "minLength": 5
        }
    },
    "variables": {
    },
    "resources": [
        {
            "name": "[parameters('clusterName')]",
            "type": "Microsoft.Kusto/clusters",
            "apiVersion": "2021-01-01",
            "location": "[resourceGroup().location]",
            "sku": {
                "name": "Dev(No SLA)_Standard_E2a_v4",
                "tier": "Basic",
                "capacity": 1
            },
            "resources": [
                {
                    "name": "myDatabase",
                    "type": "databases",
                    "apiVersion": "2021-01-01",
                    "location": "[resourceGroup().location]",
                    "dependsOn": [
                        "[resourceId('Microsoft.Kusto/clusters', parameters('clusterName'))]"
                    ],
                    "kind": "ReadWrite",
                    "properties": {
                        "softDeletePeriodInDays": 365,
                        "hotCachePeriodInDays": 31
                    }
                }
            ]
        }
    ]
}

4단계: 스키마 엔터티를 만드는 KQL 스크립트 만들기

데이터베이스에서 테이블을 만드는 데 사용할 KQL 스크립트(MyDatabase.kql)를 정의합니다.

.create table Customer(CustomerName:string, CustomerAddress:string)

//  Set the ingestion batching policy to trigger ingestion quickly
//  This is to speedup reaction time for the sample
//  Do not do this in production
.alter table Customer policy ingestionbatching @'{"MaximumBatchingTimeSpan":"00:00:10", "MaximumNumberOfItems": 500, "MaximumRawDataSizeMB": 1024}'

.create table CustomerLogs(CustomerName:string, Log:string)

5단계: 데이터 수집을 위한 KQL 스크립트 만들기

수집할 CSV 데이터 파일(customer.csv)을 만듭니다.

customerName,customerAddress
Contoso Ltd,Paris
Datum Corporation,Seattle
Fabrikam,NYC

예 흐름의 작업 실행을 보여 주는 스크린샷.

파이프라인에서 지정한 서비스 주체 자격 증명을 사용하여 클러스터를 만듭니다. 사용자에게 권한을 부여하려면 Azure Data Explorer 데이터베이스 권한 관리의 단계를 수행합니다.

Azure Data Explorer 웹 UI에 두 개의 테이블이 있는 배포된 데이터베이스를 보여 주는 스크린샷.

Customer 테이블에 대해 쿼리를 실행하여 배포를 확인할 수 있습니다. CSV 파일에서 가져온 세 개의 레코드가 표시됩니다.