Для одного из наших клиентов я настраиваю конвейер сборки и развертывания в 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'
Настройки подключения сервиса:
Как видите, здесь ограничений на подключение услуги также нет:
Любая помощь будет оценена по достоинству.
Извините, мне следовало уточнить это. Этот шаблон yaml фактически вызывается через другой файл, который фактически запускается конвейером. Этот основной файл использует группу переменных для получения значений serviceConnectionPrefix и Environment. Затем они передаются в качестве параметров в файл yaml, который фактически выполняет развертывание. Но в сообщении об ошибке я вижу, что полное имя подключения к службе правильное, так что проблема не в этом.
Да. Полностью согласен. Значение параметров должно быть правильным. Вы можете проверить, действительно ли подключение к службе. Я поделился шагами в ответе. Вы можете это проверить.
Так как имя сервисного подключения правильное и настроено на основе переменных в группах переменных
TL;DR Имена подключений служб не могут храниться в группах переменных. Вместо этого объявите их как переменные в своем конвейере или шаблоне YAML.
Кроме того, не забудьте вручную поставить в очередь хотя бы одну сборку, чтобы авторизовать любые подключения к службам.
Переменные в группах переменных доступны во время выполнения, поэтому они доступны только после запуска конвейера.
Учитывая, что подключение к сервису — это защищенный ресурс , который необходимо авторизовать до запуска конвейера (т.е. во время компиляции), мы не можем использовать переменные из групп переменных. Можно использовать только значения, доступные во время компиляции.
variables:
- name: azureSubscription
value: dev-service-connection
# other dev variables here
variables:
- name: azureSubscription
value: qa-service-connection
# other qa variables here
variables:
- name: azureSubscription
value: prod-service-connection
# other prod variables here
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 в качестве параметров. Поскольку имя соединения правильно указано в сообщении об ошибке, я знаю, что параметры передаются правильно с правильными значениями. Мы настраивали этот тип конвейера много раз, единственная разница — это использование федерации удостоверений рабочей нагрузки.
возникла проблема с авторизацией ресурса: «Конвейер недействителен. Задание 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, я прекрасно вижу соединение со службой.
@KoenvanWielink Можете ли вы подтвердить, как создать соединение со службой ARM типа федерации удостоверений рабочей нагрузки? В пользовательском интерфейсе или использовать Rest API или другие методы? Тогда я смогу провести дальнейшие испытания.
Если возможно, можете ли вы попытаться вручную создать автоматическое подключение к службе ARM типа федерации удостоверений рабочей нагрузки в пользовательском интерфейсе Azure DevOps (Настройки проекта -> Подключения к службам)?
Кроме того, вы также можете попробовать следующие два метода: 1. Отредактируйте имя существующего подключения к службе и сохраните его. 2. Создайте новый конвейер, используя тот же файл yaml, и проверьте, работает ли он.
Подключение к службе было создано с использованием пользовательского интерфейса DevOps с использованием параметра федерации удостоверений рабочей нагрузки (автоматического). К сожалению, у меня нет прав пользователя на создание нового соединения или изменение существующего. Изменение имени привело к ошибке «При попытке ротации секретов конечной точки службы возникла одна или несколько проблем. Дополнительные сведения: недостаточно прав для завершения операции в Microsoft Graph». Я обсуждаю с ИТ-провайдером, могут ли они временно предоставить мне необходимый доступ.
@KoenvanWielink Да. Сообщение об ошибке означает, что у вас нет разрешения. Вы можете связаться с администратором, чтобы узнать, могут ли они дать вам разрешение или помочь вам выполнить операцию.
С другой стороны, вы можете попытаться жестко запрограммировать имя подключения службы в существующем конвейере или создать новый конвейер с тем же файлом YAML. Затем вы можете проверить, может ли он внести какие-либо изменения.
Я нашел проблему, но мне почти стыдно признаться в этом. Ваша идея жестко закодировать имя соединения наконец указала мне в правильном направлении. Я случайно поставил пробел перед одним из имен переменных в библиотеке... Теперь я забронирую билет в один конец в Непал и спрячусь монахом в монастыре примерно на десять лет...
@KoenvanWielink Нет проблем. Это действительно очень скрытый вопрос. Но я рад узнать, что теперь проблема может быть решена!
Решение было настолько глупым, насколько это возможно. Я оставил пробел перед переменной ServiceConnectionPrefix. Удаление пространства тоже решило проблему... Теперь буду прятаться от стыда десять лет...
У каждого из нас бывают постыдные моменты, не беспокойтесь об этом :-)
Since the name of the service connection is correct and configured based on variables in the variable groups,
Судя по вашему описанию, имя подключения службы настраивается переменными в группе переменных. Но в образце YAMLazureSubscription: '${{ parameters.ServiceConnectionPrefix}}${{ parameters.env }}'
поле подписки Azure использует параметры. Можете ли вы объяснить этот момент более четко?