Terraform如何读取CSV文件为变量 路径不存在报错解决
问题说明
- 核心需求:读取CSV文件内存储的配置值,转换为Terraform可引用的变量
- 现有仓库目录结构:
Key_vault/:存放全部Terraform代码,包含配置入口main.tfadf_config/:与Key_vault同级,存放目标配置文件datasets.csv
- 已尝试操作:在
main.tf的locals块中使用路径./adf_config/datasets.csv读取文件 - 触发报错信息:
Invalid value for "path" parameter: no file exists at ./adf_config/datasets.csv; 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
报错原因
Terraform内置文件类函数(file()、csvdecode()等)解析相对路径时,基准路径为当前代码所属模块的目录(即声明读取逻辑的.tf文件所在目录),和执行terraform命令时的工作目录无关。
上述写法中,Terraform实际查找的文件路径是Key_vault/adf_config/datasets.csv,和CSV实际存放的仓库根目录/adf_config/datasets.csv路径不匹配,因此触发文件不存在错误。
正确读取方案
路径修正方案(无需调整现有目录结构,优先推荐)
从Key_vault目录向上一级回到仓库根目录,再定位到同级的adf_config文件夹即可,推荐搭配Terraform内置的path.module常量显式指定模块基准路径,避免因执行命令的目录差异导致解析异常。
完整配置示例:
locals { # 读取CSV文件并直接解析为Terraform可操作的结构化列表 datasets = csvdecode(file("${path.module}/../adf_config/datasets.csv")) }
配置完成后,可直接通过local.datasets引用解析后的所有CSV配置,支持遍历、取值等操作。
目录调整方案(适合配置随Terraform代码统一管理的场景)
将adf_config文件夹整体移动到Key_vault目录内部,让CSV文件处于Terraform配置的源码目录树范围内,此时原写法./adf_config/datasets.csv可正常识别,该方案需要调整现有仓库结构,按需选择即可。
注意事项
- Terraform仅能读取执行
plan/apply前就已经存在的静态源码文件,如果目标文件是Terraform部署过程中由资源生成的,无法通过文件函数读取,必须通过对应资源的导出属性获取值,这也是报错提示后半段的核心规则。 - 所有静态文件路径推荐统一使用
${path.module}拼接相对路径,不要直接写裸相对路径,避免路径解析错位。
内容的提问来源于stack exchange,提问作者sai m

