如何通过ARM模板内置函数获取Azure AD服务主体ID
ARM模板获取Azure AD服务主体ID的方案说明
核心能力结论
原生ARM模板的内置函数不支持直接查询获取Azure AD服务主体ID,ARM内置函数的作用域仅覆盖Azure资源管理层级,无法直接调用Microsoft Graph接口查询AAD实体信息,因此不存在和Get-AzADServicePrincipal -DisplayName "Azure Service Fabric Resource Provider"直接等价的ARM内置函数实现。
跨租户无硬编码部署替代方案
针对你需要多租户部署、避免硬编码服务主体ID的需求,可采用以下ARM原生支持的方案实现:
- 使用ARM原生
deploymentScripts资源实现运行时查询
你可以在ARM模板中声明Microsoft.Resources/deploymentScripts类型资源,在部署流程中内嵌PowerShell脚本查询服务主体ID,输出结果后直接供模板后续资源调用,无需提前手动查询硬编码,示例模板片段如下:
{ "type": "Microsoft.Resources/deploymentScripts", "apiVersion": "2020-10-01", "name": "getSFRPServicePrincipalId", "location": "[resourceGroup().location]", "kind": "AzurePowerShell", "identity": { "type": "SystemAssigned" }, "properties": { "azPowerShellVersion": "8.0", "scriptContent": " $sfRpSp = Get-AzADServicePrincipal -DisplayName \"Azure Service Fabric Resource Provider\" $DeploymentScriptOutputs['sfRpSpObjectId'] = $sfRpSp.Id ", "cleanupPreference": "OnSuccess", "retentionInterval": "PT1H" } }
后续在模板中需要使用服务主体ID的位置,直接引用部署脚本的输出即可:[reference('getSFRPServicePrincipalId').outputs.sfRpSpObjectId]
注意:部署脚本使用的系统分配托管身份默认具备租户内普通成员权限,足以查询第一方资源提供方的服务主体信息,无需额外配置AAD权限。
内容的提问来源于stack exchange,提问作者giaour
相关产品推荐
相关产品推荐

