首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Azure角色分配- AKS到ACR - Terraform

Azure角色分配- AKS到ACR - Terraform
EN

Stack Overflow用户
提问于 2021-11-10 15:51:18
回答 2查看 1.4K关注 0票数 1

我正在使用下面的Terraform代码来创建一个资源组,创建一个AKS集群,并且我试图允许AKS集群使用相同订阅中的现有ACR,使用数据{}引用。它在没有角色分配块的情况下工作得很好,但是当我使用它时,我仍然会得到以下错误

代码语言:javascript
复制
Error: Invalid index

  on main.tf line 40, in resource "azurerm_role_assignment" "aks_to_acr_role":
  40:   principal_id         = azurerm_kubernetes_cluster.aks.kubelet_identity[0].object_id
    |----------------
    | azurerm_kubernetes_cluster.aks.kubelet_identity is empty list of object

The given key does not identify an element in this collection value.

我查看了所有的堆栈交换,微软的蔚蓝文档和Terraform的问题和许多博客文章,老实说,我不知道在这一点上有什么问题。如有任何建议,将不胜感激。

代码语言:javascript
复制
resource "azurerm_resource_group" "rg" {
      name     = var.resource_group_name
      location = var.location
    }

    resource "azurerm_kubernetes_cluster" "aks" {
      name                = var.cluster_name
      kubernetes_version  = var.kubernetes_version
      location            = var.location
      resource_group_name = azurerm_resource_group.rg.name
      dns_prefix          = var.cluster_name

      default_node_pool {
        name                = "system"
        node_count          = var.system_node_count
        vm_size             = "Standard_B2ms"
        type                = "VirtualMachineScaleSets"
        availability_zones  = [1, 2, 3]
        enable_auto_scaling = false
      }

      service_principal {
        client_id     = var.appId
        client_secret = var.password
      }

    }
    data "azurerm_container_registry" "acr_name" {
      name = "xxxxx"
      resource_group_name = "xxxxx"
    }
    resource "azurerm_role_assignment" "aks_to_acr_role" {
      scope                = data.azurerm_container_registry.acr_name.id
      role_definition_name = "AcrPull"
      principal_id         = azurerm_kubernetes_cluster.aks.kubelet_identity[0].object_id
      skip_service_principal_aad_check = true
    }

ACR名称和RG名称是xxxxx,只是为了隐私起见不在代码中。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-11-11 05:55:56

当使用Service Principal作为Kubernetes集群的标识时,kubelet_identity将是,因为在创建AKS集群时还没有定义identity块。Identity blockService Principal Block冲突,因此不能在一起使用。

解决方案:

  1. 您可以使用标识作为SystemAssigned而不是服务主体,然后不必配置kubelet_identity块,它将自动得到预配置,您可以成功地使用azurerm_kubernetes_cluster.aks.kubelet_identity[0].object_id。因此,代码如下所示:

提供程序“azurerm”{ features{} data "azurerm_resource_group“"rg”{ name = "ansumantest“}资源"azurerm_kubernetes_cluster”"aks“{ name = "ansumantestaks”location = data.azurerm_resource_group.rg.location resource_group_name = data.azurerm_resource_group.rg.name dns_prefix= "ansumantestaks-dns“default_node_pool { name = "system”node_count =1 vm_size = "Standard_B2ms“type = "VirtualMachineScaleSets”availability_zones = 1,2,3 enable_auto_scaling = false }标识{ type = "SystemAssigned“}}数据"azurerm_container_registry”"acr_name“{ name = "ansumantestacr”resource_group_name = data.azurerm_resource_group.rg.name } resource "azurerm_role_assignment“"aks_to_acr_role”{ scope= azurerm_kubernetes_cluster.aks.kubelet_identity.object_id role_definition_name = "AcrPull“principal_id =AcrPull skip_service_principal_aad_check = true }

Output:

  1. 如果您只想使用服务主体而不是标识,那么您必须在角色分配中使用服务主体对象Id,因为as也在使用与服务主块相同的服务Principal.The代码,如下所示:

提供程序“azurerm”{功能{} provider"azuread"{} #服务主体,由AKS使用。数据"azuread_service_principal“"akssp"{ display_name = "aksspansuman”}数据"azurerm_resource_group“"rg”{ name = "ansumantest“}资源"azurerm_kubernetes_cluster”"aks“{ name = "ansumantestaks”location = data.azurerm_resource_group.rg.location resource_group_name =data.azurerm_resource_group。rg.name dns_prefix = "ansumantestaks-dns“default_node_pool { name = "system”node_count =1 vm_size = "Standard_B2ms“type = "VirtualMachineScaleSets”availability_zones = 1,2,3 enable_auto_scaling = false } service_principal { client_id =service_principal= "e997Q~xxxxxxxx“}数据"azurerm_container_registry”"acr_name“{ name = "ansumantestacr”resource_group_name = data.azurerm_resource_group.rg.name } resource "azurerm_role_“赋值"aks_to_acr_role“{ scope = data.azurerm_container_registry.acr_name.id role_definition_name = "AcrPull”principal_id =AcrPull skip_service_principal_aad_check = true }

Outputs:

票数 0
EN

Stack Overflow用户

发布于 2022-06-17 03:30:17

我在寻找一些东西,指派一个网络贡献者的角色给AKS。角色分配需要ID.原则,我通过对AKS terraform对象的检查得到它。

代码语言:javascript
复制
terraform state show azurerm_kubernetes_cluster.aks

---
    identity {
        principal_id = "9966f59f-745a-4210-abcd-123456789"
        tenant_id    = "18518570-0488-436a-abcd-123456789"
        type         = "SystemAssigned"
    }

所以我意识到我只需要改变azurerm_kubernetes_cluster.aks.kubelet_identity[0].object_id的这个部分。

这为我解决了这个问题。

代码语言:javascript
复制
resource "azurerm_role_assignment" "example" {

  scope                = data.azurerm_resource_group.staging-rg.id
  role_definition_name = "Network Contributor"
  principal_id         = azurerm_kubernetes_cluster.aks.identity[0].principal_id
}

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69916317

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档