Задача Azure DevOps для Azure Data Explorer

Azure DevOps Services включает инструменты для совместной работы в области разработки, в том числе высокопроизводительные конвейеры, бесплатные частные репозитории Git, настраиваемые канбан-доски, а также различные автоматизированные и непрерывно работающие инструменты тестирования. Azure Pipelines — это функционал Azure DevOps, который позволяет управлять процессами непрерывной интеграции и доставки (CI/CD) для развертывания кода с использованием высокопроизводительных конвейеров, которые поддерживают любой язык, платформу и облако. Azure Data Explorer — Pipeline Tools — это задача Azure Pipelines, позволяющая создавать конвейеры выпуска и развертывать изменения базы данных в базах данных Azure Data Explorer. Она доступна бесплатно в Visual Studio Marketplace. Расширение включает следующие основные задачи:

  • Команда Azure Data Explorer— выполнение команд администратора в кластере Azure Data Explorer

  • Запрос Azure Data Explorer. Выполнение запросов к кластеру Azure Data Explorer и анализ результатов

  • Шлюз сервера запросов Azure Data Explorer — задача без агента для контроля выпусков в зависимости от результата запроса

    Снимок экрана типов задач, доступных в расширении

В этом документе описывается простой пример использования задачи Azure Data Explorer - Pipeline Tools для развертывания изменений схемы в базе данных. Полное описание конвейеров CI/CD см. в документации по Azure DevOps.

Требуемые условия

Подготовка содержимого к выпуску

Для выполнения команд администратора в кластере в задаче можно использовать следующие методы:

Снимок экрана, показывающий параметры управления исходным кодом.

  • Используйте шаблон поиска для получения нескольких файлов команд из локальной папки агента (файлов сборки или артефактов выпуска). Параметр с одной строкой поддерживает обработку нескольких файлов, применяя по одной команде на файл.

    Снимок экрана: параметр локальной папки.

  • Напишите команды встроенно.

    Снимок экрана с вариантом встроенной команды.

  • Укажите путь к файлу для получения файлов команд непосредственно из системы управления версиями Git (рекомендуется).

    Снимок экрана, показывающий параметр файлов системы контроля версий Git.

    Создайте в репозитории Git следующие образцы папок (Functions, Policies, Tables). Скопируйте файлы из репозитория примеров в соответствующие папки и зафиксируйте изменения. Примеры файлов предоставляются для выполнения следующего рабочего процесса.

    Снимок экрана: папки для создания в репозитории.

    Совет

    При создании собственного рабочего процесса рекомендуется сделать код идемпотентным. Например, используйте .create-merge table вместо .create table, и функцию .create-or-alter вместо функции .create.

Создание конвейера выпуска

  1. Войдите в организацию Azure DevOps.

  2. Выберите "Конвейеры выпусков>" в меню слева и выберите "Создать конвейер".

    Снимок экрана: запуск нового конвейера.

  3. Откроется окно Новый конвейер выпуска. На вкладке Конвейеры в области Выбор шаблона выберите Пустое задание.

    Снимок экрана: выбор шаблона.

  4. Нажмите кнопку "Этап ". В области "Этап " добавьте имя этапа и нажмите кнопку "Сохранить ", чтобы сохранить конвейер.

    Снимок экрана, показывающий, как назвать этап конвейера.

  5. Нажмите кнопку Добавить артефакт. В области "Добавление артефакта" выберите репозиторий, в котором существует код, заполните соответствующие сведения и нажмите кнопку "Добавить". Щелкните Сохранить, чтобы сохранить конвейер.

    Снимок экрана: добавление артефакта.

  6. На вкладке "Переменные" выберите +Добавить , чтобы создать переменную для URL-адреса конечной точки , используемого в задаче. Введите имя и значение конечной точки, а затем нажмите кнопку "Сохранить ", чтобы сохранить конвейер.

    Снимок экрана: создание переменной конвейера.

    Чтобы найти URL-адрес конечной точки, перейдите на страницу обзора кластера Azure Data Explorer в портал Azure и скопируйте URI кластера. Создайте URI переменной в следующем формате https://<ClusterURI>?DatabaseName=<DBName>. Например: https://kustodocs.westus.kusto.windows.net?DatabaseName=SampleDB

    Снимок экрана: добавление значения для URI кластера Azure Data Explorer.

Создайте задачу развертывания папок

  1. На вкладке "Конвейер" выберите 1 задание, 0 задачи, чтобы добавить задачи.

    Снимок экрана: добавление задачи в конвейер.

  2. Повторите следующие шаги, чтобы создать задачи команд для развертывания файлов из папок Tables, Functions и Policies:

    Снимок экрана: добавление команды администратора Azure Data Explorer.

    1. На вкладке Задачи выберите + от Задание агента и выполните поиск Azure Data Explorer.

    2. В разделе Запуск команды Azure Data Explorer выберите Добавить.

    3. Выберите Команда Kusto и обновите задачу, указав следующие сведения:

      • Отображаемое имя: имя задачи. Например, Deploy <FOLDER> где <FOLDER> находится имя папки для создаваемой задачи развертывания.

      • Путь к файлу: для каждой папки укажите путь, например */<FOLDER>/*.csl, где <FOLDER> — это соответствующая папка для задачи.

      • URL-адрес конечной точки: укажите переменную EndPoint URL, созданную на предыдущем шаге.

      • Использовать конечную точку службы: выберите этот параметр.

      • Конечная точка службы: выберите существующую конечную точку службы или создайте новую (+ Создать), указав следующие сведения в окне Добавление подключения к службе Azure Data Explorer:

        Настройка Предлагаемое значение
        метод проверки подлинности Настройте учетные данные федеративного удостоверения (FIC) (рекомендуется) или выберите проверку подлинности субъекта-службы (SPA).
        Имя подключения Введите имя для обозначения этой конечной точки службы
        URL-адрес кластера Значение можно найти в разделе обзорной информации о Azure Data Explorer Cluster на портале Azure
        Идентификатор сервисного принципала Введите идентификатор приложения Microsoft Entra (созданный в качестве предварительных требований)
        Ключ приложения субъекта-службы Введите ключ приложения Microsoft Entra (созданный в качестве предварительных требований)
        Идентификатор клиента Microsoft Entra Введите клиент Microsoft Entra (например, microsoft.com или contoso.com)

      Установите флажок Разрешить всем конвейерам использовать это подключение, а затем нажмите кнопку ОК.

      Скриншот, показывающий, как добавить подключение к службе.

    4. Если команды администратора являются длительными асинхронными операциями, установите флажок Ожидание завершения длительных асинхронных команд администратора. Когда включена, задача опрашивает состояние операции, пока команда .show operations не завершится.

  3. Выберите "Сохранить", а затем на вкладке "Задачи " убедитесь, что существуют три задачи: развертывание таблиц, развертывание функций и развертывание политик.

    Снимок экрана: развертывание всех папок.

Создание задачи запроса

При необходимости создайте задачу для выполнения запроса к кластеру. Запросы в конвейере сборки или релиза можно использовать для проверки набора данных, при этом шаг может завершиться успехом или сбоем на основе результатов запроса. Критерии успешного выполнения задач могут быть основаны на пороговом значении счетчика строк или отдельном значении в зависимости от того, что возвращается в ответ на запрос.

  1. На вкладке Задачи выберите + от Задание агента и выполните поиск Azure Data Explorer.

  2. В разделе Запуск запроса Azure Data Explorer выберите Добавить.

  3. Выберите Запрос Kusto и обновите задачу, внесите следующую информацию:

    • Отображаемое имя: имя задачи. Например, кластер запросов.
    • Тип: выберите Встроенный.
    • Запрос: введите запрос, который необходимо выполнить.
    • URL-адрес конечной точки: укажите переменную EndPoint URL, созданную ранее.
    • Использовать конечную точку службы: выберите этот параметр.
    • Конечная точка службы: выберите конечную точку службы.

    Снимок экрана: создание задачи запроса.

  4. В разделе «Результаты задачи» выберите условия успешного выполнения задачи на основе результатов запроса следующим образом:

    • Если запрос возвращает строки, выберите Количество строк и укажите нужные критерии.

      Снимок экрана: запрос возвращает строки и задает пороговые значения счетчика строк.

    • Если запрос возвращает значение, выберите Единственное значение и укажите ожидаемый результат.

      Снимок экрана: запрос возвращает одно значение и задает ожидаемое значение.

Создание задачи для шлюза сервера запросов

При необходимости создайте задачу для выполнения запроса к кластеру и заблокируйте прогресс выпуска до выполнения условия по количеству строк результатов запроса. Задача шлюза запросов сервера — это безагентное задание, означающее, что запрос выполняется непосредственно на Azure DevOps Server.

  1. На вкладке Задачи выберите +, используя Задание без агента, и найдите Azure Data Explorer.

  2. В разделе Запуск шлюза сервера запросов Azure Data Explorer выберите Добавить.

  3. Выберите Шлюз сервера запросов Kusto, а затем выберите Тест шлюза сервера.

    Снимок экрана, показывающий, как выбрать задачу «Шлюз сервера».

  4. Настройте задачу, указав следующие сведения:

    • Отображаемое имя: имя шлюза.
    • Конечная точка службы: выберите конечную точку службы.
    • Имя базы данных: укажите имя базы данных.
    • Тип: выберите Встроенный запрос.
    • Запрос: введите запрос, который необходимо выполнить.
    • Максимальное пороговое значение: укажите максимальное число строк для критериев успешного выполнения запроса.

    Снимок экрана: настройка задачи

Примечание.

При запуске релиза вы должны увидеть результаты, подобные приведённым ниже.

Снимок экрана: пример результатов задачи

Запуск релиза

  1. Нажмите кнопку "+ Создать выпуск>", чтобы начать выпуск.

    Снимок экрана, демонстрирующий, как создать выпуск.

  2. На вкладке Журналы убедитесь, что развертывание выполнено успешно.

    Снимок экрана: успешное развертывание.

Теперь будет завершено создание конвейера выпуска для предварительного развертывания.

Поддержка проверки подлинности без ключа для задач DevOps в Azure Data Explorer

Расширение поддерживает безключевую проверку подлинности для кластеров Azure Data Explorer. Бесключевая аутентификация позволяет аутентифицироваться в кластерах Azure Data Explorer без использования ключа. Это безопаснее и проще управлять.

Примечание.

URL-адреса кластера Kusto Fabric не поддерживаются для проверки подлинности федерации удостоверений для рабочих нагрузок (WIF) и управляемой идентификации.

Использование аутентификации с использованием федеративных удостоверений (FIC) в подключении службы Azure Data Explorer

Примечание.

Начиная с версии расширения 4.0.x, служба Azure Data Explorer Service Endpoint поддерживает аутентификацию с федерацией удостоверений для рабочей нагрузки (WIF), а также аутентификацию с помощью главного приложения.

  1. В вашем экземпляре DevOps перейдите к Настройкам проекта>, Подключениям служб>, Новое подключение службы>, и выберите Azure Data Explorer.

  2. Выберите федеративные учетные данные удостоверения и введите URL-адрес кластера, идентификатор субъекта-службы, идентификатор клиента, имя подключения к службе и нажмите кнопку "Сохранить".

  3. В портал Azure откройте приложение Microsoft Entra для указанного субъекта-службы.

  4. В разделе "Сертификаты и секреты" выберите федеративные учетные данные.

    Снимок экрана: вкладка федеративных учетных данных приложения Microsoft Entra.

  5. Выберите "Добавить учетные данные", а затем для сценария федеративных учетных данных выберите "Другой издатель" и заполните параметры, используя следующие сведения:

    • Издатель: <https://vstoken.dev.azure.com/{System.CollectionId}> где {System.CollectionId} является идентификатором коллекции вашей организации Azure DevOps. Идентификатор коллекции можно найти следующим образом:

      • В классическом конвейере публикации Azure DevOps выберите Initialize job. Идентификатор коллекции отображается в журналах.
    • Идентификатор субъекта: <sc://{DevOps_Org_name}/{Project_Name}/{Service_Connection_Name}> где {DevOps_Org_name} находится имя организации Azure DevOps, {Project_Name} имя проекта и {Service_Connection_Name} имя подключения службы, созданное ранее.

      Примечание.

      Если в имени подключения к службе есть пробел, его можно использовать с пробелом в поле. Например: sc://MyOrg/MyProject/My Service Connection.

    • Имя: введите имя для учетных данных.

    Снимок экрана, демонстрирующий создание нового подключения к службе с использованием учетных данных федеративного удостоверения.

  6. Выберите Добавить.

Используйте федеративные учетные данные идентификации или управляемую идентификацию в подключении службы Azure Resource Manager (ARM)

  1. В экземпляре DevOps перейдите к Параметры проекта>Подключения сервисов>Новое подключение сервиса>Диспетчер ресурсов Azure.

    Снимок экрана: добавление подключения к службе Azure Resource Monitor.

  2. В разделе «Метод проверки подлинности» выберите «Федерация идентификаций рабочего процесса (автоматически)», чтобы продолжить. Вы также можете использовать параметр федерации удостоверений рабочей нагрузки (вручную) для указания сведений о федерации удостоверений рабочей нагрузки или параметр управляемое удостоверение. Узнайте больше о настройке управляемого удостоверения с помощью управления ресурсами Azure в подключениях службы Azure Resource Manager (ARM).

    Снимок экрана: параметр проверки подлинности для подключения службы Azure Resource Monitor

  3. Заполните необходимые сведения, нажмите кнопку "Проверить", а затем нажмите кнопку "Сохранить".

Конфигурация конвейера YAML

Задачи можно настроить с помощью веб-интерфейса Azure DevOps или кода YAML в схеме конвейера.

Расширение предоставляет три задачи конвейера, доступные через YAML:

  • Команда Azure Data Explorer (ADXAdminCommand@5) — выполнение команд администратора и управления в кластере ADX
  • Запрос Azure Data Explorer — выполнение запросов к кластеру ADX и анализ результатов
  • Шлюз сервера запросов Azure Data Explorer — безагентская задача для управления релизами по результатам запроса

Совет

Для повышения безопасности используйте федерацию удостоверений рабочей нагрузки или проверку подлинности управляемого удостоверения через соединение службы Azure Resource Manager, вместо хранения учетных данных прямо в конвейере. Эти методы проверки подлинности без ключей являются рекомендуемой практикой.

Пример команды администратора — встроенные команды

В следующем примере выполняется прямая команда администратора с использованием подключения службы Azure Resource Manager (ARM), поддерживающего аутентификацию через федерацию удостоверений для рабочих нагрузок (WIF) и управляемую идентификацию.

steps:
- task: Azure-Kusto.ADXAdminCommands.PublishToADX.ADXAdminCommand@5
  displayName: 'Run inline ADX admin command'
  inputs:
    clusterUri: 'https://<ClusterName>.<Region>.kusto.windows.net'
    databaseName: '<DatabaseName>'
    commandsSource: 'inline'
    inlineCommands: |
      .create-merge table MyTable (Id:int, Name:string, Timestamp:datetime)
      .create-or-alter function MyFunction() { MyTable | take 10 }
    azureSubscription: '<ARM Service Connection Name>'
  continueOnError: true

Пример команды администратора — команды на основе файлов

В этом примере запускаются команды администратора из файлов, соответствующих паттерну glob, с помощью аутентификации регистрации приложения AAD.

steps:
- task: Azure-Kusto.ADXAdminCommands.PublishToADX.ADXAdminCommand@5
  displayName: 'Deploy schema from files'
  inputs:
    clusterUri: 'https://<ClusterName>.<Region>.kusto.windows.net'
    databaseName: '<DatabaseName>'
    commandsSource: 'files'
    commandFilesPattern: '**/*.csl'
    aadAppId: '$(AAD_APP_ID)'
    aadAppKey: '$(AAD_APP_KEY)'
    aadTenantId: '$(AAD_TENANT_ID)'
  continueOnError: true

Вы также можете использовать **/*.kql в качестве шаблона glob в зависимости от соглашения об именовании файлов.

Пример команды администратора — подключение службы Azure Resource Manager

В следующем примере используется подключение службы Azure Resource Manager, которое поддерживает федерацию удостоверений рабочей нагрузки (WIF) и управляемое удостоверение для проверки подлинности без ключа:

steps:
- task: Azure-Kusto.ADXAdminCommands.PublishToADX.ADXAdminCommand@5
  displayName: 'Deploy schema via ARM service connection'
  inputs:
    clusterUri: 'https://<ClusterName>.<Region>.kusto.windows.net'
    databaseName: '<DatabaseName>'
    commandsSource: 'files'
    commandFilesPattern: '**/*.csl'
    azureSubscription: '<ARM Service Connection Name>'
  continueOnError: true
  condition: ne(variables['ProductVersion'], '')

Входные параметры задачи

В следующей таблице описаны ключевые входные параметры для ADXAdminCommand@5 задачи:

Параметр Описание
clusterUri Базовый универсальный код ресурса (URI) для кластера Kusto (например, https://<ClusterName>.<Region>.kusto.windows.net)
databaseName название целевой базы данных
commandsSource Источник команд: inline для встроенных команд KQL или files для команд на основе файлов
inlineCommands Встроенные команды KQL для выполнения (используется, когда commandsSource является inline)
commandFilesPattern Шаблон glob для файлов скриптов (используется, когда commandsSource это files), например **/*.csl или **/*.kql
aadAppId Идентификатор приложения Microsoft Entra (учетная запись службы) для аутентификации приложения Azure AD
aadAppKey Ключ или секрет приложения Microsoft Entra для проверки подлинности приложения AAD
aadTenantId Идентификатор клиента Microsoft Entra для проверки подлинности приложения AAD
azureSubscription Имя подключения службы Azure Resource Manager для проверки подлинности на основе ARM (поддерживает WIF и управляемое удостоверение)

Методы аутентификации

Расширение поддерживает следующие методы проверки подлинности:

  • Регистрация приложений Azure Active Directory (AAD) — используйте aadAppId, aadAppKey и aadTenantId для аутентификации с использованием учетной записи службы. Сохраните учетные данные в виде безопасных переменных конвейера.
  • Проверка подлинности на основе сертификатов — используйте сертификат вместо ключа приложения для проверки подлинности субъекта-службы. Сохраните сведения о сертификате в виде безопасных переменных конвейера.
  • Управляемое удостоверение — используйте подключение службы Azure Resource Manager, настроенное с управляемым удостоверением. Задайте входные azureSubscription данные для имени подключения службы.
  • Workload Identity Federation (WIF) — используйте подключение службы Azure Resource Manager с Workload Identity Federation (автоматически или вручную). Это рекомендуемый подход без ключа. Задайте входной параметр azureSubscription для имени подключения к службе.

Примечание.

Workload Identity Federation (WIF) — это новое дополнение к расширению. Он обеспечивает проверку подлинности без секретов и рекомендуется использовать для новых конвейеров обработки данных. См. инструкции по настройке в использовании федеративных учетных данных идентификации или управляемых удостоверений в сервисном подключении Azure Resource Manager (ARM).

Пример запроса

steps:
- task: Azure-Kusto.PublishToADX.ADXQuery.ADXQuery@5
  displayName: '<Task Display Name>'
  inputs:
    targetType: 'inline'
    script: |
     let badVer=
     RunnersLogs | where Timestamp > ago(30m)
         | where EventText startswith "$$runnerresult" and Source has "ShowDiagnostics"
         | extend State = extract(@"Status='(.*)', Duration.*",1, EventText)
         | where State == "Unhealthy"
         | extend Reason = extract(@'"NotHealthyReason":"(.*)","IsAttentionRequired.*',1, EventText)
         | extend Cluster = extract(@'Kusto.(Engine|DM|CM|ArmResourceProvider).(.*).ShowDiagnostics',2, Source)
         | where Reason != "Merge success rate past 60min is < 90%"
         | where Reason != "Ingestion success rate past 5min is < 90%"
         | where Reason != "Ingestion success rate past 5min is < 90%, Merge success rate past 60min is < 90%"
         | where isnotempty(Cluster)
         | summarize max(Timestamp) by Cluster,Reason
         | order by  max_Timestamp desc
         | where Reason startswith "Differe"
         | summarize by Cluster
     ;
      DimClusters | where Cluster in (badVer)
     | summarize by Cluster , CmConnectionString , ServiceConnectionString ,DeploymentRing
     | extend ServiceConnectionString = strcat("#connect ", ServiceConnectionString)
     | where DeploymentRing == "$(DeploymentRing)"
    kustoUrls: 'https://<ClusterName>.kusto.windows.net?DatabaseName=<DatabaseName>'
    authType: 'kustoserviceconn'
    connectedServiceName: '<connection service name>'
    minThreshold: '0'
    maxThreshold: '10'
  continueOnError: true