Terragrunt配置local后端时tfstate文件存于临时目录而非指定路径问题
Terragrunt 本地状态文件落入缓存目录问题解决方案
问题场景
使用Terragrunt配置local类型远端状态存储时,因Terragrunt默认会将Terraform模块下载到缓存目录执行,纯相对路径配置的状态文件路径会基于缓存工作目录解析,最终状态文件生成在缓存目录而非预期路径。
原配置如下:
remote_state { backend = "local" config = { path= "../..//mypath/terraform.tfstate" } }
执行命令terragrunt run-all apply --terragrunt-download-dir C:\Tempfile时,--terragrunt-download-dir参数仅能修改缓存目录的存放位置,无法修正状态文件的路径解析逻辑。
可行解决方案
- 方案1:通过内置路径函数拼接绝对路径
Terragrunt提供get_original_terragrunt_dir()内置函数,可返回当前terragrunt.hcl文件所在的原始目录绝对路径,不受缓存目录影响。将remote_state配置中的path改为基于该函数拼接的路径即可:
Terragrunt会自动归一化路径中的多余斜杠,Windows环境下也可自动适配路径分隔符,无需手动调整格式。remote_state { backend = "local" config = { path = "${get_original_terragrunt_dir()}/../../mypath/terraform.tfstate" } } - 方案2:通过extra_arguments强制指定状态路径
在配置中追加Terraform执行参数,在所有需要读写状态的命令执行时,通过-state参数直接指定状态文件的绝对路径,优先级高于backend配置中的path字段:
该方案可以完全绕开缓存目录的相对路径解析逻辑,不会出现路径偏移。terraform { extra_arguments "fixed_state_path" { commands = get_terraform_commands_that_need_state() arguments = ["-state", "${get_original_terragrunt_dir()}/../../mypath/terraform.tfstate"] } } - 方案3:通过generate块生成固定后端配置
使用generate块直接在配置目录生成固定的backend配置文件,配置中写入拼接好的绝对路径,该配置会被同步到缓存目录中供Terraform加载:generate "local_backend" { path = "backend.tf" if_exists = "overwrite" contents = <<EOF
terraform {
backend "local" {
path = "${get_original_terragrunt_dir()}/../../mypath/terraform.tfstate"
}
}
EOF
}
> 注意:禁止为local backend配置纯相对路径。Terragrunt执行Terraform命令的工作目录为缓存目录下的模块路径,纯相对路径会默认基于缓存目录解析,必然导致状态文件存放位置不符合预期。 内容的提问来源于stack exchange,提问作者Jorge Ivansevick
相关产品推荐
相关产品推荐

