Terraform archive_file数据源source块无法识别源文件内容变更的解决办法
Terraform部署Azure函数:代码更新后无法触发重新部署的解决办法
问题场景
我通过Terraform的archive_file数据源打包Azure Python函数代码,配置如下:
locals { tmp_azure_function_zip = "../code.zip" azure_function_local_basedir = "../my_code/" } data "archive_file" "functionzip" { type = "zip" output_path = local.tmp_azure_function_zip excludes = ["__pycache__"] source { content = file("${local.azure_function_local_basedir}/info/__init__.py") filename = "info/__init__.py" } // 其他文件按相同逻辑添加 }
之后通过zip_deploy_file部署:
zip_deploy_file = data.archive_file.functionzip.output_path
首次部署正常,但更新__init__.py等代码文件后,Terraform无法识别变更——因为配置本身没改,不像AWS Lambda有source_code_hash属性,Azure的azurerm_linux_function_app没有类似选项。原本以为file函数能感知文件变化,但实际无效。
解决方案
方法1:用filehash函数添加变更触发器
在archive_file数据源中新增triggers块,通过filehash计算所有源码文件的哈希值。当文件内容变化时,哈希值会更新,Terraform会自动重新执行archive_file生成新的zip包:
data "archive_file" "functionzip" { type = "zip" output_path = local.tmp_azure_function_zip excludes = ["__pycache__"] // 触发器:监听指定源码文件的哈希变化 triggers = { src_hash = join("", [ filehash("${local.azure_function_local_basedir}/info/__init__.py"), // 把其他需要监听的文件逐个加入 filehash("${local.azure_function_local_basedir}/utils/helper.py"), ]) } source { content = file("${local.azure_function_local_basedir}/info/__init__.py") filename = "info/__init__.py" } // 其他source块保持不变 }
filehash会计算文件的SHA-256哈希,只要文件内容修改,src_hash就会变化,触发zip包重建和函数重新部署。
方法2:改用source_dir替代逐个source块
如果代码都集中在my_code目录下,直接用source_dir替代多个source块,archive_file会自动监听整个目录的文件变化(需确保未在excludes中排除目标文件):
data "archive_file" "functionzip" { type = "zip" output_path = local.tmp_azure_function_zip source_dir = local.azure_function_local_basedir excludes = ["__pycache__"] }
这种方式无需手动维护每个文件的配置,只要目录内文件内容或结构变化,就会触发zip包重建和部署。
补充说明
source_dir适合目录结构固定的场景,配置更简洁,无需手动维护文件列表- 若需精准控制监听范围,
triggers+filehash的方式可以只监听指定文件,避免无关文件变化触发不必要的部署
内容的提问来源于stack exchange,提问作者Yuvraj Singh
相关产品推荐
相关产品推荐

