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

Github Actions中Bicep模块化部署KeyVault失败,本地手动执行正常的问题排查求助

Github Actions中Bicep模块化部署KeyVault失败,本地手动执行正常的问题排查求助

我最近碰到一个特别头疼的问题:本地用自己的Azure账号手动执行Bicep部署完全没问题,但放到GitHub Actions里用服务主体认证就报错,折腾了好几天都没找到根因,想请教大家有没有类似的经验或者思路。

具体情况如下:

  • 本地执行完全正常:
    我用az login登录自己的Azure Portal账号后,执行以下命令都能顺利完成部署:

    az login
    az deployment group what-if --resource-group $RESOURCE_GROUP_NAME --template-file ./infrastructure/bicep/main.bicep --parameters ./infrastructure/bicep/params.json
    az deployment group create (参数和上面一致)
    
  • GitHub Actions自动化部署失败:
    我专门创建了服务主体用于工作流认证,命令如下:

    az ad sp create-for-rbac --name azure-contributor-github-service-principal --role contributor --scope /subscriptions/$SUBSCRIPTION_ID
    

    把服务主体的相关信息存成GitHub Secrets后,执行和本地一样的部署命令,却抛出了这个错误:

    "Multiple errors occurred: BadRequest. Please see the details.
    BadRequest - The specified KeyVault '/subscriptions/***/resourceGroups/<my_rg_name>/providers/Microsoft.KeyVault/vaults/<my_kv_name>' could not be found."

    我的Bicep脚本里明明定义了名为<my_kv_name>的KeyVault资源,一开始我以为是服务主体权限不够,哪怕改成owner角色也还是报同样的错,而且找不到更多调试日志,完全摸不着头绪。


更新1:尝试添加KeyVault访问策略

根据建议,我在Bicep代码里给服务主体加了KeyVault的密钥全权限访问策略,代码如下:

resource keyVaultAccessPolicyForSecrets 'Microsoft.KeyVault/vaults/accessPolicies@2022-07-01' = {
  name: '${keyVault.name}/policy'
  properties: {
    accessPolicies: [
      {
        applicationId: spPolicyAppId
        objectId: spPolicyObjectId
        tenantId: spPolicyTenantId
        permissions: {
          secrets: [ 'all' ]
        }
      }
    ]
  }
}

但结果还是一样,依旧报KeyVault找不到的错误。


更新2:调整Bicep结构后部署成功

后来我试着调整了Bicep的文件结构,居然成功了,这让我意识到问题可能不是服务主体权限的问题。先说说我之前的结构:

  • core.bicep:负责创建容器注册表、KeyVault和KeyVault密钥
  • aca.bicep:负责创建Log Analytics工作区、容器应用环境和容器应用
  • main.bicep:通过module引用core.bicep创建KeyVault,然后用existing关键字引用这个刚创建的KeyVault,再把它的密钥作为参数传给aca.bicep模块

之前的main.bicep代码是这样的:

module core 'core.bicep' = {
  name: 'core'
  params: {
    location: location
    solution: solution
    spPolicyAppId: spPolicyAppId
    spPolicyObjectId: spPolicyObjectId
    spPolicyTenantId: spPolicyTenantId
  }
}

resource keyVault 'Microsoft.KeyVault/vaults@2022-07-01' existing = {
  name: core.outputs.KeyVaultName
}

module devAca 'aca.bicep' = {
  name: 'devAca'
  dependsOn: [
    core
  ]
  params: {
    env: 'dev'
    location: location
    project: project
    solution: solution
    containerRegistryName: core.outputs.ContainerRegistryName
    containerRegistryPassword: keyVault.getSecret(core.outputs.ContainerRegistrySecretName)
    imageName: imageName
    imageTag: imageTag
  }
}

当我把模块里的代码全部移到main.bicep里,去掉模块化结构后,部署居然成功了!而且我甚至删掉了KeyVault访问策略,整个基础设施(包括KeyVault和里面的密钥)都能正常部署。

所以我现在的结论是:问题大概率出在我对Bicep的module关键字的使用方式上,但具体是哪里错了还是搞不清楚,想请教各位大佬有没有遇到过类似的模块化部署问题?

备注:内容来源于stack exchange,提问作者Kalin Krastev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 14:03:13