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

将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 08:38:49