使用 Terraform 预配服务主体
注意
若要改用 Azure 门户 和 Azure Databricks 用户界面预配 Microsoft Entra ID 托管服务主体,请参阅管理服务主体。
Microsoft Entra ID 托管服务主体不同于 Azure 资源托管标识,其也受 Azure Databricks 支持进行身份验证。 要了解如何使用 Azure 资源托管标识(而不是 Microsoft Entra ID 托管服务主体)进行 Azure Databricks 身份验证,请参阅设置和使用 Azure 托管标识身份验证以实现 Azure Databricks 自动化。
服务主体是脚本、应用和 CI/CD 平台等自动化工具和系统的标识。 Databricks 建议使用服务主体及其 OAuth 令牌或个人访问令牌,而不是 Azure Databricks 用户帐户和个人访问令牌。 优势包括:
- 授予和限制不受用户影响的资源访问权限。
- 使用户能够更好地保护自己的访问令牌。
- 在不影响其他用户的情况下禁用或删除服务主体。
- 在用户离开组织时删除该用户,但不影响任何服务主体。
按照以下说明使用 Terraform 在 Azure 中创建 Microsoft Entra ID 托管服务主体,使用 Databricks Terraform 提供程序将 Microsoft Entra ID 服务主体链接到 Azure Databricks 工作区,然后根据需要为服务主体创建 Microsoft Entra ID 令牌或 Azure Databricks OAuth 令牌。
要求
- Terraform CLI。 请参阅下载 Terraform。
- 在 Azure CLI 中,通过运行
az login
命令登录到目标 Microsoft Entra ID 订阅。 若要使用 Microsoft Entra ID 服务主体进行登录,请参阅使用 Microsoft Entra ID 服务主体登录 Azure CLI。 若要使用 Azure Databricks 用户帐户登录,请参阅使用 Azure Databricks 用户帐户登录 Azure CLI。
第 1 步:创建服务主体
如果已有可用的 Microsoft Entra ID 托管服务主体,请跳到步骤 2。
在终端中,创建一个空目录,然后切换到该目录。 (每组单独的 Terraform 配置文件必须在其自己的目录中。)例如:
mkdir terraform_azure_service_principal_demo && cd terraform_azure_service_principal_demo
。mkdir terraform_azure_service_principal_demo && cd terraform_azure_service_principal_demo
在此空目录中,创建一个名为
main.tf
的文件。 在此文件中添加以下内容,然后保存文件。variable "azure_service_principal_display_name" { description = "A display name for the <entra-service-principal>." type = string } terraform { required_providers { azuread = { source = "hashicorp/azuread" } } } provider "azurerm" { features {} } resource "azuread_application" "this" { display_name = var.azure_service_principal_display_name } resource "azuread_service_principal" "this" { application_id = azuread_application.this.application_id } resource "time_rotating" "month" { rotation_days = 30 } resource "azuread_service_principal_password" "this" { service_principal_id = azuread_service_principal.this.object_id rotate_when_changed = { rotation = time_rotating.month.id } } output "azure_client_id" { description = "The Azure AD service principal's application (client) ID." value = azuread_application.this.application_id } output "azure_client_secret" { description = "The Azure AD service principal's client secret value." value = azuread_service_principal_password.this.value sensitive = true }
在相同目录中,创建名为
terraform.tfvars
的文件。 在该文件中添加以下内容,替换以下值,然后保存文件:- 将
azure_service_principal_display_name
值替换为 Microsoft Entra ID 服务主体的显示名称。
azure_service_principal_display_name = "<A display name for the <entra-service-principal>>"
- 将
运行
terraform init
命令来初始化包含main.tf
文件的工作目录。 有关详细信息,请查看 Terraform 网站上的命令:init。terraform init
通过运行
terraform validate
命令检查配置中是否存在任何语法错误。 有关详细信息,请查看 Terraform 网站上的命令:validate。terraform validate
运行
terraform apply
命令应用所需的更改来达到所需的配置状态。 有关详细信息,请查看 Terraform 网站上的命令:apply。terraform apply
创建服务主体后,复制 azure_client_id
和 azure_client_secret
输出值,因为稍后会用到这些值。
要获取 azure_client_secret
值,请查看 terraform.tfstate
文件中 outputs.client_secret.value
的值,该文件位于包含 main.tf
文件的工作目录中。
第 2 步:将服务主体添加到 Azure Databricks 工作区
注意
以下内容说明如何在 Azure Databricks 工作区级别添加服务主体。 如果 Azure Databricks 工作区启用了联合身份验证,则以下内容还会自动将服务主体同步到相关的 Azure Databricks 帐户。
在终端中,创建一个空目录,然后切换到该目录。 每组单独的 Terraform 配置文件必须在其自己的目录中。 例如:
mkdir terraform_databricks_service_principal_demo && cd terraform_databricks_service_principal_demo
。mkdir terraform_databricks_service_principal_demo && cd terraform_databricks_service_principal_demo
在此空目录中,创建一个名为
main.tf
的文件。 在此文件中添加以下内容,然后保存文件。variable "databricks_host" { description = "The Azure Databricks workspace URL." type = string } variable "azure_client_id" { type = string description = "The application (client) ID of the <entra-service-principal> to link to an Azure Databricks service principal. This application (client) ID will be the application ID of the Azure Databricks service principal." } variable "databricks_service_principal_display_name" { type = string description = "A workspace display name for the Azure Databricks service principal." } terraform { required_providers { databricks = { source = "databricks/databricks" } } } provider "databricks" { host = var.databricks_host } resource "databricks_service_principal" "sp" { application_id = var.azure_client_id display_name = var.databricks_service_principal_display_name } output "databricks_service_principal_application_id" { value = databricks_service_principal.sp.application_id description = "Application ID of the Azure Databricks service principal." } output "databricks_service_principal_display_name" { value = databricks_service_principal.sp.display_name description = "Workspace display name of the Azure Databricks service principal." } output "databricks_workspace_service_principal_id" { value = databricks_service_principal.sp.id description = "Workspace ID of the Azure Databricks service principal. This ID is generated by Azure Databricks for this workspace." }
注意
若要将此服务主体添加到组,以及向此服务主体添加权利,请参阅 Terraform 网站上的 databricks_service_principal。
在相同目录中,创建名为
terraform.tfvars
的文件。 在该文件中添加以下内容,替换以下值,然后保存文件:- 将
databricks_host
值替换为 Azure Databricks 工作区的 URL。 - 将
azure_client_id
替换为步骤 1 中的值azure_client_id
。 - 将
databricks_service_principal_display_name
值替换为 Azure Databricks 服务主体的工作区显示名称。
databricks_host = "<The Azure Databricks workspace URL, starting with https://>" azure_client_id = "<The Azure client ID of the Azure Active AD service principal>" databricks_service_principal_display_name = "<A workspace display name for the Azure Databricks service principal>"
- 将
运行
terraform init
命令来初始化包含main.tf
文件的工作目录。 有关详细信息,请查看 Terraform 网站上的命令:init。terraform init
通过运行
terraform validate
命令检查配置中是否存在任何语法错误。 有关详细信息,请查看 Terraform 网站上的命令:validate。terraform validate
运行
terraform apply
命令应用所需的更改来达到所需的配置状态。 有关详细信息,请查看 Terraform 网站上的命令:apply。terraform apply
创建服务主体后,复制 databricks_service_principal_application_id
输出值,因为需要使用它创建服务主体的 Microsoft Entra ID 令牌。
(可选)步骤 3:为 Microsoft Entra ID 服务主体创建 Microsoft Entra ID 访问令牌
Databricks 不建议手动为 Microsoft Entra ID 服务主体创建 Microsoft Entra ID 令牌。 这是因为每个 Microsoft Entra ID 令牌的生存期很短,通常在一小时内就会过期。 在此时间之后,必须手动生成替换 Microsoft Entra ID 令牌。 请改用实现 Databricks 客户端统一身份验证标准的参与工具或 SDK 之一。 这些工具和 SDK 可以利用以下 Databricks 身份验证类型,自动生成并替换过期的 Microsoft Entra ID 令牌:
如果需要为 Microsoft Entra ID 服务主体手动创建 Microsoft Entra ID 令牌,请收集以下信息,然后按照使用 Microsoft 标识平台 REST API 获取 Microsoft Entra ID 访问令牌或使用 Azure CLI 获取 Microsoft Entra ID 访问令牌中的说明操作:
- Microsoft Entra ID 服务主体的租户 ID,将在说明中用作租户 ID/目录(租户)ID /
<tenant-id>
。 要获取租户 ID,请参阅在 Azure 门户中预配服务主体。 - 步骤 2 中的
databricks_service_principal_application_id
值,将在说明中用作客户端 ID/应用程序(客户端)ID /<client-id>
。 - 步骤 2 中的
azure_client_secret
值,将在说明中用作客户端机密/值 /<client-secret>
。
创建 Microsoft Entra ID 令牌后,复制 access_token
值,因为需要将其提供给脚本、应用程序或系统。
(可选)步骤 4:为 Microsoft Entra ID 服务主体创建 Azure Databricks OAuth 令牌
Databricks 不建议手动为 Microsoft Entra ID 托管服务主体创建 Azure Databricks OAuth 令牌。 这是因为每个 Azure Databricks OAuth 令牌的生存期很短,通常在一小时内就会过期。 在此时间之后,必须手动生成替换 Azure Databricks OAuth 令牌。 请改用实现 Databricks 客户端统一身份验证标准的参与工具或 SDK 之一。 这些工具和 SDK 可利用使用 OAuth (OAuth M2M) 通过服务主体对 Azure Databricks 的访问进行身份验证,自动生成和替换过期的 Azure Databricks OAuth 令牌。
如果需要为 Microsoft Entra ID 服务主体手动创建 Azure Databricks OAuth 令牌,请参阅手动生成和使用 OAuth M2M 身份验证的访问令牌。