Terraform导入资源后CD流水线执行plan报未授权错误排查
Terraform导入Databricks Catalog后CD流水线Plan权限报错问题
问题描述
我需要导入已存在的Databricks Catalog资源,因为初始Terraform Plan会尝试创建这些已存在的资源,操作步骤和遇到的问题如下:
- CD流水线执行
terraform plan时输出:
# module.databricks.databricks_catalog.catalog["dev"] will be created + resource "databricks_catalog" "catalog" { + force_destroy = false + id = (known after apply) + metastore_id = (known after apply) + name = "dev" + owner = (known after apply) }
- 我在本地IDE用个人账号执行导入命令:
terraform import module.databricks.databricks_catalog.catalog[\"dev\"] dev
本地用个人账号执行
terraform plan时,该资源会被跳过,待创建资源数量减少,一切正常。但通过CD流水线执行
terraform plan时,出现权限错误:
##[error]Terraform command 'plan' failed with exit code '1'. ##[error]╷ │ Error: cannot read catalog: User not authorized
- 删除Terraform状态文件重新开始后,流水线的
terraform plan可正常执行。
请问我哪里操作有误?
问题根源
你用个人账号在本地导入资源的操作是核心问题:
- Terraform导入资源后,会把该资源的记录存在状态文件中,后续执行
plan时需要读取已存在的资源信息进行比对校验 - 你的个人账号拥有访问
devCatalog的权限,但CD流水线使用的服务账号并没有该Catalog的读取权限 - 流水线执行
plan时,Terraform会使用流水线的服务账号去验证状态文件中记录的devCatalog资源,直接触发了权限校验失败
解决方案
- 统一使用流水线服务账号执行导入:不要用个人账号本地导入,改为在CD流水线中执行
terraform import命令,或者用流水线服务账号的权限在本地导入后,将状态文件同步到流水线使用的远程存储,确保状态文件关联的资源权限适配流水线账号。 - 为流水线服务账号授权:如果必须用个人账号导入,需要在Databricks中为流水线服务账号添加
devCatalog的读取权限(至少需要USE CATALOG和SELECT权限)。 - 使用远程状态存储管理状态文件:放弃本地状态文件,配置Terraform使用远程状态存储(如AWS S3、Azure Blob Storage、Databricks工作区文件系统等),确保本地和流水线使用同一状态源,避免状态不一致或权限不匹配问题。
内容的提问来源于stack exchange,提问作者Saugat Mukherjee
相关产品推荐
相关产品推荐

