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

通过Bicep调用PowerShell脚本时无法找到Azure订阅的问题排查

问题原因

本地命令行运行脚本时用的是你已登录的Azure上下文,但Bicep调用的deploymentScripts是在Azure托管的独立容器环境中执行的,和本地PowerShell会话完全隔离,不会共享本地的登录凭据,所以会报“上下文未找到订阅”的错误。

解决方案

推荐用托管标识给Deployment Script授权,这是最安全的Azure最佳实践,步骤如下:

1. 修改Bicep代码,添加托管标识及权限

在deploymentScripts资源里启用系统托管标识,并分配认知服务账户的操作权限:

var scriptArgumentsEndpoint = {
  resourceName: language.name
  resourceGroup: resourceGroup().name
}

var scriptContentEndpoint = loadTextContent('./disablePublicAccess.ps1')

resource scriptEndpoint 'Microsoft.Resources/deploymentScripts@2020-10-01' = {
  name: 'DisableendpointScript'
  location: location
  kind: 'AzurePowerShell'
  // 启用系统托管标识
  identity: {
    type: 'SystemAssigned'
  }
  properties: {
    azPowerShellVersion: '10.1'
    retentionInterval: 'PT1H'
    scriptContent: scriptContentEndpoint
    arguments: join(map(items(scriptArgumentsEndpoint), arg => '-${arg.key} ${arg.value}'), ' ')
  }
}

// 给托管标识分配认知服务Contributor权限(角色ID固定)
resource scriptIdentityRoleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
  name: guid(scriptEndpoint.id, resourceGroup().id, 'b24988ac-6180-42a0-ab88-20f7382dd24c')
  scope: resourceGroup()
  properties: {
    principalId: scriptEndpoint.identity.principalId
    roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'b24988ac-6180-42a0-ab88-20f7382dd24c')
  }
}

2. 调整PowerShell脚本(可选)

使用系统托管标识时,Deployment Script会自动配置Azure上下文,无需手动调用Connect-AzAccount,原脚本可以直接使用。如果需要显式确认,也可以在脚本开头添加:

Connect-AzAccount -Identity

补充说明

  • 若使用用户分配的托管标识,只需将identity.type改为UserAssigned,并指定对应的标识ID,再给该标识分配权限即可。
  • 绝对不要在脚本里硬编码凭据或依赖本地登录会话,这既不安全也不符合Azure部署规范。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 02:37:33