You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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
}

额外说明

  1. 角色ARN修正:你当前的role值是一个IAM策略的ARN,这是错误的——Lambda函数需要关联的是IAM角色的ARN,而非策略。请替换为你实际创建的Lambda执行角色ARN。
  2. 依赖逻辑有效性:现在的依赖链条是完整且正确的:null_resource先执行代码构建 → archive_file基于构建后的代码生成zip → aws_lambda_function使用生成的zip包,整个流程在应用阶段会按顺序执行,计划阶段也不会再出现文件不存在的错误。
  3. 其他操作能运行的原因:
    • 移除archive_file的depends_on后,Terraform会在计划阶段就尝试生成zip文件,此时文件存在,所以函数能读取到,但这违反了你需要先执行null_resource构建代码的核心需求。
    • 用另一个null_resource调用output_path能运行,是因为null_resource的local-exec是在应用阶段执行的,计划阶段不会触发文件读取操作。

内容的提问来源于stack exchange,提问作者shivams

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 07:12:47