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

