Azure Bicep - 角色分配 - 主体在目录中不存在

Azure Bicep - Role assignment - Principal does not exist in the directory

我创建了一个二头肌模板。我在其中创建了一个用户分配的身份,并在其他资源中引用它,例如

var identityName = 'mid-dd-test'
var roleName = 'TestRole'
var roleDescription = 'Some test'
var roleScopes = [
    resourceGroup().id
]
var resolvedActions = [
    'Microsoft.Resources/subscriptions/resourcegroups/*'
  'Microsoft.Compute/sshPublicKeys/*'
]
var permittedDataActions = []

resource userId 'Microsoft.ManagedIdentity/userAssignedIdentities@2018-11-30' = {
  name: identityName
  location: resourceGroup().location  
}

resource roleDef 'Microsoft.Authorization/roleDefinitions@2018-01-01-preview' = {
  name: guid(subscription().id, 'bicep', 'dsadsd')  
  properties: {
    roleName: roleName
    description: roleDescription
    type: 'customRole'    
    assignableScopes: roleScopes
    permissions: [
      {        
        actions: resolvedActions
        dataActions: permittedDataActions
      }
    ]
  }
}

resource roles 'Microsoft.Authorization/roleAssignments@2018-09-01-preview' = {
  name: guid(subscription().id, 'bicep-roleassignments', 'dsddsd')  
  properties: {
    principalId: userId.properties.principalId
    roleDefinitionId: roleDef.id
  }
}

每当我部署它时,我都需要 2 运行s。第一个运行以错误信息结尾:

Principal XXX does not exist in the directory YYY

其中 XXX 是用户分配身份的主体 ID,YYY 是我的租户 ID。如果我现在查看门户,就会创建身份并且 XXX 是正确的 ID。

所以当我现在简单地重新运行部署时它工作

我认为它是 dependsOn 中的一个错误,它应该与 ARM 模板有关,而不是 Bicep。我找不到任何可以向 Microsoft 报告 ARM 模板问题的地方。

我想确保我没有遗漏任何其他内容。

编辑:添加了显示错误的完整工作示例。要使用它,请将脚本内容复制到本地的 test.bicep 中。然后创建一个资源组(我们称之为“rg-test”),确保正确设置本地 POSH 上下文并在存储二头肌的文件夹中执行以下行:

New-AzResourceGroupDeployment -Name deploy -Mode Incremental -TemplateFile .\test.bicep -ResourceGroupName rg-test

因此,如果正确引用 属性,二头肌不需要 dependsOn 段。

需要引用资源块中userId的properties.principalId

所以看起来像:

userId.properties.principalId

这是一个 quickstart that calls 的工作示例。

您需要在目标资源的 identity 属性 中引用新创建的身份。 dependsOn 是多余的,因为二头肌根据实际使用情况以正确的顺序创建资源:

resource userId 'Microsoft.ManagedIdentity/userAssignedIdentities@2018-11-30' = {
  name: 'myidentity'
  location: resourceGroup().location
}

resource appService 'Microsoft.Web/sites@2021-02-01' = {
  name: 'appserviceName'
  location: resourceGroup().location
  properties: {
    //...
  }
  identity: {
    type: 'UserAssigned'
    userAssignedIdentities: {
      '/subscriptions/{your_subscription_id}/resourceGroups/${resourceGroup().name}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/${userId.name}': {}
    }
  }  
}

documentation 不建议使用 dependsOn 没有充分的理由:

In most cases, you can use a symbolic name to imply the dependency between resources. If you find yourself setting explicit dependencies, you should consider if there's a way to remove it.

在角色分配中,需要指定principalTypeServicePrincipal,同时使用大于或等于2018-09-01-preview.[=16的api版本=]

创建服务主体时,它是在 Azure AD 中创建的。全局复制服务主体需要一些时间。通过将 principalType 设置为 ServicePrincipal,它告诉 ARM API t0 等待复制。

resource roles 'Microsoft.Authorization/roleAssignments@2018-09-01-preview' = {
  name: guid(subscription().id, 'bicep-roleassignments', 'dsddsd')  
  properties: {
    principalId: userId.properties.principalId
    roleDefinitionId: roleDef.id
    principalType: 'ServicePrincipal'
  }
}