Terraform未将Lambda代码Zip包上传至AWS的问题咨询
我来帮你排查这个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

