You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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自动完成权限分配:

  1. 获取MC资源组数据源
    AKS集群的node_resource_group属性会返回自动生成的MC资源组名称,基于此定义数据源:

    data "azurerm_resource_group" "aks_mc_rg" {
      name = azurerm_kubernetes_cluster.cluster.node_resource_group
    }
    
  2. 获取部署用服务主体的Principal ID
    若服务主体信息已作为变量传入,直接使用var.sp_principal_id;若需在Terraform中动态获取,可通过Azure AD服务主体数据源(需当前执行账号有读取Azure AD的权限):

    data "azuread_service_principal" "deploy_sp" {
      display_name = var.deploy_sp_display_name
    }
    
  3. 创建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完成授权:

  1. 获取AKS对应的MC资源组名称:

    az aks show --name <你的AKS集群名> --resource-group <你的资源组名> --query nodeResourceGroup -o tsv
    
  2. 获取部署用服务主体的Object ID:

    az ad sp show --id <服务主体应用ID> --query id -o tsv
    
  3. 为服务主体分配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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 05:50:26