将EC2 Python脚本转为Terraform部署的AWS Lambda:handler配置问题
将EC2 Python脚本迁移到AWS Lambda(Terraform部署)
一、是否需要把Python脚本的main逻辑改成lambda_handler函数?
需要调整,但不用彻底重写原代码。核心做法是把原main函数里的业务逻辑移到lambda_handler函数中,同时保留原main入口方便本地测试。
举个修改示例:
原EC2脚本
import requests def main(): # 原业务逻辑:比如调用某个API response = requests.get("https://example.com/api") print(f"API响应状态码: {response.status_code}") if __name__ == "__main__": main()
修改后的Lambda兼容脚本
import requests def lambda_handler(event, context): # 把原main里的核心逻辑移到这里 response = requests.get("https://example.com/api") print(f"API响应状态码: {response.status_code}") # 可选:返回Lambda执行结果(供调用方查看) return { 'statusCode': 200, 'message': f"API响应状态码: {response.status_code}" } # 保留原main函数,本地测试时直接运行脚本即可 def main(): lambda_handler(None, None) if __name__ == "__main__": main()
说明:Lambda要求入口函数必须接收event和context两个参数(哪怕你用不到也得写上),这样修改后既能满足Lambda的要求,又不影响本地测试流程。
二、Terraform中aws_lambda_function的handler参数怎么配置?
handler参数的格式是文件名.函数名,注意文件名不要加.py后缀。
比如你的脚本文件叫my_task.py,里面的入口函数是lambda_handler,那么handler就设为my_task.lambda_handler。
给你完整的Terraform配置示例:
# Lambda函数资源配置 resource "aws_lambda_function" "python_task_lambda" { filename = "lambda_code.zip" # 打包好的脚本zip包路径 function_name = "python-task-lambda" role = aws_iam_role.lambda_exec_role.arn handler = "my_task.lambda_handler" # 核心配置:文件名.函数名 runtime = "python3.12" # 对应你的Python版本,比如python3.9、python3.11等 # 如果脚本有第三方依赖,需要一起打包,这里可以用source_code_hash做版本控制 source_code_hash = filebase64sha256("lambda_code.zip") } # Lambda所需的IAM执行角色 resource "aws_iam_role" "lambda_exec_role" { name = "lambda-execution-role" assume_role_policy = jsonencode({ Version = "2012-10-17" Statement = [ { Action = "sts:AssumeRole" Effect = "Allow" Principal = { Service = "lambda.amazonaws.com" } } ] }) } # 给角色添加基础执行权限(比如日志输出到CloudWatch) resource "aws_iam_role_policy_attachment" "lambda_basic_exec" { role = aws_iam_role.lambda_exec_role.name policy_arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole" }
注意:打包zip的时候,要确保脚本文件直接在zip根目录下,不要嵌套在子文件夹里,否则Lambda会找不到入口函数。
内容的提问来源于stack exchange,提问作者ERJAN
相关产品推荐
相关产品推荐

