如何通过Lambda响应AWS S3 Put事件并向MQTT主题发布消息
实现Lambda向AWS IoT主题发布MQTT消息及后续移动端推送思路
嗨,恭喜你已经搞定了S3触发Lambda的核心配置!既然调用次数正常,那接下来就聚焦怎么让Lambda给IoT主题发消息,以及后续的移动端推送方案,咱一步步来:
第一步:给Lambda角色添加上IoT发布权限
Lambda要调用AWS IoT的API,得先拿到权限才行。你需要给当前Lambda使用的IAM角色添加一条自定义权限策略:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "iot:Publish", "Resource": "arn:aws:iot:你的区域:你的AWS账号ID:topic/你的目标主题名" } ] }
比如你的主题是s3-upload-notify,区域是us-east-1,就把对应的地方替换掉就行。
第二步:编写Lambda代码发布MQTT消息
以Python为例(新手友好),用AWS的boto3 SDK就能轻松实现。下面是完整的示例代码:
import boto3 import json # 初始化IoT客户端,注意要和你的IoT Core区域一致 iot_client = boto3.client('iot-data', region_name='你的区域') TARGET_TOPIC = '你的目标主题名' # 比如"s3-upload-notify" def lambda_handler(event, context): # 从S3事件里提取上传的对象信息(可选,用来丰富消息内容) s3_info = event['Records'][0]['s3'] bucket_name = s3_info['bucket']['name'] object_key = s3_info['object']['key'] # 构造要发送的消息内容 message = { "type": "s3_upload", "bucket": bucket_name, "object": object_key, "timestamp": context.get_remaining_time_in_millis() } # 发布消息到IoT主题 try: response = iot_client.publish( topic=TARGET_TOPIC, qos=1, # QoS级别,1确保消息至少送达一次 payload=json.dumps(message) ) print(f"消息发布成功,响应: {response}") return { 'statusCode': 200, 'body': json.dumps('消息已发布到IoT主题') } except Exception as e: print(f"发布失败: {str(e)}") raise e
代码里已经加了注释,你只需要替换区域和主题名就行。如果用Node.js的话,思路类似,用AWS SDK的IoTDataPlane客户端调用publish方法。
第三步:在IoT控制台验证消息
- 打开AWS IoT控制台,进入测试页面
- 在订阅主题里输入你的目标主题名,点击“订阅”
- 上传一个文件到触发Lambda的S3桶
- 很快就能在控制台的消息面板看到Lambda发送过来的消息啦!
后续:实现移动端推送的思路
当你搞定IoT消息发布后,要推送到iOS/Android应用可以用两种方式:
- 方案一:IoT规则引擎+SNS
- 在IoT控制台创建规则,筛选你发布的
s3_upload类型消息 - 把规则的动作设置为转发到Amazon SNS主题
- 在SNS里分别配置APNs(iOS)和FCM(Android)的平台应用,把设备令牌订阅到SNS主题,这样有消息时就会自动推送到移动端
- 在IoT控制台创建规则,筛选你发布的
- 方案二:Lambda直接调用SNS
如果你不想用IoT规则,也可以在Lambda里同时调用IoT和SNS的API,直接把消息推送给移动端。不过规则引擎更灵活,能做消息过滤、转换等操作,推荐优先考虑。
内容的提问来源于stack exchange,提问作者Marszal
相关产品推荐
相关产品推荐

