使用Bicep为Azure Function配置Key Vault访问策略报objectId错误如何解决
错误原因
你传入的objectId参数值错误。test_resource.id是Azure Function资源自身的ARM资源路径,格式为类似/subscriptions/<订阅ID>/resourceGroups/<资源组名>/providers/Microsoft.Web/sites/<函数名>的层级路径。而Key Vault访问策略的objectId字段要求传入Azure AD对象的GUID格式主体ID,二者完全不匹配,因此触发Invalid value found at accessPolicies[0].ObjectId报错。
修复方案
你配置的Function开启了系统分配托管标识,该标识创建完成后会自动生成对应的AAD主体ID,直接引用Bicep中Function资源输出的identity.principalId属性作为objectId即可,无需手动查询ID值。
修正后的访问策略代码片段:
resource devops_keyvault 'Microsoft.KeyVault/vaults@2021-10-01' existing = { name: keyVaultName } resource keyvault_access_policy 'Microsoft.KeyVault/vaults/accessPolicies@2021-10-01' = { name: 'add' parent: devops_keyvault properties: { accessPolicies: [ { objectId: test_resource.identity.principalId // 替换为托管标识的主体ID permissions: { 'keys': [] 'secrets': [ 'list' 'get' ] 'certificates': [ 'list' 'get' ] } tenantId: subscription().tenantId } ] } }
注意事项
- Bicep会自动识别该引用的依赖关系,部署时会先完成Function资源及其系统托管标识的创建,再执行Key Vault访问策略的部署,不需要额外显式配置
dependsOn。 - 如果后续使用用户分配托管标识,同样需要传入对应托管标识资源的
principalId属性,不能传入Function资源自身的ARM ID。 - 不要将托管标识的
principalId和函数发布凭据、部署槽相关ID混淆,系统分配托管标识的主体ID固定存放在资源的identity.principalId字段下。
内容的提问来源于stack exchange,提问作者floormind
相关产品推荐
相关产品推荐

