从本地迁移至Terraform Cloud遇文件引用错误求助
file()函数找不到同目录文件的解决方案 问题核心
Terraform Cloud完全支持file()引用同目录文件,报错的根本原因是以下两点之一:
user-data-server.sh未被提交到GitLab代码库- 相对路径引用受执行环境工作目录影响,定位不准确
错误信息
on ../modules/instances/instance.tf line 32, in resource "aws_instance" "server":
user_data = file("user-data-server.sh")
while calling file(path)
Invalid value for "path" parameter: no file exists at "user-data-server.sh"; this function works only with files that are distributed as part of the configuration source code, so if this file will be created by a resource in this configuration you must instead obtain this result from an attribute of that resource.
解决方案
1. 确认文件已提交至GitLab
Terraform Cloud执行时只会拉取GitLab仓库中已提交的代码,本地存在但未加入版本控制的文件不会被同步:
- 进入模块目录
../modules/instances/,执行git status检查user-data-server.sh是否在已追踪文件列表中 - 如果未追踪,执行
git add user-data-server.sh、git commit -m "Add user-data script",再推送到GitLab
2. 使用path.module构建可靠路径
即使文件已提交,相对路径可能因Terraform Cloud的工作目录与本地不同出现定位问题,改用Terraform内置的path.module变量可以确保跨环境路径一致:
修改instance.tf中的user_data字段:
resource "aws_instance" "server" { ami = var.aws_ami_id subnet_id = "${element(var.public_subnet.*.id, 3)}" key_name = var.ec2_key_pair instance_type = "t2.micro" vpc_security_group_ids = [var.aws_security_group.main-sg.id] associate_public_ip_address = true # 使用path.module定位同目录文件 user_data = file("${path.module}/user-data-server.sh") tags = { Name = "Server" } }
path.module会自动指向当前Terraform模块的根目录,无论在本地还是Terraform Cloud执行,都能准确找到同目录下的user-data-server.sh
3. 验证步骤
- 提交修改后的代码到GitLab
- 在Terraform Cloud重新触发plan/apply操作,确认错误消失
内容的提问来源于stack exchange,提问作者Peter Jackson

