You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过GitHub Actions用Terraform部署ADB VNet注入时的认证问题

问题

通过GitHub Actions使用Terraform部署带VNet注入的ADB工作区,采用官方示例代码时触发错误:

Error: default auth: cannot configure default credentials. Config: azure_client_secret=***, azure_client_id=***, azure_tenant_id=***. Env: ARM_CLIENT_SECRET, ARM_CLIENT_ID, ARM_TENANT_ID

GitHub Actions工作流配置如下:

name: Deploy ADB with VNET injection

on:
  workflow_dispatch:

jobs:
  terraform:
    name: 'Deploy Terraform with remote state'
    runs-on: ubuntu-latest
    env:
      ARM_CLIENT_ID: ${{ secrets.AZURE_AD_CLIENT_ID }}
      ARM_CLIENT_SECRET: ${{ secrets.AZURE_AD_CLIENT_SECRET }}
      ARM_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
      ARM_TENANT_ID: ${{ secrets.AZURE_AD_TENANT_ID }}

    defaults:
      run:
        shell: bash
        working-directory: adb_vnetinjection

    steps:
      - name: Checkout
        uses: actions/checkout@v3

      - name: 'Terraform init'
        id: init
        run: |
          terraform init

      - name: 'Terraform plan'
        id: plan
        run: |
          terraform plan

      - name: 'Terraform apply'
        id: apply
        run: |
          terraform apply -auto-approve

已验证服务主体拥有订阅参与者权限,用相同凭据可正常部署普通ADB工作区。排查发现问题出在workspace.tf调用创建集群的模块时,将集群代码移至主文件后脚本可正常运行。核心需求:如何将ARM_CLIENT_ID、ARM_CLIENT_SECRET、ARM_SUBSCRIPTION_ID、ARM_TENANT_ID这4个环境变量从主Terraform脚本传递给模块,使其能正确认证Azure/Databricks工作区?


解决方案

1. 显式通过Terraform变量传递认证参数

在主模块中定义变量承接环境变量值,再传递给子模块:

  • 主模块variables.tf添加变量定义:
variable "arm_client_id" {
  type        = string
  description = "Azure AD客户端ID"
}

variable "arm_client_secret" {
  type        = string
  description = "Azure AD客户端密钥"
  sensitive   = true
}

variable "arm_subscription_id" {
  type        = string
  description = "Azure订阅ID"
}

variable "arm_tenant_id" {
  type        = string
  description = "Azure AD租户ID"
}
  • 主模块调用子模块时传入变量:
module "databricks_cluster" {
  source = "./path/to/cluster-module"

  arm_client_id       = var.arm_client_id
  arm_client_secret   = var.arm_client_secret
  arm_subscription_id = var.arm_subscription_id
  arm_tenant_id       = var.arm_tenant_id

  # 其他模块必填参数...
}
  • 子模块provider.tf使用传入的变量配置认证:
provider "databricks" {
  azure_client_id       = var.arm_client_id
  azure_client_secret   = var.arm_client_secret
  azure_tenant_id       = var.arm_tenant_id
  azure_subscription_id = var.arm_subscription_id
  azure_workspace_url   = module.databricks_workspace.workspace_url
}

2. 确保子模块继承环境变量

Terraform默认会继承当前Shell的环境变量,若子模块认证失败,需检查:

  • 子模块的Provider配置未硬编码认证参数,而是依赖ARM_*系列环境变量读取值。
  • GitHub Actions的env块定义的变量会传递给所有run步骤,只要子模块Provider未显式覆盖认证逻辑,就能自动读取环境变量。

3. 配置Databricks Provider链式认证

子模块使用Databricks Provider时,可配置自动读取环境变量的认证模式:

provider "databricks" {
  azure_workspace_url = module.databricks_workspace.workspace_url
  auth_type           = "azure-client-secret"
  # 不硬编码参数,让Provider自动从环境变量加载ARM_*系列值
}

内容的提问来源于stack exchange,提问作者Anupam Chand

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 00:21:20