如何在Bicep中获取Synapse服务主体App ID并添加为AAS管理员
问题场景
使用Bicep部署Azure服务时,为Synapse工作区配置SystemAssigned类型的系统分配托管标识后,Azure会自动创建关联的企业应用(服务主体),包含名称、对象ID(object id)、应用ID(app id),该标识是Synapse管道处理Azure Analysis Services任务的必要前提。
Synapse工作区的基础部署代码如下:
//Create Synapse Analytics resource synapseAnalytics 'Microsoft.Synapse/workspaces@2021-06-01' = { name: synapse_name location: region identity: { type: 'SystemAssigned' } properties: { defaultDataLakeStorage: { filesystem: storage_account_fileshare_name resourceId: storageAccount.id accountUrl: storage_account_url createManagedPrivateEndpoint: true } managedVirtualNetwork: 'default' publicNetworkAccess: 'Enabled' managedResourceGroupName: synapse_workspace_name azureADOnlyAuthentication: false cspWorkspaceAdminProperties: { initialWorkspaceAdminObjectId: xxxx } } dependsOn: [ storageAccountFileshare ] }
需求是在Bicep代码内直接获取该自动生成的托管标识对应的App ID,将其添加为Azure Analysis Service(AAS)的管理员,AAS的部署代码占位如下:
resource analysisServices 'Microsoft.AnalysisServices/servers@2017-08-01' = { name: anaylsis_services_name location: region sku: { name: 'B1' tier: 'Basic' capacity: 1 } properties: { asAdministrators: { members: [ 'obj:xxxxxx-xxxxxx-xxxxx-xxxxx@xxxxx-xxx-xxxxx-xxxxx' 'app:{GET APP ID OF SYNAPSE}' // 需要在此处填入Synapse托管标识的App ID ] } managedMode: 1 } }
已知可以通过Azure CLI命令手动查询App ID,但该命令需要传入托管标识的对象ID作为参数,部署前无法提前获取该值,因此无法提前执行命令取值:
az ad sp show --id {object-id} --query appId
实现方法
Synapse工作区创建完成后,资源的identity.principalId属性会直接返回系统分配托管标识对应服务主体的对象ID,你只需要在Bicep中通过existing关键字引用该服务主体资源,即可直接读取到对应的App ID,不需要提前执行命令查询。
- 首先在Synapse资源声明后,添加对托管标识对应服务主体的引用(使用官方推荐的Microsoft Graph资源类型,旧版Azure AD资源类型已弃用):
// 引用Synapse系统分配托管标识对应的Azure AD服务主体 resource synapseManagedIdentitySp 'Microsoft.Graph/servicePrincipals@v1.0' existing = { id: synapseAnalytics.identity.principalId }
- 之后直接在AAS的管理员配置中,通过
synapseManagedIdentitySp.appId取值即可,修改后的AAS配置代码如下:
resource analysisServices 'Microsoft.AnalysisServices/servers@2017-08-01' = { name: anaylsis_services_name location: region sku: { name: 'B1' tier: 'Basic' capacity: 1 } properties: { asAdministrators: { members: [ 'obj:xxxxxx-xxxxxx-xxxxx-xxxxx@xxxxx-xxx-xxxxx-xxxxx' 'app:${synapseManagedIdentitySp.appId}' ] } managedMode: 1 } }
注意事项
- 执行Bicep部署的身份(用户账号/部署用服务主体)需要拥有Microsoft Graph的
Application.Read.All权限,否则读取服务主体属性时会返回403权限错误。 - 不需要手动给AAS资源和Synapse资源添加
dependsOn依赖配置,Bicep会自动识别资源间的引用关系,按正确顺序执行部署。
内容的提问来源于stack exchange,提问作者justsander
相关产品推荐
相关产品推荐

