Развертывание Azure DevOps SQL DacPac не работает с подключением службы

Для одного из наших клиентов я настраиваю конвейер сборки и развертывания в Azure DevOps для базы данных SQL Azure. Раньше мы делали это много раз без проблем, но я впервые использую сервисное соединение типа «Федерация удостоверений рабочей нагрузки». Я изменил код YAML по мере необходимости и подключил группы переменных к конвейеру, но продолжаю получать следующую ошибку:

Возникла проблема с авторизацией ресурса: «Конвейер недействителен. Задание Deployment_job_prod: входные данные azureSubscription ссылаются на соединение службы DEVOPS_mdwh_connection_prod, которое не найдено. Соединение службы не существует, отключено или не разрешено для использования.

Поскольку имя подключения службы правильное и настроено на основе переменных в группах переменных, я знаю, что к ним можно получить доступ. Нажатие кнопки «Авторизовать ресурсы» рядом с сообщением об ошибке, похоже, ничего не дает. Я пробовал изменить AuthorizationType в сценарии YAML на servicePrincipal, WorkloadIdentityFederation или просто отключил его, но, похоже, это тоже не имеет значения.

Я здесь немного растерялся. Microsoft рекомендует сейчас использовать Workload Identity Federation вместо субъектов-служб, поэтому я не хочу возвращаться к этому. Может ли кто-нибудь здесь помочь мне понять, чего мне не хватает? Ниже приведен используемый YAML-код, а также настройки подключения службы:

- name: env
  displayName: Environment
  type: string
  values:
    - tst
    - acc
    - prod
- name: ServiceConnectionPrefix
  displayName: Service Connection Prefix
  type: string
- name: SQLDatabaseName
  displayName: SQL Database Name
  type: string
- name: SQLProjectName
  displayName: SQL Project Name
  type: string

jobs:
  - deployment: deployment_job_${{ parameters.env }}
    displayName: Deployment Job ${{ parameters.env }}
    environment: Deploy to ${{ parameters.env }}
    variables:
      - group: 'VG-MDWH-${{ upper(parameters.env) }}'

    strategy:
      runOnce:
        deploy:
          steps:
            - checkout: self
              displayName: 1. Retrieve repository

            - task: SqlAzureDacpacDeployment@1
              displayName: 2. Deploy DACPAC
              inputs:
                azureSubscription: '${{ parameters.ServiceConnectionPrefix}}${{ parameters.env }}'
                ## AuthenticationType: 'WorkloadIdentityFederation'
                ServerName: '$(ServerName)'
                DatabaseName: '${{ parameters.SQLDatabaseName }}'
                deploymentType: 'DacpacTask'
                DeploymentAction: 'Publish'
                DacpacFile: '$(Pipeline.Workspace)/${{ parameters.SQLProjectName }}/${{ parameters.SQLProjectName }}/bin/debug/${{ parameters.SQLProjectName }}.dacpac'
                PublishProfile: '$(Pipeline.Workspace)/${{ parameters.SQLProjectName }}/${{ parameters.SQLProjectName }}/${{ parameters.SQLProjectName }}_${{ parameters.env }}.publish.xml'

Настройки подключения сервиса:

Как видите, здесь ограничений на подключение услуги также нет:

Любая помощь будет оценена по достоинству.

Since the name of the service connection is correct and configured based on variables in the variable groups, Судя по вашему описанию, имя подключения службы настраивается переменными в группе переменных. Но в образце YAML azureSubscription: '${{ parameters.ServiceConnectionPrefix}}${{ parameters.env }}' поле подписки Azure использует параметры. Можете ли вы объяснить этот момент более четко?
Kevin Lu-MSFT 05.07.2024 16:35

Извините, мне следовало уточнить это. Этот шаблон yaml фактически вызывается через другой файл, который фактически запускается конвейером. Этот основной файл использует группу переменных для получения значений serviceConnectionPrefix и Environment. Затем они передаются в качестве параметров в файл yaml, который фактически выполняет развертывание. Но в сообщении об ошибке я вижу, что полное имя подключения к службе правильное, так что проблема не в этом.

Koen van Wielink 08.07.2024 09:14

Да. Полностью согласен. Значение параметров должно быть правильным. Вы можете проверить, действительно ли подключение к службе. Я поделился шагами в ответе. Вы можете это проверить.

Kevin Lu-MSFT 08.07.2024 09:29
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
Как установить LAMP Stack 1/2 на Azure Linux VM
Как установить LAMP Stack 1/2 на Azure Linux VM
В дополнение к нашему предыдущему сообщению о намерении Azure прекратить поддержку Azure Database для MySQL в качестве единого сервера после 16...
1
3
111
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Так как имя сервисного подключения правильное и настроено на основе переменных в группах переменных

TL;DR Имена подключений служб не могут храниться в группах переменных. Вместо этого объявите их как переменные в своем конвейере или шаблоне YAML.

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

Подробнее

Переменные в группах переменных доступны во время выполнения, поэтому они доступны только после запуска конвейера.

Учитывая, что подключение к сервису — это защищенный ресурс , который необходимо авторизовать до запуска конвейера (т.е. во время компиляции), мы не можем использовать переменные из групп переменных. Можно использовать только значения, доступные во время компиляции.

Пример

/pipelines/variables/dev-variables.yaml
variables:
  - name: azureSubscription
    value: dev-service-connection

  # other dev variables here
/pipelines/variables/qa-variables.yaml
variables:
  - name: azureSubscription
    value: qa-service-connection

  # other qa variables here
/pipelines/variables/prod-variables.yaml
variables:
  - name: azureSubscription
    value: prod-service-connection

  # other prod variables here
мой-pipeline.yaml
jobs:
  - deployment: deployment_job_${{ parameters.env }}
    displayName: Deployment Job ${{ parameters.env }}
    environment: Deploy to ${{ parameters.env }}
    variables:
      - template: /pipelines/variables/${{ parameters.env }}-variables.yaml # <------- reference variables template here
    strategy:
      runOnce:
        deploy:
          steps:
            - checkout: self
              displayName: 1. Retrieve repository

            - task: SqlAzureDacpacDeployment@1
              displayName: 2. Deploy DACPAC
              inputs:
                azureSubscription: ${{ variables.azureSubscription }} # <------- from variables template referenced above
                # other inputs...

Спасибо за Ваш ответ. Думаю, я забыл упомянуть, что этот шаблон вызывается другим шаблоном, который на самом деле инициируется конвейером. Этот основной шаблон считывает переменные из группы переменных, например serviceConnectionPrefix и Environment. Они передаются в SQLDeploy.yml в качестве параметров. Поскольку имя соединения правильно указано в сообщении об ошибке, я знаю, что параметры передаются правильно с правильными значениями. Мы настраивали этот тип конвейера много раз, единственная разница — это использование федерации удостоверений рабочей нагрузки.

Koen van Wielink 08.07.2024 09:18

возникла проблема с авторизацией ресурса: «Конвейер недействителен. Задание Deployment_job_prod: Шаг ввода azureSubscription ссылается на соединение службы DEVOPS_mdwh_connection_prod, которое не удалось найти.

В сообщении об ошибке отображается имя подключения службы: DEVOPS_mdwh_connection_prod. Это означает, что параметры передали правильное значение в поле azureSubscription. Параметры в файле YAML должны быть правильными.

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

В этом случае будет показана та же ошибка.

Например:

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

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

Шаг 1. Вручную выполните поиск задачи sql в редакторе пользовательского интерфейса YAML.

Шаг 2. Вы можете выбрать задачу sql и проверить, видите ли вы соединение службы DEVOPS_mdwh_connection_prod в раскрывающемся списке подключений службы.

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

Чтобы решить эту проблему, вы можете перейти в «Настройки проекта» -> «Соединения служб» и автоматически создать новое соединение службы ARM типа федерации удостоверений рабочей нагрузки в пользовательском интерфейсе Azure DevOps и проверить, может ли оно работать.

Или вы можете попытаться вручную создать подключение к службе ARM типа федерации удостоверений рабочей нагрузки. Для получения более подробной информации вы можете обратиться к этому документу: Настройте вручную подключение к службе идентификации рабочей нагрузки Azure Resource Manager

Примечание. Поле AuthenticationType в SqlAzureDacpacDeployment@1 используется для управления подключениями к SQL-серверу Azure. Оно не связано с полем azureSubscription и не поддерживает значение WorkloadIdentityFederation. См. этот документ: SqlAzureDacpacDeployment@1 — задача развертывания базы данных SQL Azure v1

Спасибо за подробное объяснение, Кевин. Однако, когда я пытаюсь создать задачу SQL, я прекрасно вижу соединение со службой.

Koen van Wielink 08.07.2024 14:41

@KoenvanWielink Можете ли вы подтвердить, как создать соединение со службой ARM типа федерации удостоверений рабочей нагрузки? В пользовательском интерфейсе или использовать Rest API или другие методы? Тогда я смогу провести дальнейшие испытания.

Kevin Lu-MSFT 08.07.2024 14:46

Если возможно, можете ли вы попытаться вручную создать автоматическое подключение к службе ARM типа федерации удостоверений рабочей нагрузки в пользовательском интерфейсе Azure DevOps (Настройки проекта -> Подключения к службам)?

Kevin Lu-MSFT 08.07.2024 15:06

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

Kevin Lu-MSFT 08.07.2024 15:44

Подключение к службе было создано с использованием пользовательского интерфейса DevOps с использованием параметра федерации удостоверений рабочей нагрузки (автоматического). К сожалению, у меня нет прав пользователя на создание нового соединения или изменение существующего. Изменение имени привело к ошибке «При попытке ротации секретов конечной точки службы возникла одна или несколько проблем. Дополнительные сведения: недостаточно прав для завершения операции в Microsoft Graph». Я обсуждаю с ИТ-провайдером, могут ли они временно предоставить мне необходимый доступ.

Koen van Wielink 08.07.2024 16:30

@KoenvanWielink Да. Сообщение об ошибке означает, что у вас нет разрешения. Вы можете связаться с администратором, чтобы узнать, могут ли они дать вам разрешение или помочь вам выполнить операцию.

Kevin Lu-MSFT 08.07.2024 16:42

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

Kevin Lu-MSFT 08.07.2024 16:43

Я нашел проблему, но мне почти стыдно признаться в этом. Ваша идея жестко закодировать имя соединения наконец указала мне в правильном направлении. Я случайно поставил пробел перед одним из имен переменных в библиотеке... Теперь я забронирую билет в один конец в Непал и спрячусь монахом в монастыре примерно на десять лет...

Koen van Wielink 09.07.2024 14:06

@KoenvanWielink Нет проблем. Это действительно очень скрытый вопрос. Но я рад узнать, что теперь проблема может быть решена!

Kevin Lu-MSFT 09.07.2024 14:08
Ответ принят как подходящий

Решение было настолько глупым, насколько это возможно. Я оставил пробел перед переменной ServiceConnectionPrefix. Удаление пространства тоже решило проблему... Теперь буду прятаться от стыда десять лет...

У каждого из нас бывают постыдные моменты, не беспокойтесь об этом :-)

Rui Jarimba 09.07.2024 19:51

Другие вопросы по теме

Azure Devops Pipeline, покажите ссылку на отчет Sonar на сводной странице запуска конвейера
NU1100: невозможно разрешить пакет nuget Azure DevOps
Я хочу опубликовать zip-файл, а затем загрузить его непосредственно из канала Azure Artifact. Какая задача мне поможет в этом?
Как связать рабочие элементы для сборки конвейера yaml при использовании ветвей выпуска?
Термин «скрипт:» не распознается как имя командлета, функции, файла сценария или исполняемой программы
Ошибка обнаружения текущей ветки: фатальный: ref HEAD не является символической ссылкой в ​​выпуске mvn — Azure Pipeline
Как настроить проверку утверждения конвейера Azure для развертывания в приложениях-функциях Azure?
Ошибка: невозможно зарегистрировать свойство «TestType» как тип значения «System.Guid», поскольку оно уже зарегистрировано как «System.String»
Использование API Azure Devops в Python для получения всех измененных файлов в PR
Измените обработку заданий с FIFO на LIFO

Похожие вопросы