首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Terraform自动创建服务主体或MSI,以便在Azure管道中使用以管理AKS资源?

如何使用Terraform自动创建服务主体或MSI,以便在Azure管道中使用以管理AKS资源?
EN

Stack Overflow用户
提问于 2022-02-07 21:04:14
回答 1查看 875关注 0票数 2

我是遵循官方文档创建Azure Kubernetes集群。docs声明我需要首先手动创建一个服务主体,并提供client_id和client_secret。

手动操作不是一种选择。

这是我的服务负责人的代码。它用链接装饰到最近的Terraform文档,以供参考。

代码语言:javascript
复制
data "azurerm_subscription" "current" {}
data "azuread_client_config" "current" {}

resource "random_id" "current" {
  byte_length = 8
  prefix      = "ExternalDnsTf"
}

# Create Azure AD App.
# https://registry.terraform.io/providers/hashicorp/azuread/latest/docs/resources/application
resource "azuread_application" "current" {
  display_name = random_id.current.hex
  owners       = [data.azuread_client_config.current.object_id]

}

# Create Service Principal associated with the Azure AD App
# https://registry.terraform.io/providers/hashicorp/azuread/latest/docs/resources/service_principal
resource "azuread_service_principal" "current" {
  application_id               = azuread_application.current.application_id
  app_role_assignment_required = false
  owners                       = [data.azuread_client_config.current.object_id]
}

# Create Service Principal password
# https://registry.terraform.io/providers/hashicorp/azuread/latest/docs/resources/application_password
resource "azuread_application_password" "current" {
  application_object_id = azuread_application.current.object_id
}

# Create role assignment for service principal
# https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/role_assignment
resource "azurerm_role_assignment" "current" {
  scope                = data.azurerm_subscription.current.id
  role_definition_name = "Contributor"

 # When assigning to a SP, use the object_id, not the appId
 # see: https://learn.microsoft.com/en-us/azure/role-based-access-control/role-assignments-cli
  principal_id = azuread_service_principal.current.object_id
}

我不断收到以下错误:(注意,我是订阅的所有者)

代码语言:javascript
复制
ApplicationsClient.BaseClient.Post(): unexpected status 403 with OData
│ error: Authorization_RequestDenied: Insufficient privileges to complete the
│ operation.

我想要做的是消除设置支持服务的手动步骤。以ExternalDNS为例。Azure医生声明我需要使用az ad sp create-for-rbac -n ExternalDnsServicePrincipal; az role assignment create --role "Reader" --assignee <appId GUID> --scope <resource group resource id>; az role assignment create --role "Contributor" --assignee <appId GUID> --scope <dns zone resource id>

最终,我试图创建azure命令的terraform版本。

create-for-rbac 是github上的一个功能请求的支持。这曾经很好,但是已经发生了很大的变化,它不适用于当前的API版本。此外,随着AAD图形被反对而支持Microsoft,我想知道我是否被困在这上面了。

ExternalDNS文档还建议托管服务标识(MSI)。服务原则、MSI、MSGraph API集成,老实说,我不在乎使用哪一种。无论当前的最佳实践是什么,只要我不需要登录到门户就可以手动创建或授予权限,或者手动运行az cli 命令.,这一切都很好。

编辑:权限澄清

当然,我使用Terraform来提供资源。如果我在不使用terraform (手动或使用bash脚本)的情况下完成所有这些操作,我将使用azure cli通过以下操作开始设置权限:

  • az login
  • az account set -s <my-subscription-id>

我是我的订阅的所有者。我可以运行所有的命令,创建SPs,MSI,分配角色等,没有问题。

在管道中,我用的是charleszipp az管道地形插件。在日志中,我看到:

  • az login --service-principal -t <my-tenant-id> -u *** -p ***
  • az account set -s <my-subscription-id>

我不确定这会不会有什么区别。我解释说,最终,命令是在登录和设置帐户订阅后执行的,就像我手动执行的一样。

从技术上讲,我没有在这些任务中使用服务连接。但是,在需要一个连接的地方,我已经创建了一个服务连接,并将其范围定义为订阅级别。它是Azure资源管理器的类型。

但是,如果我单击“管理服务主体”,它会带我到没有定义权限的门户。

虽然我是我的订阅的所有者,但我不是根管理小组。我是别人拥有/供养的。最终,他们控制了Active Directory。我不能添加或编辑权限。如果我试图添加任何下权限API,并选择Microsoft,它会说授权是必需的。Grant Admin Consent for <parent organization已经灰白了。

但如果我是订阅的所有者,那为什么会很重要呢?如果我可以通过az cli命令行做我想做的任何事情,那么是什么阻止我在管道中做同样的事情呢?

EN

回答 1

Stack Overflow用户

发布于 2022-02-08 06:54:57

我使用的是用户管理的身份,这看起来很简单,而且对我来说也很好。

代码语言:javascript
复制
resource "azurerm_user_managed_identity", "mi" {
    resource_group_name = "rg"
    name = "mi"
    location = "eastus"
}

resource "azurerm_role_assignment" "ra" {
    scope = azurerm_subnet.sn.id  // subnet I created earlier
    role_definition_name = "Network Contributor"  // required with kubenet
    principal_id = azurerm_user_managed_identity.mi.principal_id
}

resource "azurerm_kubernetes_cluster" "aks" {
    name = "aks"
    identity {
        type = "UserAssigned"
        user_assigned_identity_id = azurerm_user_managed_identity.mi.id
    }
    <...remaining attributes...>
    depends_on = [azurerm_role_assignment.ra] // just to be safe
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71025381

复制
相关文章

相似问题

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