VSCode 本身不执行 Terraform,所有“运行”操作本质是调用本地 terraform CLI 子进程;插件仅提供语法高亮、LSP 提示和命令转发,无内置 runtime,不管理 state,也不绕过 provider RPC 调用。

VSCode 本身不执行 Terraform,插件只是调用你本地的 terraform CLI —— 所有“运行”操作(plan、apply、init)都是在集成终端里起子进程,不是编辑器内模拟。
为什么 VSCode 里点 “Terraform: Plan” 不等于“模拟运行”
所谓“模拟”是误解。VSCode 插件没有内置 Terraform runtime,它只做三件事:语法高亮、LSP 提示、命令转发。当你点击 Terraform: Plan,插件实际是在集成终端中执行 terraform plan -out=tfplan,和你在 iTerm 里敲完全一样。如果你没装 terraform CLI 或路径配错,命令直接失败;如果 state 文件损坏或 provider 初始化异常,报错也一模一样。
- 插件无法绕过
providerRPC 调用 —— 即使是null_resource,也要走 provider 插件握手流程 - state 管理完全由 CLI 完成,插件不读写
terraform.tfstate文件 - 悬停查看
aws_instanceschema 是静态分析,不代表该 resource 能成功创建
必须正确配置 terraform.path 才能触发任何命令
插件默认不会自动发现 terraform 二进制位置。不设这个路径,所有功能降级为纯文本编辑:没有格式化、无诊断错误、Terraform: Init 命令灰色不可点。
- 先在终端运行
which terraform,例如输出/opt/homebrew/bin/terraform - VSCode 设置中搜索
terraform.path,粘贴完整路径(不要省略/opt/homebrew/bin/terraform中的/bin/terraform) - 路径含空格或中文会导致静默失败,务必检查
- 多版本共存时(如用
tfenv),建议指向tfenv的 shim 路径,而非某个固定版本
启用 terraform-ls 才有跨文件跳转和模块输入提示
官方插件默认启用 Language Server,但前提是系统已安装 terraform-ls。没有它,module "vpc" 右键“转到定义”会失败,output "vpc_id" 在其他模块中引用时也不会补全。
- macOS 推荐用
brew install terraform-ls;Linux 请下载对应架构的二进制并加入$PATH - 重启 VSCode 后,按
Cmd+Shift+P运行Terraform: Restart Language Server - 打开输出面板 → 切换到
Terraform标签,确认出现Server started successfully - 若提示
connection refused,大概率是端口被占用(检查是否同时运行了另一个terraform-ls实例)
保存时自动格式化依赖 terraform fmt,不是插件内置逻辑
勾选 editor.formatOnSave 和 terraform.formatOnSave 后,每次 Ctrl+S 实际触发的是 terraform fmt -write=true .。这意味着:
- 如果当前目录不是 Terraform 模块根(即没有
main.tf或terraform {}块),格式化会静默跳过 - 若
.terraform目录不存在,fmt仍可运行,但不会校验 provider 配置合法性 - 格式化失败时(比如 HCL 语法错误),VSCode 只显示“Format failed”,需手动开终端执行
terraform fmt -check查具体哪行错 - 团队协作中,务必统一
.terraform-version文件内容,否则不同人格式化结果可能因版本差异而抖动
真正容易被忽略的点在于:所有“智能”都建立在 CLI 正常工作的前提下。插件不会帮你修复 backend 配置冲突,也不会绕过 required_providers 版本锁。一旦 CLI 报错,VSCode 就只是个更漂亮的终端外壳。











