如何使用 Terraform 创建服务主体并在提供程序中使用该主体?

Cor*_*eyZ 5 azure terraform azure-rm

我已经在网上阅读了这些文章,但它们似乎没有完全涵盖这个主题,希望已经完成的人可以为我提供一些指导。我们正在设置一个复杂的 Terraform 模板,以满足与我们的 SaaS 产品相关的 IaC 要求。这样做时,我们希望模板在启动时使用用户的凭据在 Azure AD 中创建新的服务主体(这部分我没有问题)。然后在模板的下一部分中,我们将使用该服务主体作为提供者。问题是它在计划/应用中抛出错误,因为服务主体不存在(也就是由于服务提供者部分尚未运行,id 不存在)。那么有没有办法做到这一点?创建一个服务主体,然后在使用该服务主体而不将其拆分为多个模板的提供程序别名中使用它?

最后,我希望此模板使用本地用户的权限或 MSI 创建服务提供者,将 RBAC 赋予订阅,然后使用该服务提供者在该订阅中创建资产。

main.ts(根)

provider "azurerm" {
    alias               = "ActiveDirectory"
    subscription_id     = "${var.subscriptionNucleus}"
}

provider "azurerm" {
    alias               = "Infrastructure"
    subscription_id     = "${var.subscriptionInfrastructure}"
}
module "activedirectory" {
    providers                       = { azurerm = "azurerm.ActiveDirectory" 
}
    source                          = "./modules/activedirectory"
    subscription_id_infrastructure  = "${var.subscriptionInfrastructure}"
}
module "infrastructure" {
    providers                   = { azurerm = "azurerm.Infrastructure"}
    source                      = "./modules/infrastructure"
    location                    = "${var.location}"
    application_id              = 
 "${module.activedirectory.service_principal_application_id}"
    subscription_id             = "${var.subscriptionInfrastructure}"
    prefix                      = "${var.prefix}"
}
Run Code Online (Sandbox Code Playgroud)

main.ts (./modules/infrastructure)

data "azurerm_azuread_service_principal" "serviceprincipal" {
    application_id = "${var.application_id}"
}

provider "azurerm" {
    alias           = "InfrastructureSP"
    subscription_id = "${var.subscription_id}"
    client_id       = "${var.application_id}"
    client_secret   = "secret"
    tenant_id       = 
"${data.azurerm_client_config.clientconfig.tenant_id}"  
}
Run Code Online (Sandbox Code Playgroud)

Cha*_* Xu 13

对于 Azure 服务主体,有两种使用服务主体的方法。

第一:如果您已经有一个服务主体并想在 Terraform 中使用它。您可以像这样使用 Terraform 数据和测试:

data "azurerm_azuread_service_principal" "sp" {
        application_id  = "21f3e1de-54e2-4951-9743-c280ad7bd74a"
}

output "test" {
        value = "${data.azurerm_azuread_service_principal.sp.id}"
}
Run Code Online (Sandbox Code Playgroud)

结果截图如下:

在此处输入图片说明

第二:你没有服务主体,你可以像这样在 Terraform 中创建一个服务主体:

resource "azurerm_azuread_service_principal" "test" {
  application_id = "${azurerm_azuread_application.test.application_id}"
}

resource "azurerm_azuread_service_principal_password" "test" {
  service_principal_id = "${azurerm_azuread_service_principal.test.id}"
  value                = "your pasword"
  end_date             = "2020-01-01T01:02:03Z" 
}
Run Code Online (Sandbox Code Playgroud)

然后,无论您选择哪种方式,对于大多数资源,您都应该执行一个重要步骤。步骤是你需要创建角色来授予权限,然后将其分配给需要的资源。你可以这样做:

resource "azurerm_role_assignment" "test" {
  scope                = "yourScope"   # the resource id
  role_definition_name = "the Role In need" # such as "Contributor"
  principal_id         = "your service principal id"
}
Run Code Online (Sandbox Code Playgroud)

希望这会帮助你。