第3章 AWS Lambda入门:概念、触发方式、运行环境(Python)、版本与别名

聊Lambda之前,我先问一句——你写过一个定时跑的任务吗?比如每天凌晨清日志、每小时拉一次监控数据。

传统做法是租一台服务器,装 cron,24 小时开机。但你仔细想想,真正干活的时间可能只有几秒钟。剩下时间都在空转,浪费钱还浪费心力。Lambda 就是来解决这个问题的。

一句话总结:Lambda 让你只关心代码,不关心服务器。事件来了就跑,跑完就睡。按调用次数+执行时长计费,空闲不花钱。

3.1 Lambda 是什么?核心概念

Lambda 是 AWS 提供的无服务器计算服务。它的基本单位叫函数(Function),本质就是一个代码包 + 配置好的运行环境。

我记得第一次接触Lambda时,脑子里的画面就是这个:你把一段 Python 代码丢进一个黑盒子,黑盒子自动拉起容器、装依赖、跑代码、返回结果、然后销毁。全程不用管底层 OS、补丁、扩缩容。是不是有点像小时候玩具店的扭蛋机?只不过扭出来的是执行结果。

这里列几个你必须搞懂的概念:

  • 函数——你的代码加配置,打包成一个可调用单元。
  • 触发器——什么事件能让函数跑起来。
  • 运行环境——Python 3.9/3.10/3.12 等,含底层系统和预装库。
  • 超时时间——最长跑 15 分钟,超时就杀掉。
  • 内存分配——从 128 MB 到 10,240 MB,CPU 性能随内存线性提升。
  • 版本与别名——管理代码快照和生产/测试环境切换的关键。

嗯,其中“版本与别名”是新手容易忽略但生产必备的,我们后面细说。

3.2 Lambda 的触发方式

Lambda 不会自己无缘无故跑起来。它需要被“踢一脚”。这一脚可以有几十种来源,我挑最常见的三种讲讲。

触发类型 常见服务 典型场景
定时/计划触发 Amazon EventBridge (CloudWatch Events) 每5分钟巡检一次、每天凌晨汇总报表
对象存储事件 Amazon S3 上传图片后自动缩略图、日志文件写入后分析
API 请求触发 API Gateway + Lambda 无服务器 REST API、WebSocket 后端

我在项目中遇到过最坑的一次:S3 事件触发 Lambda,结果 Lambda 处理完了又写回同一个 S3 桶,导致递归触发。几小时内账单就爆了……大家切记,一定要在写回时加前缀过滤或使用不同桶。

3.3 运行环境:Python 版入门

Lambda 支持 Python 3.x 多版本。你可以从控制台选,也可以用部署包指定。我个人习惯用 Python 3.12,因为它支持最新的语言特性,比如 match-case,写起定时巡检逻辑特别顺手。

看一个最简单的函数示例:

import json

def lambda_handler(event, context):
    # event 是触发事件的数据
    # context 提供运行时信息(如剩余时间、函数名等)
    print("Received event: " + json.dumps(event))
    
    # 你的业务逻辑
    result = {
        'statusCode': 200,
        'body': 'Hello from Lambda!'
    }
    return result

这个函数入口叫 lambda_handler,两个参数 event 和 context 是固定的。记住,event 的格式完全取决于触发器。比如定时触发时它是一段 JSON,S3 事件时又是一段嵌套结构。

避坑指南:Lambda 运行环境的临时磁盘只有 /tmp 可用,大小 512 MB 到 10 GB(取决于内存配置)。不要试图写文件到其他目录——你会得到 Permission denied。我曾经因为环境里写了个日志轮转脚本到 /var/log,跑去查了半天,最后发现是目录权限问题。

另外,Python 依赖怎么装?标准库自带很多,但第三方库(如 requests、boto3 增强版)需要打成 部署包(Deployment Package) 或使用 Lambda Layer。Layer 是个好东西,你可以把公共库放进去,多个函数共享,省空间也省更新时间。

3.4 版本与别名:生产部署的必修课

你写了个函数,一直改一直部署。突然线上出了问题,你想快速回滚到昨天那个稳定版本——怎么办?

这就是版本和别名存在的意义。

  • 版本(Version):每次发布的快照,有唯一 ARN,不可变。当你 Publish 新版本时,$LATEST 指针会改变,但旧版本仍然可用。
  • 别名(Alias):一个指向特定版本或版本权重的“指针”。比如 prod 别名指向版本 3,test 别名指向版本 4。你可以在别名上配置灰度发布,让 90% 流量走版本 3,10% 走版本 4。

警告:$LATEST 是可变指针,永远指向你最后一次保存的草稿。千万不要在生产环境里用 $LATEST 做触发器目标!否则你每次保存代码,线上行为就跟着变了,毫无可控性可言。

我在公司做定时巡检项目时,就吃过这个亏。第一次部署没用版本,直接拿 $LATEST 配了 EventBridge。后来同事改了一个函数调试,没注意影响到了生产环境的巡检。那天下午根因定位花了两小时——从那以后,所有生产 Lambda 必须走版本+别名。

3.5 一张图理清 Lambda 核心逻辑

AWS Lambda 核心概念关系图 Lambda 函数 定时/计划触发 S3 对象事件 API Gateway 请求 版本(Version) 别名(Alias) 运行环境:Python 3.9/3.10/3.12 | 依赖:部署包 / Layer 内存:128 MB – 10,240 MB | 超时:最大 900 秒 (15 分钟) 计费:调用次数 + 执行时长

这张图你可以存下来。开发时碰到任何 Lambda 问题,先定位是哪个环节:触发器不对?代码报错?版本没切?Alias 没更新?对照图走一遍排查流程,效率能高不少。

3.6 小结——你该记住什么?

  • Lambda 的核心是“事件驱动、用完即走”。
  • 触发方式要看你的实际场景:定时用 EventBridge,S3 事件用 S3 通知,API 用 API Gateway。
  • Python 运行环境要注意 /tmp 权限和依赖打包方式。
  • 版本与别名是生产级部署的标配,千万别偷懒用 $LATEST。

好了,概念我们都梳理透了。接下来就是动手环节——配置你的第一个定时巡检 Lambda 函数。