AWS 无服务器架构教程
·
下面是一个完整的 AWS 无服务器架构教程,用于实现一个 OTA(Over-The-Air)固件更新服务。该服务提供两个 HTTP 接口:
GET /check:设备请求当前是否有可用更新(返回预签名 S3 URL)POST /report:设备上报更新结果(成功/失败等)
组件说明:
- API Gateway:暴露 REST API
- Lambda:处理业务逻辑(鉴权、查询 DynamoDB、生成 S3 预签名 URL、写入回执)
- S3:存储固件文件(如
firmware-v1.2.3.bin) - DynamoDB:存储设备信息、当前版本、目标版本、任务状态等
一、准备工作
1.1 AWS 账户与权限
确保你有权限创建以下资源:
- API Gateway
- Lambda
- S3 Bucket
- DynamoDB Table
- IAM Roles/Policies
建议使用 AWS CLI + SAM(Serverless Application Model) 或 Terraform/CDK,但本教程以 控制台 + 手动配置 为主,便于理解。
二、创建 S3 存储桶(用于固件)
- 进入 S3 控制台
- 创建新存储桶,例如:
my-ota-firmware-bucket-12345(全局唯一) - 不要启用“阻止所有公共访问”以外的公开访问(固件通过预签名 URL 访问,无需公开)
- 记下存储桶名称
✅ 固件示例路径:
s3://my-ota-firmware-bucket-12345/firmware/device-type-a/v1.2.3.bin
三、创建 DynamoDB 表
表名:OtaDevices
主键设计:
- 分区键(Partition Key):
deviceId(字符串,如device-001)
其他属性(可选,根据业务扩展):
| 字段名 | 类型 | 说明 |
|---|---|---|
| currentVersion | string | 当前固件版本 |
| targetVersion | string | 目标固件版本(若为空则无更新) |
| deviceType | string | 设备类型(用于选择固件) |
| lastCheck | string | 最后一次检查时间(ISO8601) |
| updateStatus | string | pending / downloaded / applied / failed |
| firmwareKey | string | S3 中的固件对象键(如 firmware/device-type-a/v1.2.3.bin) |
创建步骤:
- 进入 DynamoDB 控制台
- 点击“创建表”
- 表名:
OtaDevices - 分区键:
deviceId(类型:字符串) - 其他保持默认,点击“创建表”
📌 示例数据:
{
"deviceId": "device-001",
"currentVersion": "v1.1.0",
"targetVersion": "v1.2.3",
"deviceType": "sensor-x1",
"firmwareKey": "firmware/sensor-x1/v1.2.3.bin",
"updateStatus": "pending"
}
四、创建 Lambda 函数
我们将创建一个 Lambda 函数,处理 /check 和 /report 逻辑。
4.1 创建 Lambda
- 进入 Lambda 控制台
- 点击“创建函数” → “从头开始创作”
- 名称:
OtaHandler - 运行时:Python 3.12(或 Node.js 18.x,本教程用 Python)
- 权限:创建新角色(稍后手动添加权限)
4.3 配置环境变量
在 Lambda 函数的“配置” → “环境变量”中添加:
| 键 | 值 |
|---|---|
DYNAMODB_TABLE | OtaDevices |
S3_BUCKET | my-ota-firmware-bucket-12345 |
4.4 添加 IAM 权限
五、配置 API Gateway
5.1 创建 REST API
- 进入 API Gateway 控制台
- 点击“创建 API” → “REST API” → “构建”
- 选择“新建 API”,名称:
OtaApi,端点类型:Regional
5.2 创建资源和方法
创建 /check 资源
- 在“资源”中点击“操作” → “创建资源”
- 资源名称:
check - 资源路径:
check
- 资源名称:
- 选中
/check,点击“操作” → “创建方法” → 选择GET→ 勾选“使用 Lambda 代理集成” - Lambda 函数:选择
OtaHandler - 点击“保存”,确认权限
创建 /report 资源
- 同样创建资源
report - 添加
POST方法,同样指向OtaHandler,启用 Lambda 代理集成
5.3 部署 API
- 点击“操作” → “部署 API”
- 新建阶段(如
prod) - 记下调用 URL,例如:
https://abc123.execute-api.us-east-1.amazonaws.com/prod
六、测试流程
6.1 上传固件到 S3
aws s3 cp firmware/sensor-x1/v1.2.3.bin s3://my-ota-firmware-bucket-12345/firmware/sensor-x1/v1.2.3.bin
6.2 在 DynamoDB 插入测试设备
{
"deviceId": "device-001",
"currentVersion": "v1.1.0",
"targetVersion": "v1.2.3",
"deviceType": "sensor-x1",
"firmwareKey": "firmware/sensor-x1/v1.2.3.bin",
"updateStatus": "pending"
}
6.3 调用 /check
curl -H "Authorization: Bearer device-001" \
https://abc123.execute-api.us-east-1.amazonaws.com/prod/check
✅ 响应示例:
{
"updateAvailable": true,
"version": "v1.2.3",
"downloadUrl": "https://my-ota-firmware-bucket-12345.s3.amazonaws.com/...?X-Amz-Signature=..."
}
6.4 调用 /report
curl -X POST \
-H "Authorization: Bearer device-001" \
-H "Content-Type: application/json" \
-d '{"status": "success", "version": "v1.2.3"}' \
https://abc123.execute-api.us-east-1.amazonaws.com/prod/report
✅ 响应:{"message": "Report received"}
七、安全增强建议(生产环境)
-
鉴权升级:
- 使用 API Gateway 的 自定义授权方(Custom Authorizer) 或 Cognito
- 或使用 API Key + Usage Plan
-
输入验证:
- 在 Lambda 中校验
deviceId格式 - 防止路径遍历(如
firmwareKey不应包含../)
- 在 Lambda 中校验
-
日志与监控:
- 启用 CloudWatch Logs
- 设置告警(如大量 401 请求)
-
S3 安全:
- 确保 S3 存储桶策略禁止公开读取
- 启用服务器端加密(SSE-S3)
-
Lambda 超时与内存:
- 设置合理超时(如 10 秒)
- 内存 128MB 足够
八、清理(避免产生费用)
- 删除 API Gateway
- 删除 Lambda 函数
- 清空并删除 S3 存储桶
- 删除 DynamoDB 表
更多推荐


所有评论(0)