You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Azure DevOps经典发布管道中自动化Azure应用配置角色分配?

为Azure App Configuration分配Data Reader角色的脚本改造方案

问题背景

我们为Web服务部署了经典Azure发布管道,近期为该服务添加了Azure App Configuration。当前管道中运行如下PowerShell脚本,自动为应用的托管标识分配Azure KeyVault角色:

param (
   [string][Parameter(Mandatory=$true)]$resourceGroupName,
   [string]$keyVaultName
)

$lastDeployment = Get-AzureRmResourceGroupDeployment -ResourceGroupName $resourceGroupName | Sort Timestamp -Descending | Select -First 1 

if(!$lastDeployment) {
    throw "Deployment could not be found for Resource Group '$resourceGroupName'."
}

if(!$lastDeployment.Outputs) {
    throw "No output parameters could be found for the last deployment of Resource Group '$resourceGroupName'."
}

$servicePrincipalName = $lastDeployment.Outputs.Item("appname").Value
Write-host $servicePrincipalName
$servicePrincipalId = $(Get-AzureRmADServicePrincipal -DisplayName $servicePrincipalName).Id
Write-host $servicePrincipalId
Set-AzureRmKeyVaultAccessPolicy -VaultName $keyVaultName -ObjectId $servicePrincipalId -PermissionsToSecrets List,Get -BypassObjectIdValidation

需要修改脚本,为管道中最后部署的应用的托管标识分配Azure App Configuration的Data Reader角色。


解决方案

Azure App Configuration的权限通过Azure RBAC(基于角色的访问控制)管理,而非Key Vault专属的访问策略机制。因此需要替换脚本中权限分配的核心逻辑,使用RBAC角色分配命令完成操作。

修改后的PowerShell脚本(AzureRm模块)

param (
   [string][Parameter(Mandatory=$true)]$resourceGroupName,
   [string][Parameter(Mandatory=$true)]$appConfigName
)

# 获取资源组最新部署记录
$lastDeployment = Get-AzureRmResourceGroupDeployment -ResourceGroupName $resourceGroupName | Sort Timestamp -Descending | Select -First 1 

if(!$lastDeployment) {
    throw "Deployment could not be found for Resource Group '$resourceGroupName'."
}

if(!$lastDeployment.Outputs) {
    throw "No output parameters could be found for the last deployment of Resource Group '$resourceGroupName'."
}

# 从部署输出中获取托管标识的显示名称
$servicePrincipalName = $lastDeployment.Outputs.Item("appname").Value
Write-host "托管标识名称: $servicePrincipalName"

# 获取托管标识的Object ID
$servicePrincipal = Get-AzureRmADServicePrincipal -DisplayName $servicePrincipalName
if(!$servicePrincipal) {
    throw "未找到显示名称为 '$servicePrincipalName' 的托管标识。"
}
$servicePrincipalId = $servicePrincipal.Id
Write-host "托管标识Object ID: $servicePrincipalId"

# 获取Azure App Configuration资源的完整ID
$appConfigResource = Get-AzureRmResource -ResourceGroupName $resourceGroupName -ResourceType "Microsoft.AppConfiguration/configurationStores" -ResourceName $appConfigName
if(!$appConfigResource) {
    throw "未找到资源组 '$resourceGroupName' 中的Azure App Configuration实例 '$appConfigName'。"
}
$appConfigResourceId = $appConfigResource.ResourceId

# 分配App Configuration Data Reader角色
New-AzureRmRoleAssignment -ObjectId $servicePrincipalId -RoleDefinitionName "App Configuration Data Reader" -Scope $appConfigResourceId

关键修改说明

  • 参数调整:将原脚本的$keyVaultName参数替换为$appConfigName,用于指定目标Azure App Configuration实例名称
  • 权限逻辑替换:用New-AzureRmRoleAssignment替代Set-AzureRmKeyVaultAccessPolicy,因为App Configuration依赖RBAC进行权限管控
  • 资源范围指定:必须获取App Configuration资源的完整ID,作为角色分配的作用范围,确保权限仅作用于目标实例
  • 角色选择:使用Azure内置的App Configuration Data Reader角色,该角色拥有读取配置项、快照等资源的必要权限

额外注意事项

  1. 执行脚本的服务主体需具备RBAC管理员或所有者权限,才能完成角色分配操作
  2. AzureRm模块已被官方弃用,建议迁移至Az模块,对应命令替换如下:
    • Get-AzureRmResourceGroupDeployment → Get-AzResourceGroupDeployment
    • Get-AzureRmADServicePrincipal → Get-AzADServicePrincipal
    • Get-AzureRmResource → Get-AzResource
    • New-AzureRmRoleAssignment → New-AzRoleAssignment

内容的提问来源于stack exchange,提问作者JustAMartin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 12:07:49