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

Terraform未将Lambda代码Zip包上传至AWS的问题咨询

解决Terraform创建Lambda后代码为空的问题

我来帮你排查这个Lambda代码上传失败的问题,咱们一步步来解决:

1. 先修正Zip包的结构(最常见原因)

Lambda对Python运行时的代码包有明确要求:handler指定的文件必须能在Zip包的根目录(或对应路径)被找到。你的handler是tf_lambda.lambda_handler,意味着Lambda要找的是根目录下tf_lambda.py文件里的lambda_handler函数。

看你的目录结构,tf_lambda.py放在tf_lambda子目录里,如果直接把整个子目录打包成tf_lambda.zip,解压后结构会是:

tf_lambda/
└── tf_lambda.py

这种情况下Lambda找不到根目录下的tf_lambda.py,自然显示代码为空。

正确的打包方式:
进入tf_lambda子目录,直接打包里面的文件(如果有依赖包也一起包含):

cd tf_lambda
# 只打包单个py文件
zip ../tf_lambda.zip tf_lambda.py
# 如果有第三方依赖,先安装到当前目录再打包
# pip install your-dependency -t .
# zip -r ../tf_lambda.zip .

这样生成的tf_lambda.zip解压后,tf_lambda.py直接在根目录,符合Lambda的要求。

2. 优化Terraform配置细节

你的现有配置有两个可以调整的点,避免潜在问题:

(1)简化source_code_hash的写法

虽然旧版的${base64sha256(file("tf_lambda.zip"))}能工作,但Terraform 0.12+推荐用更简洁的filebase64sha256函数,避免嵌套调用:

source_code_hash = filebase64sha256("tf_lambda.zip")

这个函数会直接计算文件的Base64编码SHA256哈希,效果和原来一致,但更易读。

(2)role必须使用IAM角色的ARN

你当前写的role = "lambda_basic_execution"是角色名称,Terraform需要的是角色的完整ARN(比如arn:aws:iam::123456789012:role/lambda_basic_execution)。如果用名称可能导致角色关联失败,虽然不会直接引发代码为空,但会影响Lambda执行权限,建议一起修正。

可以用Terraform的数据源自动获取ARN,避免硬编码:

data "aws_iam_role" "lambda_role" {
  name = "lambda_basic_execution"
}

resource "aws_lambda_function" "terraform_lambda" {
  filename      = "tf_lambda.zip"
  function_name = "tf_lambda"
  role          = data.aws_iam_role.lambda_role.arn
  handler       = "tf_lambda.lambda_handler"
  source_code_hash = filebase64sha256("tf_lambda.zip")
  runtime       = "python3.6"
}

3. 重新部署验证

完成以上调整后,执行以下命令重新部署:

terraform init
terraform plan
terraform apply

部署完成后再去AWS控制台查看Lambda函数,代码区域应该就能正常显示你上传的内容了。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 10:06:05