跳转至

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  # 部署阶段
import os
db_host = os.environ['DB_HOST']  # 在函数中读取环境变量

层(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
AccessDeniedIAM 权限不足给函数的 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 定价