在本篇博客中,我们将介绍如何将 AWS IoT Core 消息从一个或多个接收账户路由到数据账户中的 Amazon Simple Queue Service (SQS)。这是一种常见的模式,尤其是在需将物联网数据从多个账户收集后,进行进一步处理的场景中。我们将介绍如何配置 AWS IoT 规则以实现跨账户访问,并将 MQTT 主题数据集发送到 Amazon SQS。
本篇博客将讲解如何将 AWS IoT Core 消息从一个或多个接收账户路由到 Amazon Simple Queue Service (Amazon SQS) 中的数据账户。在许多情况下,物联网设备的数据会先进入一个账户,然后再发送到另一个账户进行进一步处理。比如,一些组织在多个账户中托管设备,其收集到的数据可能同时属于敏感和操作性数据。敏感数据需要留在原始收集账户,而操作数据则需转发到由运营团队监控的另一个账户。
您将学会如何配置 AWS IoT 规则以支持跨账户访问,并将 MQTT 主题的数据集路由到 Amazon SQS。AWS IoT 规则使您的设备能够与 AWS 服务进行交互。您可以使用规则来支持从设备增强或过滤数据、将数据写入数据库、发布消息到 Amazon SQS 等任务。如需了解您可以执行的任务的完整列表,请参考 AWS IoT 的规则 部分及 AWS IoT Core 开发者指南。
在本解决方案中,您将首先在数据账户中创建一个 Amazon SQS 队列并授予接收账户发布的权限。接下来,您将创建 AWS IoT 规则并向其发送消息以进行测试。
步骤描述1在数据账户中创建名为 iotdata 的 Amazon SQS 队列,并允许接收账户对该队列的发布。2在接收账户中 创建一个具备发布到数据账户 Amazon SQS 权限的 IAM 角色。 创建一个允许对 SQS 队列发布错误恢复的 IAM 角色。3在接收账户中创建一个 IoT 规则以评估来自 data/private 的消息并将其发送到数据账户的 SQS 队列。此规则将具有错误行动,将消息重新发布到 error/rules 主题。4向 MQTT 主题 data/private 发布消息并确保在数据账户的 SQS 队列中可见。json { MessageRetentionPeriod 259200 }
在为数据账户配置的 AWS CLI 下,使用以下命令创建名为 iotdata 的 SQS 队列。shell aws sqs createqueue queuename iotdata attributes file//queueattributesjson
记录输出的 QueueURL,该值将在后面的步骤中使用。要授予接收账户访问 Amazon SQS 队列资源的权限,运行 addpermission 命令。请确保根据需要更新账户号码。shell aws sqs addpermission queueurl https//sqsltdata account regiongtamazonawscom/ltdata account IDgt/iotdata label IoTSendMessage awsaccountids ltingestion account IDgt actions SendMessage
为了使数据账户的 SQS 队列能够接收来自接收账户的消息,您首先需要允许该操作。
创建名为 iotpolicyjson 的文件,内容如下:json { Version 20121017 Statement [ { Effect Allow Principal { Service iotamazonawscom } Action stsAssumeRole } ] }
在为接收账户配置的 AWS CLI 下,执行以下命令创建名为 iotcrosssqsallow 的角色并附加信任策略以允许其与 IoT 进行交互。shell aws iam createrole rolename iotcrosssqsallow assumerolepolicydocument file//iotpolicyjson
检查输出确保其正确:json { Role { Path / RoleName iotcrosssqsallow RoleId XXXXXXXXXXXXXXXXXXXXX Arn arnawsiamXXXXXXXXXXXXrole/iotcrosssqsallow CreateDate 20220907T0505580000 AssumeRolePolicyDocument { Version 20121017 Statement [ { Effect Allow Principal { Service iotamazonawscom } Action stsAssumeRole } ] } } }
创建名为 allowsendcrosssqsjson 的文件,其中的资源 ARN 需根据数据账户的地区和 ID 更新。json { Version 20121017 Statement [ { Effect Allow Action sqsSendMessage Resource arnawssqsltdata account regiongtltdata account IDgtiotdata } ] }
通过以下命令将该自定义内联策略添加到前面创建的角色中:shell aws iam putrolepolicy rolename iotcrosssqsallow policyname newiotcrosssqspolicy policydocument file//allowsendcrosssqsjson
在使用 AWS IoT 规则重新发布消息时,必须正确设置权限以允许该操作。
在为接收账户配置的 AWS CLI 下,使用之前创建的文件创建新角色 iotrepublish:shell aws iam createrole rolename iotrepublish assumerolepolicydocument file//iotpolicyjson
检查输出确保其正确:json { Role { Path / RoleName iotrepublish RoleId XXXXXXXXXXXXXXXXXXXXX Arn arnawsiamXXXXXXXXXXXXrole/iotrepublish CreateDate 20220907T0524360000 AssumeRolePolicyDocument { Version 20121017 Statement [ { Effect Allow Principal { Service iotamazonawscom } Action stsAssumeRole } ] } } }
接下来创建名为 allowrepublishjson 的文件,内容如下。请注意,此策略限制发布到以 errors 开头的主题名称。您需要根据接收账户的区域和 ID 进行更新。json { Version 20121017 Statement { Effect Allow Action iotPublish Resource arnawsiotltingestion account regiongtltingestion account IDgterrors/ } }
将刚创建的策略作为内联策略添加到 iotrepublish 角色中:shell aws iam putrolepolicy rolename iotrepublish policyname iotrepublish policydocument file//allowrepublishjson
接下来,我们将建立 IoT 规则,该规则将消息路由到 SQS 队列,并将遇到错误的消息重新发布到名为 error/rules 的主题。
创建名为 ingestionrulejson 的文件,内容如下。请根据之前接收到的值更新 queueURL 和 roleArn。
json { sql SELECT FROM data/private description Crossaccount publishing of messages to SQS ruleDisabled false awsIotSqlVersion 20160323 actions [{ sqs { roleArn ltiotcrosssqsallow role ARNgt queueUrl https//sqsltdata account regiongtamazonawscom/ltdata account IDgt/iotdata useBase64 true } }] errorAction { republish { roleArn ltiotrepublish role ARNgt topic error/rules qos 0 } } }
在为接收账户配置的 AWS CLI 下,创建一个 IoT 规则以便将消息发布到数据账户的 SQS 队列:shell aws iot createtopicrule rulename crossaccountsqspublish topicrulepayload file//ingestionrulejson
为了测试解决方案,您可以向 AWS IoT Core 发布一条消息,以查看其是否成功到达数据账户的 SQS 队列。
从接收账户,使用 AWS IoT MQTT 客户端 订阅 data/private 和 error/rules 主题。继续使用 AWS MQTT IoT 客户端,向 data/private 主题发布一条消息,示例有效负载如下:json { message Hello world clientType MQTT client }
从 SQS 队列检索消息并查看输出,配置 AWS CLI 以进行数据账户并运行以下命令:shell aws sqs receivemessage queueurl https//sqsltdata account regiongtamazonawscom/ltdata account IDgt/iotdata
Body 参数可能是 Base64 编码的。如果是,您需要解码它以查看发布消息的内容。
如果消息未能在 SQS 队列中收到,请检查 error/rules 主题的订阅是否有来自接收账户的 AWS MQTT IoT 客户端的错误消息。清理任何不再需要的资源是一种良好的实践。清理 AWS 资源可以防止帐户产生其他费用。
删除 SQS 队列:shell aws sqs deletequeue queueurl https//sqsltdata account regiongtamazonawscom/ltdata account IDgt/iotdata
删除 iotcrosssqsallow IAM 角色:shell aws iam deleterolepolicy rolename iotcrosssqsallow policyname newiotcrosssqspolicy
aws iam deleterole rolename iotcrosssqsallow
删除 iotrepublish 角色:shell aws iam deleterolepolicy rolename iotrepublish policyname iotrepublish
飞兔加速器官网iosaws iam deleterole rolename iotrepublish
删除 crossaccountsqspublish 主题规则:shell aws iot deletetopicrule rulename crossaccountsqspublish
在本篇博客中,我们介绍了如何将 AWS IoT 消息从接收账户路由到数据账户的 Amazon SQS。展示了一种允许将敏感设备和操作数据在不同账户中进行隔离的模式。如需进一步的示例,了解其他 AWS 服务的跨账户消息路由,请查阅 AWS 开发者指南 中的相关文档。
KaiMatthias Dickman 也是亚马逊网络服务 (AWS) 的物联网专家解决方案架构师。他喜欢与大型企业的开发人员和决策者合作,推动 AWS IoT 服务的采用。Kai 拥有深入的物联网和云端知识,并在这一角色中与全球客户进行合作,帮助他们使用 AWS 生态系统构建 IoT 解决方案。
TAGS Amazon SQS AWS IoT AWS IoT Core 物联网