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.
在角色分配中,需要指定principalType
到ServicePrincipal
,同时使用大于或等于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'
}
}
我创建了一个二头肌模板。我在其中创建了一个用户分配的身份,并在其他资源中引用它,例如
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.
在角色分配中,需要指定principalType
到ServicePrincipal
,同时使用大于或等于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'
}
}