我是遵循官方文档创建Azure Kubernetes集群。docs声明我需要首先手动创建一个服务主体,并提供client_id和client_secret。
手动操作不是一种选择。
这是我的服务负责人的代码。它用链接装饰到最近的Terraform文档,以供参考。
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
}我不断收到以下错误:(注意,我是订阅的所有者)
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 loginaz 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命令行做我想做的任何事情,那么是什么阻止我在管道中做同样的事情呢?
发布于 2022-02-08 06:54:57
我使用的是用户管理的身份,这看起来很简单,而且对我来说也很好。
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
}https://stackoverflow.com/questions/71025381
复制相似问题