通过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
相关产品推荐
相关产品推荐

