Terraform中使用archive_file的depends_on时如何获取一致路径?
解决Terraform中archive_file依赖与source_code_hash路径不一致的问题
问题根源
你遇到的核心矛盾在于Terraform的函数执行时机和资源生命周期不匹配:
filebase64sha256()是在计划阶段执行的,这个时候archive_file数据源还没生成zip文件(因为它依赖的null_resource要到应用阶段才会执行构建操作),所以自然找不到目标文件。depends_on只控制资源的创建顺序,无法改变计划阶段函数的执行逻辑,所以给lambda添加显式依赖也解决不了计划阶段的文件不存在问题。
正确解决方案
不需要手动计算文件哈希,archive_file数据源已经内置了计算好的base64哈希值——直接使用它的output_base64sha256属性即可,完全绕过计划阶段读取文件的问题。修正后的配置如下:
provider "aws" { region = "us-east-1" } resource "null_resource" "snapshot_pip_receiver" { provisioner "local-exec" { command = "cd ${path.module}/lambdas; make lint-snapshot collect-snapshot" } } data "archive_file" "lambda-zip" { depends_on = [ null_resource.snapshot_pip_receiver ] source_dir = "${path.module}/lambda/" output_path = "${path.module}/es-snapshot.zip" type = "zip" } resource "aws_lambda_function" "es_snapshot_lambda" { depends_on = [data.archive_file.lambda-zip] filename = data.archive_file.lambda-zip.output_path function_name = "test-lambda" # 注意:此处需替换为IAM角色ARN,而非策略ARN(你当前的配置有误) role = "arn:aws:iam::123456789012:role/YourLambdaExecutionRole" # 直接使用archive_file内置的哈希值,避免手动读取文件 source_code_hash = data.archive_file.lambda-zip.output_base64sha256 handler = "es-snapshot.lambda_handler" runtime = "python2.7" timeout = 10 }
额外说明
- 角色ARN修正:你当前的
role值是一个IAM策略的ARN,这是错误的——Lambda函数需要关联的是IAM角色的ARN,而非策略。请替换为你实际创建的Lambda执行角色ARN。 - 依赖逻辑有效性:现在的依赖链条是完整且正确的:
null_resource先执行代码构建 →archive_file基于构建后的代码生成zip →aws_lambda_function使用生成的zip包,整个流程在应用阶段会按顺序执行,计划阶段也不会再出现文件不存在的错误。 - 其他操作能运行的原因:
- 移除
archive_file的depends_on后,Terraform会在计划阶段就尝试生成zip文件,此时文件存在,所以函数能读取到,但这违反了你需要先执行null_resource构建代码的核心需求。 - 用另一个
null_resource调用output_path能运行,是因为null_resource的local-exec是在应用阶段执行的,计划阶段不会触发文件读取操作。
- 移除
内容的提问来源于stack exchange,提问作者shivams
相关产品推荐
相关产品推荐

