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

Terraform中path.module为何指向当前目录而非模块所在目录?

问题根因

path.module的取值永远和表达式所在的.tf文件所属模块绑定,和当前文件调用什么外部模块没有关系。
你把user_data = file("${path.module}/startup.sh.tpl")写在了调用ec2模块的上层配置(即执行terraform命令的当前上下文配置)中,这里的path.module自然返回当前配置所在的目录.,不会自动指向引用的../../modules/ec2/模块目录。
之前写死../../modules/ec2/startup.sh.tpl路径能正常执行,本质是手动在上层配置里拼对了目标文件相对于当前目录的路径,不属于模块配置的合理写法。

正确修复方案

优先使用模块标准封装逻辑处理,避免路径硬编码:

  • 把startup.sh.tpl保留在../../modules/ec2/模块目录下
  • 删除上层module "instance"块里的user_data传参行
  • 打开../../modules/ec2/目录下定义EC2实例的.tf文件,在对应的aws_instance资源块内部添加配置:
resource "aws_instance" "this" {
  # 模块原有其他配置保持不变
  user_data = file("${path.module}/startup.sh.tpl")
}

此时${path.module}写在ec2模块自身的配置文件中,会自动定位到ec2模块的目录,无论在什么层级的配置里调用这个ec2模块,都能正确找到同目录下的脚本文件,不需要手动拼接相对路径。

如果确实需要在调用模块的上层配置里指定user_data文件,就把startup.sh.tpl放在上层配置的目录下,原有${path.module}/startup.sh.tpl写法即可正常运行,无需修改路径。

注意:Terraform所有路径类内置常量的求值上下文都是表达式所在的文件,不会因为表达式写在module块中就切换到被调用模块的上下文。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 05:57:30