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 监控


Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐