AWS IoT Core → Lambda(MQTT)完整实战指南
·
AWS IoT Core → Lambda(MQTT)完整实战指南
1️⃣ 架构说明
设备 / MQTT 客户端
|
| MQTT over TLS (8883)
v
AWS IoT Core
|
| IoT Rule(规则引擎)
v
AWS Lambda
|
v
CloudWatch Logs / DynamoDB / 其他服务
2️⃣ 前置条件
-
AWS 账号
-
已启用 AWS IoT Core
-
Linux / macOS / Windows(WSL 可)
-
MQTT 客户端(推荐 mosquitto)
-
OpenSSL
3️⃣ 创建 IoT Thing、证书、策略
3.1 创建 Thing
路径:
AWS IoT Core → 管理 → Things → 创建 Thing
-
Thing 名称:
test-device
3.2 创建并下载证书
-
创建新证书
-
下载以下 3 个文件(非常重要):
-
设备证书:
xxx-certificate.pem.crt -
私钥:
xxx-private.pem.key -
根证书:
AmazonRootCA1.pem
-
-
激活证书
3.3 创建并绑定 IoT Policy(关键)
创建策略并绑定到证书:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"iot:Connect",
"iot:Publish",
"iot:Subscribe",
"iot:Receive"
],
"Resource": "*"
}
]
}
⚠️ 正式环境请限制 Resource,这里是测试用。
4️⃣ 测试 MQTT → AWS IoT Core
4.1 发布 MQTT 消息
mosquitto_pub \
--cafile AmazonRootCA1.pem \
--cert device-cert.pem.crt \
--key private.key \
-h <你的-endpoint>-ats.iot.ap-northeast-1.amazonaws.com \
-p 8883 \
-t "my/iot/topic" \
-m '{"temperature":25.5,"humidity":60,"device":"test-device"}'
4.2 AWS 控制台验证
路径:
AWS IoT Core → 测试 → MQTT 测试客户端
订阅 Topic:
my/iot/topic
✅ 能看到消息说明 IoT Core 已成功接收 MQTT。
5️⃣ 创建 Lambda 函数
5.1 创建 Lambda
-
运行时:Python 3.10
-
函数名:
iot_mqtt_logger
5.2 Lambda 示例代码
def lambda_handler(event, context):
print("=== 接收到 MQTT 消息 ===")
print(event)
return {"statusCode": 200}
5.3 IAM 权限(必须)
给 Lambda 角色绑定:
AWSLambdaBasicExecutionRole
否则 CloudWatch 没日志。
6️⃣ 创建 IoT Rule(MQTT → Lambda)
6.1 创建规则
路径:
AWS IoT Core → 消息路由 → 规则 → 创建规则
6.2 规则 SQL(最推荐)
SELECT
*,
encode(*, 'base64') AS payload,
topic() AS topic
FROM 'my/iot/topic'
⚠️ Topic 必须完全一致。
6.3 规则动作
-
动作类型:调用 Lambda 函数
-
选择:
iot_mqtt_logger -
允许 AWS 自动添加权限(一定要勾选)
7️⃣ 验证 Lambda 是否收到 MQTT
7.1 再次发送 MQTT
mosquitto_pub \
--cafile AmazonRootCA1.pem \
--cert device-cert.pem.crt \
--key private.key \
-h <endpoint> \
-p 8883 \
-t "my/iot/topic" \
-m '{"temperature":30.1,"humidity":55}'
7.2 查看 CloudWatch 日志
路径:
CloudWatch → Logs → /aws/lambda/iot_mqtt_logger
日志示例:
=== 接收到 MQTT 消息 ===
{'temperature': 30.1, 'humidity': 55}
🎉 成功!
8️⃣ 二进制 Payload 处理(常见坑)
如果 Lambda 中 payload 是空的:
IoT Rule SQL
SELECT
encode(*, 'base64') AS payload
FROM 'my/iot/topic'
Lambda 解码
import base64
import json
def lambda_handler(event, context):
raw = base64.b64decode(event['payload']).decode('utf-8')
print("原始字符串:", raw)
print("JSON 对象:", json.loads(raw))
9️⃣ MQTT 消息过滤(规则 SQL)
只处理温度大于 30 的消息:
SELECT *
FROM 'my/iot/topic'
WHERE temperature > 30
🔟 常见问题排查
| 问题 | 原因 | 解决 |
|---|---|---|
| Lambda 被触发但无数据 | SQL 写错 | 使用 SELECT * |
| Lambda 完全没触发 | Topic 不一致 | 检查规则 Topic |
| TLS 连接失败 | CA 错误 | 使用 AmazonRootCA1 |
| MQTT.fx 连不上 | Java TLS 问题 | 建议 mosquitto |
| 消息重复 | QoS=1 | 自己去重 |
1️⃣1️⃣ 生产环境建议
-
IoT Policy 使用 最小权限
-
Lambda 开启 DLQ
-
MQTT Payload 加
messageId -
打开 IoT 日志(调试期)
-
使用 CloudWatch 监控
更多推荐




所有评论(0)