Terraform部署AWS+Databricks遇405错误:无法创建实例配置文件与Secret
问题分析与解决方案
核心问题
databricks_instance_profile 和 databricks_secret 属于Databricks工作区级别API资源,但你的代码中未区分账号级(MWS)和工作区级Provider,导致请求被发送到了账号级API端点。而账号级端点不支持这两个资源的POST操作,因此返回405 Method Not Allowed错误。
修复步骤
1. 配置双Provider区分账号与工作区操作
在Terraform根模块中定义两个Databricks Provider:一个用于账号级(MWS)操作,另一个用于工作区级操作:
# 账号级MWS Provider,用于创建账号资源(如credentials) provider "databricks" { alias = "mws" host = "https://accounts.cloud.databricks.com" # 按实际区域调整,如中国区为accounts.cn.databricks.com # 认证方式:可通过AWS IAM角色、环境变量或token认证 } # 工作区级Provider,依赖Workspace子模块创建的工作区 provider "databricks" { alias = "workspace" host = module.workspace.databricks_workspace_url # 需确保Workspace模块输出工作区URL # 认证方式:需具备工作区管理员权限,如通过AWS IAM角色或工作区token }
2. 为资源指定正确的Provider
修改S3_bucket模块中的资源,明确指定对应的Provider:
// Step 11: 账号级资源,使用MWS Provider resource "databricks_mws_credentials" "s3_dbx_cred" { provider = databricks.mws # 恢复该配置,指定账号级Provider account_id = var.dbx_account_id credentials_name = var.prefix != null ? "${var.prefix}-${var.dbx_s3_credential_name}" : "${var.dbx_s3_credential_name}" role_arn = aws_iam_role.s3_cross_account.arn } // Step 13: 工作区级资源,使用工作区Provider resource "databricks_instance_profile" "dbx_ip" { provider = databricks.workspace instance_profile_arn = aws_iam_instance_profile.iam_ip.arn } // Step 14: 工作区级资源,使用工作区Provider resource "databricks_secret" "mount_config" { provider = databricks.workspace key = "mount-config" scope = "AWS" string_value = jsonencode({ "s3" = { "region" = var.aws_region "endpoint" = "s3.${var.aws_region}.amazonaws.com" "enable_multipart_upload" = true "max_retry_count" = 10 "max_parallel_uploads" = 5 } }) }
3. 补充依赖与权限检查
- 确保Workspace子模块正确输出
databricks_workspace_url,且工作区已完全创建完成(可通过depends_on或模块输出的隐式依赖保证顺序) - 工作区级Provider的认证主体需具备Workspace Admin权限,或至少拥有管理实例配置、秘钥的权限
内容的提问来源于stack exchange,提问作者Seva
相关产品推荐
相关产品推荐

