本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
教程:使用 AWS Lambda 函数格式化通知
本教程演示如何将MQTT消息数据发送到 AWS Lambda 操作以进行格式化并发送到其他 AWS 服务。在本教程中, AWS Lambda 操作使用将格式化的消息发送 AWS SDK到您在教程中创建的有关如何操作的Amazon SNS 主题教程:发送 Amazon SNS 通知。
在关于如何教程:发送 Amazon SNS 通知操作的教程中,由规则的查询语句生成的JSON文档作为短信的正文发送。结果是一条文本消息,示例如下:
{"device_id":"32","reported_temperature":38,"max_temperature":30}
在本教程中,您将使用 AWS Lambda 规则操作来调用一个 AWS Lambda 函数,该函数将规则查询语句中的数据格式化为更友好的格式,例如以下示例:
Device 32 reports a temperature of 38, which exceeds the limit of 30.
您将在本教程中创建的 AWS Lambda 函数使用规则查询语句中的数据格式化消息字符串,并调用的 p SNSublish
在本教程中您将学到
-
如何创建和测试 AWS Lambda 函数
-
如何使用 AWS Lambda 函数 AWS SDK中的来发布 Amazon SNS 通知
-
如何在规则SQL查询语句中使用简单的查询和函数
-
如何使用MQTT客户端测试 AWS IoT 规则
完成本教程需要大约 45 分钟。
在本教程中,您将:
在开始本教程之前,请确保您具有:
-
设置 AWS 账户
你需要你的 AWS 账户 和 AWS IoT 主机才能完成本教程。
-
审核 通过 AWS IoT MQTT客户端查看MQTT消息
请务必使用MQTT客户端订阅和发布主题。在此过程中,您将使用MQTT客户端来测试您的新规则。
-
完成本部分中的其它规则教程
本教程需要您在教程中创建的有关如何操作的SNS通知主题教程:发送 Amazon SNS 通知。本教程还假定您已完成本部分中其它与规则相关的教程。
-
审核 AWS Lambda概览
如果您 AWS Lambda 以前从未使用过,请查看AWS Lambda并开始使用 Lambda,以了解其术语和概念。
步骤 1:创建发送短信的 AWS Lambda 函数
本教程中的 AWS Lambda 函数接收规则查询语句的结果,将元素插入文本字符串,然后将生成的字符串SNS作为通知中的消息发送给 Amazon。
与使用 AWS IoT 规则操作发送通知的操作方法教程不同,本教程使用的函数从 Lambda 函数发送通知。教程:发送 Amazon SNS 通知 AWS SDK但是,本教程中实际使用的Amazon SNS 通知主题与您在教程中使用的操作主题相同教程:发送 Amazon SNS 通知。
创建发送短信的 AWS Lambda 函数
-
创建新 AWS Lambda 函数。
-
在 AWS Lambda 控制台
中,选择 Create function(创建函数)。 -
在 Create function(创建函数)中,选择 Use a blueprint(使用蓝图)。
搜索并选择
hello-world-python
蓝图,然后选择 Configure(配置)。 -
在 Basic information(基本信息)中:
-
在 Function name(函数名称)中,输入函数的名称,
format-high-temp-notification
。 -
在执行角色中,选择从 AWS 策略模板创建新角色。
-
在 Role name(角色名称)中,为新角色输入名称,
format-high-temp-notification-role
。 -
在 “政策模板-可选” 中,搜索并选择 Amazon SNS 发布政策。
-
选择 Create function (创建函数)。
-
-
-
修改蓝图代码以格式化并发送 Amazon SNS 通知。
-
创建函数后,您应该会看到format-high-temp-notification详细信息页面。如果您不这样做,请从 Lambda Functions
(Lambda 函数)页打开它。 -
在format-high-temp-notification详细信息页面中,选择配置选项卡,然后滚动到函数代码面板。
-
在 Function code(函数代码)窗口中的 Environment(环境)窗格中,选择 Python 文件,
lambda_function.py
。 -
在 Function code(函数代码)窗口中,从蓝图中删除所有原始程序代码,并将其替换为此代码。
import boto3 # # expects event parameter to contain: # { # "device_id": "32", # "reported_temperature": 38, # "max_temperature": 30, # "notify_topic_arn": "
arn:aws:sns:us-east-1:57EXAMPLE833:high_temp_notice
" # } # # sends a plain text string to be used in a text message # # "Device {0} reports a temperature of {1}, which exceeds the limit of {2}." # # where: # {0} is the device_id value # {1} is the reported_temperature value # {2} is the max_temperature value # def lambda_handler(event, context): # Create an SNS client to send notification sns = boto3.client('sns') # Format text message from data message_text = "Device {0} reports a temperature of {1}, which exceeds the limit of {2}.".format( str(event['device_id']), str(event['reported_temperature']), str(event['max_temperature']) ) # Publish the formatted message response = sns.publish( TopicArn = event['notify_topic_arn'], Message = message_text ) return response -
选择 Deploy(部署)。
-
-
在新窗口中,从教程中查找有关如何操作的亚马逊SNS主题的亚马逊资源名称 (ARN) 教程:发送 Amazon SNS 通知。
-
在新窗口中,打开 Amazon SNS 控制台的主题页面
。 -
在主题页面中,在亚马逊主题列表中找到 high_temp_notice 通知主题。SNS
-
找到要在下ARN一步中使用的 high_temp_notice 通知主题。
-
-
为您的 Lambda 函数创建一个测试用例。
-
在控制台的 Lambda F un
ctions 页面的format-high-temp-notification详细信息页面上,选择页面右上角的选择测试事件(尽管它看起来已禁用),然后选择配置测试事件。 -
在 Configure test event(配置测试事件)中,选择 Create new test event(创建新测试事件)。
-
在 Event name(事件名称)中,输入
SampleRuleOutput
。 -
在事件名称下方的JSON编辑器中,粘贴此示例JSON文档。这是您的 AWS IoT 规则将向 Lambda 函数发送的内容的示例。
{ "device_id": "32", "reported_temperature": 38, "max_temperature": 30, "notify_topic_arn": "
arn:aws:sns:us-east-1:57EXAMPLE833:high_temp_notice
" } -
请参阅包含 high_temp_notice 通知主题ARN的窗口并复制该值。ARN
-
将JSON编辑器中的
notify_topic_arn
值替换为通知主题ARN中的值。保持此窗口处于打开状态,以便在创建 AWS IoT 规则时可以再次使用此ARN值。
-
选择创建。
-
-
使用示例数据测试函数。
-
在页面右上角的format-high-temp-notification详细信息页面中,确认SampleRuleOutput显示在 “测试” 按钮旁边。如果没有,请从可用测试事件列表中选择它。
-
要将示例规则输出消息发送到您的函数,请选择 Test(测试)。
-
如果函数和通知都有效,您将在订阅通知的手机上收到一条文本消息。
如果您在手机上没有收到文本消息,请检查操作结果。在 Function code(函数代码)面板中的 Execution result(执行结果)选项卡上,查看响应以查找发生的任何错误。请勿继续执行下一步,直到您的函数可以将通知发送到您的手机。
步骤 2:使用 AWS IoT 规则操作创建 AWS Lambda 规则
在此步骤中,您将使用规则查询语句格式化来自虚拟气象传感器设备的数据,以发送到 Lambda 函数,该函数将格式化并发送文本消息。
从天气设备接收的示例消息负载如下所示:
{ "temperature": 28, "humidity": 80, "barometer": 1013, "wind": { "velocity": 22, "bearing": 255 } }
在此规则中,您将使用规则查询语句为 Lambda 函数创建消息负载,如下所示:
{ "device_id": "32", "reported_temperature": 38, "max_temperature": 30, "notify_topic_arn": "
arn:aws:sns:us-east-1:57EXAMPLE833:high_temp_notice
" }
这包含 Lambda 函数格式化和发送正确文本消息所需的所有信息。
创建调用 Lambda 函数的 AWS IoT 规则
-
要在 Rule(规则)中创建新规则,请选择 Create(创建)。
-
在 Create a rule(创建规则)顶部:
-
在 Name(名称)中,输入规则的名称,
wx_friendly_text
。请记住,规则名称在您的 AWS 账户 和区域内必须是唯一的,并且不能有任何空格。我们在此名称中使用了下划线字符来分隔规则名称中的两个单词。
-
在 Description(说明)中,描述规则。
有意义的描述可以更容易地记住此规则的作用以及您创建它的原因。描述可以根据需要延长,因此请尽可能详细。
-
-
在 Create a rule(创建规则)的 Rule query statement(规则查询语句)中:
-
在使用SQL版本中,选择
2016-03-23
。 -
在 Rule query statement(规则查询语句)编辑框中,输入语句:
SELECT cast(topic(2) AS DECIMAL) as device_id, temperature as reported_temperature, 30 as max_temperature, '
arn:aws:sns:us-east-1:57EXAMPLE833:high_temp_notice
' as notify_topic_arn FROM 'device/+/data' WHERE temperature > 30本语句:
-
监听主题与
device/+/data
主题筛选条件匹配且temperature
值大于 30 的MQTT消息。 -
从主题字符串中选择第二个元素,将其转换为十进制数,然后将其分配给
device_id
字段。 -
从消息负载中选择
temperature
字段的值,并将其分配给reported_temperature
字段。 -
创建常数值,
30
,以表示限制值,并将其分配给max_temperature
字段。 -
为
notify_topic_arn
字段创建常数值。
-
-
请参阅包含 high_temp_notice 通知主题ARN的窗口并复制该值。ARN
-
替换ARN值 (
arn:aws:sns:us-east-1:57EXAMPLE833:high_temp_notice
) 在规则查询语句编辑器ARN中包含您的通知主题。
-
-
在 Set one or more actions(设置一个或多个操作)中:
-
要打开此规则的规则操作列表,请选择 Add action(添加操作)。
-
在 Select an action(选择操作)中,选择 Send a message to a Lambda function(向 Lambda 函数发送消息)。
-
要打开选定操作的配置页面,请在操作列表底部选择 Configure action(配置操作)。
-
-
在 Configure action(配置操作)中:
-
在 Function name(函数名称)中,选择 Select(选择)。
-
选择format-high-temp-notification。
-
在 Configure action(配置操作)底部,选择 Add action(添加操作)。
-
要创建规则,请在 Create a rule(创建一条规则)底部,选择 Create rule(创建规则)。
-
步骤 3:测试 AWS IoT 规则和 AWS Lambda 规则操作
要测试您的新规则,您需要使用MQTT客户端发布和订阅此规则使用的MQTT消息。
在新窗口中打开 AWS IoT
控制台中的MQTT客户端
使用MQTT客户端测试您的规则
-
在AWS IoT 控制台的MQTT客户端中
,订阅输入主题,在本例中为 device/+/data
。-
在MQTT客户端的 “订阅” 下,选择 “订阅主题”。
-
在 Subscription topic(订阅主题)中,输入输入主题筛选条件的主题,
device/+/data
。 -
将其它字段保留为默认设置。
-
选择 Subscribe to topic(订阅主题)。
在 Subscriptions(订阅)栏,在 Publish to a topic(发布到主题)项下,将会显示
device/+/data
。
-
-
使用特定设备 ID
device/32/data
向输入主题发布消息。您无法发布到包含通配符的MQTT话题。-
在MQTT客户端的 “订阅” 下,选择 “发布到主题”。
-
在 Publish(发布)字段中,输入输入主题名称,
device/32/data
。 -
复制此处显示的示例数据,然后在主题名称下方的编辑框中粘贴示例数据。
{ "temperature": 38, "humidity": 80, "barometer": 1013, "wind": { "velocity": 22, "bearing": 255 } }
-
要发布您的MQTT消息,请选择发布到主题。
-
-
确认文本消息已发送。
-
在MQTT客户端的 “订阅” 下,您之前订阅的主题旁边有一个绿点。
绿色圆点表示自上次查看消息以来已收到一条或多条新消息。
-
在 Subscriptions(订阅)中,选择 device/+/data 来检查消息负载是否与刚刚发布的内容匹配,如下所示:
{ "temperature": 38, "humidity": 80, "barometer": 1013, "wind": { "velocity": 22, "bearing": 255 } }
-
检查您用来订阅该SNS主题的手机,并确认消息负载的内容如下所示:
Device 32 reports a temperature of 38, which exceeds the limit of 30.
如果您更改消息主题中的主题 ID 元素,请记住,将
topic(2)
值投射为数字值仅在消息主题中的元素仅包含数字字符时才起作用。
-
-
尝试发送MQTT一条温度不超过极限的消息。
-
在MQTT客户端的 “订阅” 下,选择 “发布到主题”。
-
在 Publish(发布)字段中,输入输入主题名称,
device/33/data
。 -
复制此处显示的示例数据,然后在主题名称下方的编辑框中粘贴示例数据。
{ "temperature": 28, "humidity": 80, "barometer": 1013, "wind": { "velocity": 22, "bearing": 255 } }
-
要发送MQTT消息,请选择发布到主题。
您应在
device/+/data
订阅中看到您发送的消息;但是,由于温度值低于规则查询语句中的最大温度,因此您不应收到文本消息。如果您未看到正确的行为,请检查故障排除提示。
-
对您的 AWS Lambda 规则和通知进行故障排除
如果您没有看到期望的结果,可以检查以下事项。
-
您收到了一个错误的广告条
如果在您发布输入消息时出现错误,请先更正该错误。以下步骤可帮助您更正此错误。
-
你在MQTT客户端中看不到输入消息
如果您按照步骤中所述订阅了
device/32/data
主题筛选器,则每次向device/+/data
主题发布输入消息时,该消息都应出现在MQTT客户端中。要检查的事项
-
检查您订阅的主题筛选条件
如果您如流程中所述订阅了输入消息主题,则每次发布输入消息时都应看到该输入消息的副本。
如果没有看到该消息,请检查您订阅的主题名称,并将其与您发布的主题进行比较。主题名称区分大小写,您订阅的主题必须与发布消息负载的主题相同。
-
检查消息发布函数
在MQTT客户端的 “订阅” 下,选择 device/+/data,选中发布消息的主题,然后选择发布到主题。您应该会看到来自主题下方编辑框中的消息负载出现在消息列表中。
-
-
你没有收到SMS消息
要使您的规则生效,它必须有正确的策略来授权它接收消息和发送SNS通知,并且它必须接收消息。
要检查的事项
-
检查 AWS 区域 您的MQTT客户端和您创建的规则
您运行MQTT客户端的控制台必须与您创建的规则位于同一 AWS 区域。
-
检查消息负载中的温度值是否超过测试阈值
如果温度值小于或等于 30(如规则查询语句中定义),则规则将不会执行其任何操作。
-
检查规则查询语句中的输入消息主题
要使规则起作用,它必须收到一条消息,其主题名称必须与规则查询语FROM句子句中的主题过滤器相匹配。
检查规则查询语句中主题筛选器的拼写和MQTT客户端中主题筛选器的拼写。主题名称区分大小写,消息的主题必须与规则查询语句中的主题筛选条件匹配。
-
检查输入消息负载的内容
要使规则起作用,它必须在语句中SELECT声明的消息负载中找到数据字段。
将规则查询语句中
temperature
字段的拼写与MQTT客户端中消息有效载荷的拼写进行检查。字段名称区分大小写,规则查询语句中temperature
字段必须与消息负载中的temperature
字段相同。确保消息负载中的JSON文档格式正确。如果有任何错误,例如缺少逗号,则规则将无法读取它。JSON
-
查看 Amazon SNS 通知
在中步骤 1:创建用于发送SMS短信的 Amazon SNS 主题,请参阅步骤 3,该步骤描述了如何测试 Amazon SNS 通知并测试通知以确保通知有效。
-
检查 Lambda 函数
在 步骤 1:创建发送短信的 AWS Lambda 函数中,请参阅步骤 5,该步骤介绍如何使用测试数据测试 Lambda 函数并测试 Lambda 函数。
-
检查规则所使用的角色
规则操作必须具有接收原始主题和发布新主题的权限。
授权规则接收消息数据并重新发布的策略特定于所使用的主题。如果更改用于重新发布消息数据的主题,则必须更新规则操作的角色,以更新其策略来匹配当前主题。
如果怀疑这里出现了问题,请编辑“重新发布”规则操作并创建新角色。规则操作创建的新角色将接收执行这些操作所需的授权。
-
步骤 4:查看结果和后续步骤
在本教程中:
-
您创建了一 AWS IoT 条规则来调用 Lambda 函数,该函数使用您的自定义消息负载发送了 Amazon SNS 通知。
-
您使用规则SQL查询语句中的简单查询和函数为您的 Lambda 函数创建了新的消息负载。
-
你使用MQTT客户端来测试你的 AWS IoT 规则。
后续步骤
使用此规则发送了几条文本消息后,请尝试使用它来了解更改教程的某些方面如何影响消息以及发送消息的时间。以下想法可以帮助您开始操作。
-
改变
device_id
在输入消息的主题中,然后观察短信内容中的效果。 -
更改规则查询语句中选定的字段,更新 Lambda 函数以在新消息中使用这些字段,并观察文本消息内容中的效果。
-
将规则查询语句中的测试更改为测试最低温度而不是最高温度。更新 Lambda 函数以格式化新消息,并记得更改
max_temperature
名称。 -
要详细了解如何查找在开发和使用 AWS IoT 规则时可能出现的错误,请参阅监控 AWS IoT。