一个完整的 AWS 无服务器架构教程 - 教程

news/2025/11/27 14:24:49/文章来源:https://www.cnblogs.com/tlnshuju/p/19277398

一个完整的 AWS 无服务器架构教程 - 教程

2025-11-27 14:22  tlnshuju  阅读(0)  评论(0)    收藏  举报

下面是一个完整的 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 账户与权限

确保你有权限创建以下资源:

建议使用 AWS CLI + SAM(Serverless Application Model)Terraform/CDK,但本教程以 控制台 + 手动配置 为主,便于理解。


二、创建 S3 存储桶(用于固件)

  1. 进入 S3 控制台
  2. 创建新存储桶,例如:my-ota-firmware-bucket-12345(全局唯一)
  3. 不要启用“阻止所有公共访问”以外的公开访问(固件通过预签名 URL 访问,无需公开)
  4. 记下存储桶名称

✅ 固件示例路径:s3://my-ota-firmware-bucket-12345/firmware/device-type-a/v1.2.3.bin


三、创建 DynamoDB 表

表名:OtaDevices

主键设计:

其他属性(可选,根据业务扩展):

字段名类型说明
currentVersionstring当前固件版本
targetVersionstring目标固件版本(若为空则无更新)
deviceTypestring设备类型(用于选择固件)
lastCheckstring最后一次检查时间(ISO8601)
updateStatusstringpending / downloaded / applied / failed
firmwareKeystringS3 中的固件对象键(如 firmware/device-type-a/v1.2.3.bin

创建步骤:

  1. 进入 DynamoDB 控制台
  2. 点击“创建表”
  3. 表名:OtaDevices
  4. 分区键:deviceId(类型:字符串)
  5. 其他保持默认,点击“创建表”

示例数据:

{
"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

  1. 进入 Lambda 控制台
  2. 点击“创建函数” → “从头开始创作”
  3. 名称:OtaHandler
  4. 运行时:Python 3.12(或 Node.js 18.x,本教程用 Python)
  5. 权限:创建新角色(稍后手动添加权限)

4.2 编写代码(Python)

import json
import boto3
import os
from datetime import datetime, timedelta
from botocore.exceptions import ClientError
# 初始化客户端
dynamodb = boto3.resource('dynamodb')
s3_client = boto3.client('s3')
table = dynamodb.Table(os.environ['DYNAMODB_TABLE'])
BUCKET_NAME = os.environ['S3_BUCKET']
def lambda_handler(event, context):
print("Event:", json.dumps(event))
# 获取 HTTP 方法和路径
http_method = event['httpMethod']
resource_path = event['resource']
# 简单鉴权:检查 header 中的 token(实际应使用更安全机制,如 JWT、API Key)
auth_token = event['headers'].get('Authorization') or event['headers'].get('authorization')
if not auth_token or not auth_token.startswith("Bearer "):
return {
'statusCode': 401,
'body': json.dumps({'error': 'Missing or invalid Authorization header'})
}
device_id = auth_token.split(" ")[1]  # 假设 token 是 "Bearer <deviceId>"try:if resource_path == '/check' and http_method == 'GET':return handle_check(device_id)elif resource_path == '/report' and http_method == 'POST':body = json.loads(event['body']) if event.get('body') else {}return handle_report(device_id, body)else:return {'statusCode': 404, 'body': json.dumps({'error': 'Not found'})}except Exception as e:print("Error:", str(e))return {'statusCode': 500, 'body': json.dumps({'error': 'Internal error'})}def handle_check(device_id):# 1. 查询设备信息response = table.get_item(Key={'deviceId': device_id})if 'Item' not in response:return {'statusCode': 404, 'body': json.dumps({'error': 'Device not found'})}item = response['Item']# 2. 检查是否有待更新if not item.get('targetVersion') or item.get('currentVersion') == item.get('targetVersion'):return {'statusCode': 200,'body': json.dumps({'updateAvailable': False})}# 3. 生成预签名 URL(有效期 10 分钟)firmware_key = item['firmwareKey']try:presigned_url = s3_client.generate_presigned_url('get_object',Params={'Bucket': BUCKET_NAME, 'Key': firmware_key},ExpiresIn=600  # 10 分钟)except ClientError as e:return {'statusCode': 500, 'body': json.dumps({'error': 'Failed to generate URL'})}# 4. 更新 lastCheck 时间table.update_item(Key={'deviceId': device_id},UpdateExpression="SET lastCheck = :t",ExpressionAttributeValues={':t': datetime.utcnow().isoformat()})return {'statusCode': 200,'body': json.dumps({'updateAvailable': True,'version': item['targetVersion'],'downloadUrl': presigned_url,'firmwareKey': firmware_key})}def handle_report(device_id, report_data):# 报告内容示例:{"status": "success", "message": "Applied v1.2.3"}status = report_data.get('status', 'unknown')message = report_data.get('message', '')# 更新设备状态table.update_item(Key={'deviceId': device_id},UpdateExpression="SET updateStatus = :s, currentVersion = :v, lastReport = :t",ExpressionAttributeValues={':s': status,':v': report_data.get('version', 'unknown'),':t': datetime.utcnow().isoformat()})return {'statusCode': 200,'body': json.dumps({'message': 'Report received'})}

4.3 配置环境变量

在 Lambda 函数的“配置” → “环境变量”中添加:

DYNAMODB_TABLEOtaDevices
S3_BUCKETmy-ota-firmware-bucket-12345

4.4 添加 IAM 权限

编辑 Lambda 的执行角色(在“配置” → “权限”中点击角色名),附加以下策略:

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"dynamodb:GetItem",
"dynamodb:UpdateItem"
],
"Resource": "arn:aws:dynamodb:YOUR_REGION:YOUR_ACCOUNT:table/OtaDevices"
},
{
"Effect": "Allow",
"Action": [
"s3:GetObject"
],
"Resource": "arn:aws:s3:::my-ota-firmware-bucket-12345/*"
}
]
}

替换 YOUR_REGIONYOUR_ACCOUNT(或直接使用控制台 ARN)


五、配置 API Gateway

5.1 创建 REST API

  1. 进入 API Gateway 控制台
  2. 点击“创建 API” → “REST API” → “构建”
  3. 选择“新建 API”,名称:OtaApi,端点类型:Regional

5.2 创建资源和方法

创建 /check 资源
创建 /report 资源
  • 同样创建资源 report
  • 添加 POST 方法,同样指向 OtaHandler,启用 Lambda 代理集成

5.3 部署 API

  1. 点击“操作” → “部署 API”
  2. 新建阶段(如 prod
  3. 记下调用 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"}


七、安全增强建议(生产环境)

  1. 鉴权升级

    • 使用 API Gateway 的 自定义授权方(Custom Authorizer)Cognito
    • 或使用 API Key + Usage Plan
  2. 输入验证

    • 在 Lambda 中校验 deviceId 格式
    • 防止路径遍历(如 firmwareKey 不应包含 ../
  3. 日志与监控

    • 启用 CloudWatch Logs
    • 设置告警(如大量 401 请求)
  4. S3 安全

    • 确保 S3 存储桶策略禁止公开读取
    • 启用服务器端加密(SSE-S3)
  5. Lambda 超时与内存

    • 设置合理超时(如 10 秒)
    • 内存 128MB 足够

八、清理(避免产生费用)


✅ 至此,你已成功搭建一个基于 AWS 的 OTA 固件分发服务!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/978445.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入解析:【Latex】本地部署latex+vscode

深入解析:【Latex】本地部署latex+vscodepre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "…

工单小程序开发公司,3家高效工单小程序开发公司推荐:微信小程序/支付宝小程序/抖音小程序/电商小程序/寺庙小程序都涵盖

在企业数字化转型进程中,工单系统已从“可选工具”变为“刚需平台”。无论是物业运维、设备售后还是企业内部协作,工单小程序凭借轻量化、即用化的特性,成为连接需求方与服务方的关键枢纽。然而,市场上开发团队资质…

白带异常中成药有哪些?女性健康调理常用药物盘点

白带是女性生殖系统健康的重要信号,当出现颜色、质地、气味异常时,可能提示妇科炎症或内分泌失调。中成药因具有调理整体、副作用较小的特点,常被用于白带异常的辅助调理。本文将结合医学常识与临床实践,介绍相关中…

工业自动化航空发动机零部件加工发那科 CNC 与贝加莱 PLC Modbus 协议转换方案

一、项目背景:航空发动机零部件精密加工生产线的通讯困境 在工业自动化航空航天领域的航空发动机零部件精密加工生产线中,Modbus RTU 转 Modbus TCP总线协议通讯,企业采用发那科 31i-B CNC 系统(带 PLC 功能,Modb…

口碑好的治疗白带异常品牌解析与推荐

近日,微博上一则关于“妇科炎症像感冒一样常见”的话题登上热搜,引发广泛讨论,同时也反映出一个现实问题:许多女性仍将妇科炎症视为难以启齿的私密困扰,而实际上,它正像普通感冒一样常见。国际流行病学数据显示,…

PBAV70-600-ASEMI可直接替代安世BAS70

PBAV70-600-ASEMI可直接替代安世BAS70编辑:ll PBAV70-600-ASEMI可直接替代安世BAS70 型号:PBAV70 品牌:ASEMI 封装:SOT-23 特性:肖特基二极管 正向电流:1A 反向耐压:70V 引脚数量:3 芯片个数:1 工作温度:-50…

2025年口碑好的FRP采光板生产厂家排行榜,优质供应商推荐

为帮企业高效锁定适配自身需求的FRP采光板合作伙伴,避免选型走弯路,我们从原料品质把控(如树脂纯度、玻璃纤维含量)、核心性能稳定性(耐候、阻燃、防腐指标)、定制化服务能力(特殊场景适配、生产周期)、真实客…

2025年手按式样电源总开关批发厂家权威推荐榜单:高低压直流接触器/旋钮式样电源总开关/启动继电器源头厂家精选

手按式电源总开关作为电路控制的关键部件,其可靠性与耐用性直接影响到用电设备的安全与使用寿命。随着工业自动化与智能家居市场的快速发展,2025年中国低压电器市场规模预计突破千亿元,其中开关类元件年增长率保持在…

小学与幼儿园研学基地哪个好?为你推荐广州文搏科普小镇

在孩子的成长过程中,研学活动正逐渐成为培养综合素养的重要途径。对于小学和幼儿园的孩子们来说,选择一个靠谱的研学基地至关重要。那么,小学研学基地和幼儿园研学基地哪个好呢?又该如何挑选靠谱的研学基地呢?接下…

【SQL练习】找出每一科都是前30%的学生ID

分数表 scores,字段:id, subject, score 找出每一科都是前30%的学生ID。 造数据: import pandas as pd import numpy as np import random# 设置随机种子保证结果可重现 np.random.seed(42)def generate_score_data…

2025 年 11 月超声设备厂家权威推荐榜:河北/山西/辽宁/江苏/浙江/山东/广东/四川等区域实力品牌深度解析与选购指南

2025 年 11 月超声设备厂家权威推荐榜:河北/山西/辽宁/江苏/浙江/山东/广东/四川等区域实力品牌深度解析与选购指南 超声检测技术作为现代工业质量控制的关键环节,在材料科学、制造业和工程安全领域发挥着不可替代的…

深入解析:突破构建瓶颈:Zulip前端Webpack持久化缓存深度优化

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

从深度学习基础到稳定扩散技术解析

本文介绍了最新的深度学习课程,重点讲解稳定扩散算法的从零实现过程,涵盖DDPM、DDIM等扩散模型,以及多种神经网络架构和优化技术,适合具备深度学习基础的开发者深入学习。从深度学习基础到稳定扩散 我们发布了包含…

环保型反渗透设备TOP5权威推荐:精品定制服务商深度测评,助

环保政策趋严与水资源短缺背景下,企业对高性能反渗透设备需求激增。2024年数据显示,工业水处理设备市场规模超1200亿元,其中反渗透设备占比达45%,年增速30%,但32%的企业反馈存在设备适配性差、运维成本高、环保不…

2025年鸿容AI智能办公鼠标年度排名:深度测评5大AI鼠标

在AI赋能生产力的时代,AI智能办公鼠标成为企业降本增效、个人提升效率的核心工具。为帮助用户精准选择适配需求的AI鼠标,我们从大模型集成能力、办公营销场景覆盖度、硬件性能稳定性、用户口碑反馈四大维度展开测评,…

中国口碑最好的生发品牌黑奥秘:19 年深耕,四大理疗 + 加盟赋能双驱动

作为中国口碑最好的生发品牌,黑奥秘深耕脱发白发理疗领域 19 年,凭借专利技术、完善产品体系和成熟加盟模式,成为万千消费者的护发首选和创业者的靠谱伙伴。从白转黑、防脱生发到头皮理疗、发干理疗,黑奥秘以 “技…

2025年评价高的陕西人参皂苷Top实力厂家排行榜

2025 年评价高的陕西人参皂苷 Top 实力厂家排行榜在大健康产业蓬勃发展、天然植物提取物需求激增的 2025 年,人参皂苷作为兼具营养与保健价值的核心原料,其纯度、安全性与功效稳定性成为食品、保健品、化妆品企业采购…

VMware Ubuntu虚拟机安装 备忘录

速览 # 1.update $ sudo apt update# 2.vm tools $ sudo apt install open-vm-tools-desktop open-vm-tools# 3.挂载共享文件夹 # 在宿主机的文件夹设置中启用共享 # 在 VM Ware 的虚拟机设置中‘选项’页添加共享文…

Path-面向对象的文件系统路径操作

Path 是 Python 标准库 pathlib 模块中的一个核心类,主要用于面向对象的文件系统路径操作。 主要用途 路径表示与操作:以面向对象的方式处理文件和目录路径 跨平台兼容:自动处理不同操作系统(Windows、Linux、macO…