如何为Terraform部署用的服务主体授予AKS托管MC资源组Reader权限
问题描述
我通过Terraform部署了AKS集群,同时在同一资源组创建了应用网关,核心配置代码如下:
resource "azurerm_kubernetes_cluster" "cluster" { name = var.aks_name tags = var.tags location = var.vnet_location resource_group_name = local.aks_resource_group dns_prefix = "k8s" oidc_issuer_enabled = true role_based_access_control_enabled = true azure_policy_enabled = true #workload_identity_enabled = true default_node_pool { name = var.node_pool_name node_count = var.node_count vm_size = var.node_type os_disk_size_gb = var.os_disk_size_gb vnet_subnet_id = local.aks_subnet_id } identity { type = "SystemAssigned" } ingress_application_gateway { gateway_id = var.application_gateway_id } ...
创建AKS时,Azure会自动生成MC_*******格式的托管资源组。我使用服务主体部署所有Terraform资源,现在需要为这个部署用的服务主体授予该MC_*******资源组的Reader权限,但不想给它订阅级的Contributor权限。
我已配置Ingress Controller的权限,代码如下:
#---------------------------------------------------------------- # Ingress controller running on AKS #----------------------------------------------------------------- data "azurerm_resource_group" "aks_resource_group" { name = local.aks_resource_group } #Gateway ingress controller should have reader access on resource group resource "azurerm_role_assignment" "igc_reader_access" { scope = data.azurerm_resource_group.aks_resource_group.id role_definition_name = "Reader" principal_id = data.azurerm_user_assigned_identity.ingress_controller_identity.principal_id } #Gateway ingress controller should have contributor access on application gateway resource "azurerm_role_assignment" "ag_contributor_access" { scope = var.application_gateway_id role_definition_name = "Contributor" principal_id = data.azurerm_user_assigned_identity.ingress_controller_identity.principal_id } data "azurerm_user_assigned_identity" "ingress_controller_identity" { name = "ingressapplicationgateway-qa" resource_group_name = "MC_RG-Digital-Service-qa_westeurope" }
解决方案
方法1:通过Terraform自动配置权限
利用AKS集群自带的属性获取MC资源组,再通过Terraform自动完成权限分配:
获取MC资源组数据源
AKS集群的node_resource_group属性会返回自动生成的MC资源组名称,基于此定义数据源:data "azurerm_resource_group" "aks_mc_rg" { name = azurerm_kubernetes_cluster.cluster.node_resource_group }获取部署用服务主体的Principal ID
若服务主体信息已作为变量传入,直接使用var.sp_principal_id;若需在Terraform中动态获取,可通过Azure AD服务主体数据源(需当前执行账号有读取Azure AD的权限):data "azuread_service_principal" "deploy_sp" { display_name = var.deploy_sp_display_name }创建Reader角色分配
基于以上数据源,为服务主体授予MC资源组的Reader权限:resource "azurerm_role_assignment" "deploy_sp_mc_rg_reader" { scope = data.azurerm_resource_group.aks_mc_rg.id role_definition_name = "Reader" principal_id = var.sp_principal_id # 或 data.azuread_service_principal.deploy_sp.object_id skip_service_principal_aad_check = true }注:
skip_service_principal_aad_check参数用于避免跨租户服务主体的检查,同一租户环境可省略,添加后兼容性更强。
方法2:通过Azure CLI手动配置
若无需Terraform管理该权限,可直接用Azure CLI完成授权:
获取AKS对应的MC资源组名称:
az aks show --name <你的AKS集群名> --resource-group <你的资源组名> --query nodeResourceGroup -o tsv获取部署用服务主体的Object ID:
az ad sp show --id <服务主体应用ID> --query id -o tsv为服务主体分配MC资源组的Reader权限:
az role assignment create --assignee <服务主体Object ID> --role Reader --resource-group <MC资源组名称>
注意事项
- 执行权限分配的账号,需拥有目标MC资源组的Owner或User Access Administrator角色。
- 仅针对MC资源组授予Reader权限即可满足需求,无需赋予订阅级权限。
内容的提问来源于stack exchange,提问作者David Karlslatt
相关产品推荐
相关产品推荐

