AWS Lambda 无服务器函数¶
一句话概述:AWS Lambda 是亚马逊的无服务器计算服务,你只需要写函数代码上传,AWS 自动管理服务器、自动扩缩容,按调用次数计费,不调用不收费。
核心知识点¶
| 概念 | 白话解释 |
|---|---|
| 无服务器(Serverless) | 不用管服务器,写好代码扔上去就能跑 |
| 函数(Function) | Lambda 的基本单位,一个函数处理一种请求 |
| 触发器(Trigger) | 什么时候调用函数:API 请求、定时任务、文件上传等 |
| 冷启动 | 函数第一次调用时需要初始化环境,会有延迟 |
| 层(Layer) | 函数间共享的依赖包,比如公共库 |
| 执行角色(IAM Role) | 函数的权限,决定能访问哪些 AWS 服务 |
| API Gateway | 给 Lambda 函数加一个 HTTP 入口,变成 Web API |
安装配置¶
前置条件¶
# 1. 安装 AWS CLI
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip && sudo ./aws/install # 安装 AWS CLI
# 2. 配置凭证
aws configure # 输入 Access Key、Secret Key、区域
# AWS Access Key ID: AKIA***
# AWS Secret Access Key: ***
# Default region: ap-southeast-1(新加坡)
# Default output format: json
# 3. 安装 SAM CLI(Serverless Application Model)
pip install aws-sam-cli # SAM CLI 简化 Lambda 开发
创建项目¶
# 用 SAM 初始化项目
sam init # 交互式创建项目
# 选择模板 → Hello World → Python/Node.js → 项目名
# 项目结构
my-lambda/
├── template.yaml # SAM 模板(定义函数和资源)
├── hello_world/
│ ├── app.py # Lambda 函数代码
│ └── requirements.txt # Python 依赖
└── events/
└── event.json # 测试事件
SAM 模板¶
# template.yaml - 定义 Lambda 函数和 API
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31 # 使用 SAM 模板
Globals:
Function:
Timeout: 30 # 函数超时时间(秒)
Runtime: python3.11 # Python 运行时
MemorySize: 256 # 内存(MB),也影响 CPU 分配
Resources:
HelloFunction:
Type: AWS::Serverless::Function # Lambda 函数
Properties:
Handler: app.lambda_handler # 入口函数
CodeUri: hello_world/ # 代码目录
Events:
ApiEvent:
Type: Api # API Gateway 触发器
Properties:
Path: /hello # API 路径
Method: get # HTTP 方法
基本使用¶
Python Lambda 函数¶
# hello_world/app.py
import json # JSON 处理
def lambda_handler(event, context):
"""Lambda 入口函数
Args:
event: 触发事件数据(HTTP 请求、S3 事件等)
context: 运行时信息(函数名、超时时间、内存等)
"""
# 从 API Gateway 获取查询参数
name = event.get('queryStringParameters', {}).get('name', '世界') # 获取 ?name=xxx
return {
'statusCode': 200, # HTTP 状态码
'headers': {
'Content-Type': 'application/json', # 响应类型
},
'body': json.dumps({ # 响应体(必须是字符串)
'message': f'你好, {name}!',
}),
}
Node.js Lambda 函数¶
// index.mjs
export const handler = async (event, context) => {
const name = event.queryStringParameters?.name || '世界' // 获取查询参数
return {
statusCode: 200, // HTTP 状态码
body: JSON.stringify({ message: `你好, ${name}!` }), // 响应体
}
}
本地开发和部署¶
# 本地测试
sam local invoke HelloFunction # 本地调用函数
sam local invoke HelloFunction -e events/event.json # 用事件文件调用
sam local start-api # 启动本地 API Gateway(http://localhost:3000)
# 构建
sam build # 构建函数(安装依赖、打包)
# 部署
sam deploy --guided # 首次部署(交互式配置)
sam deploy # 后续部署
高级用法¶
环境变量¶
# template.yaml
Resources:
MyFunction:
Type: AWS::Serverless::Function
Properties:
Environment:
Variables:
DB_HOST: mydb.amazonaws.com # 数据库地址
STAGE: production # 部署阶段
层(Layer)共享依赖¶
# 创建层目录结构
mkdir -p layer/python
pip install requests -t layer/python/ # 安装依赖到层目录
# 在 template.yaml 中定义层
# Layers:
# SharedLayer:
# Type: AWS::Serverless::LayerVersion
# Properties:
# ContentUri: layer/
# CompatibleRuntimes:
# - python3.11
定时触发(Cron)¶
# 每小时执行一次
Events:
ScheduleEvent:
Type: Schedule
Properties:
Schedule: rate(1 hour) # 每小时
# 或用 cron: cron(0 12 * * ? *) # 每天 12 点
常见报错¶
| 报错信息 | 原因 | 解决方案 |
|---|---|---|
Task timed out | 执行超过超时时间 | 增大 Timeout 或优化代码 |
Module not found | 依赖没打包进去 | sam build 或检查 Layer |
AccessDenied | IAM 权限不足 | 给函数的 Role 加权限 |
Cold start 太慢 | 冷启动延迟 | 减少包大小、用预留并发 |
Out of memory | 内存不够 | 增大 MemorySize |
Invalid handler | 入口函数配置错误 | 检查 Handler 格式:文件名.函数名 |
速查表¶
# SAM CLI 命令
sam init # 初始化项目
sam build # 构建
sam local invoke # 本地调用
sam local start-api # 本地 API
sam deploy --guided # 首次部署
sam deploy # 部署
sam logs -n FuncName # 查看日志
sam delete # 删除应用
# AWS CLI Lambda 命令
aws lambda list-functions # 列出函数
aws lambda invoke --function-name xxx out.json # 调用函数
aws lambda update-function-code --function-name xxx --zip-file fileb://code.zip # 更新代码
# 限制(免费套餐)
# 每月 100 万次调用免费
# 每月 40 万 GB-秒计算时间免费
# 函数最大执行时间:15 分钟
# 部署包大小:50MB(压缩)/ 250MB(解压)
# 内存:128MB - 10,240MB
参考:AWS Lambda 文档 | SAM 文档 | Lambda 定价