亚马逊AWS官方博客
在零售场景中使用 AWS IoT Device Management 处理订单请求 | AWS 上的物联网
- 如何创建分层组结构及如何将您的 IoT 设备分配到不同的组。
- 如何基于组策略将消息发布到不同的 IoT 设备。
场景
我们将使用西雅图一家零售店作为示例,该零售店向 IoT 设备网关发布订单请求。网关将订单消息发送给 AWS IoT Core 进行处理,而 AWS IoT Core 则将订单消息发布给旧金山的工厂。
在此情况中,我们将使用 AWS IoT Device Management 管理西雅图的 IoT 网关队列和旧金山的制造设备队列。
将给每个组分配不同的策略。
- 对于西雅图组,设备只能通过特定主题发布其消息。他们不能发布有关其他任何商店的信息。西雅图零售店将不会从 AWS IoT Core 接收消息。
- 对于旧金山组,设备只能订阅为旧金山工厂指定的消息。这表示,这些设备不能从其他工厂接收消息。
注释
- 开始前,请注意组是分层的。您必须仔细定义父级组和子级组。父级组创建后不能更改。您不能将某个组移动到另一个父级组中。
- 根据组策略继承,子级组中的设备会继承父级组的策略,因此,您必须仔细设计您的组分层结构和策略继承。通常情况下,最好的做法是父级组应具有最严格的组策略。为子级组添加更具体的权限。由于策略继承原因,如果父级组与子级组之间发生冲突(例如,如果同一个资源上同时具有 Allow 语句和 Deny 语句),则该操作将被显式拒绝。在创建组策略树时,请记住这一点。
组配置示例
1. 登录 AWS 管理控制台并打开 AWS IoT 控制台。您将在“管理”下找到新的“组”选项。您可以使用控制台或下列 CLI 命令创建新组。在我们的场景中,我们将先创建一个父级组 – 美国,然后再创建两个子级组 – 西雅图和旧金山。您需要添加两个子级组到其父级组美国中,并验证您的组分层结构。
#创建父级组# aws iot create-thing-group --thing-group-name 'US' #创建子级组并分配到父级组 aws iot create-thing-group --thing-group-name 'Seattle' --parent-group-name 'US' aws iot create-thing-group --thing-group-name 'San_Francisco' --parent-group-name 'US'
2. 对于我们的场景,我们将创建两个事物:SeattleThing1 and SanFranciscoThing1.然后将每个事物添加到事物注册表中并分配到其命名组中。您需要将证书附加到新创建的事物中,以便该事物可以通过 MQTT TLS 1.2 与设备网关连接。您可以使用自己的证书或使用 AWS IoT Core CA。在此示例中,我们将使用 AWS IoT Core CA 为每个事物分配一个新证书。
#创建新的 IoT 事物# aws iot create-thing --thing-name SeattleThing1 aws iot create-thing --thing-name SanFranciscoThing1 #创建证书并将其设置为活动状态 #为 SeattleThing1 创建证书 aws iot create-keys-and-certificate --set-as-active #为 SanFranciscoThing1 创建证书 aws iot create-keys-and-certificate --set-as-active #将证书附加到 IoT 事物 aws iot attach-thing-principal --thing-name SeattleThing1 --principal <Certificate ARN> aws iot attach-thing-principal --thing-name SanFranciscoThing1 --principal <Certificate ARN> #将 IoT 事物添加到组中# aws iot add-thing-to-thing-group --thing-name SeattleThing1 --thing-group-name Seattle aws iot add-thing-to-thing-group --thing-name SanFranciscoThing1 --thing-group-name San_Francisco
3. 在发布 AWS IoT Device Management 之前,您需要将策略附加到单个证书并单独管理策略。现在,您可以将策略附加到组中而不是各个证书中。您可以根据不同的组分配来创建策略。西雅图组只允许发布到西雅图订单状态主题,旧金山组只允许订阅到 AWS IoT Core 中的订单处理主题。您可以使用控制台或下列命令创建策略。
aws iot create-policy --policy-name <Policy Name>--policy-document <Policy Value>
a. 对于美国组,我们将使用最严格的策略,该策略只允许设备连接到 AWS IoT Core,而不需要任何发布/订阅过程。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "iot:Connect", "Resource": "arn:aws:iot:ap-northeast-1:XXXXXXXXXXXX:client/${iot:ClientId}" } ] }
b. 对于西雅图组,我们将使用下列策略:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "iot:Publish", "Resource": "arn:aws:iot:ap-northeast-1:XXXXXXXXXXXX:topic/Seattle/${iot:Connection.Thing.ThingName}/*" } ] }
c. 对于旧金山组,我们将使用下列策略:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "iot:Subscribe", "Resource": "arn:aws:iot:ap-northeast-1:XXXXXXXXXXXX:topicfilter/San_Francisco/*" }, { "Effect": "Allow", "Action": "iot:Receive", "Resource": "arn:aws:iot:ap-northeast-1:XXXXXXXXXXXX:topic/San_Francisco/${iot:Connection.Thing.ThingName}/*" } ] }
4. 创建策略后,您可以将每个策略单独附加到不同组中。您可以使用控制台或下列 CLI 命令将策略附加到组中。
aws iot attach-policy --target <Thing Group Arn> --policy-name <Policy Name>
5. 附加三个策略后,您可以构建自己的订单请求系统。在此情况下,我们将 MQTT.fx 用作 MQTT 客户端(它代表西雅图的商店和旧金山的工厂)来连接 AWS IoT Core。
6. 现在,我们来进入有趣的部分。我们可以模拟西雅图接收订单的商店,然后再模拟旧金山使用 IoT 规则处理订单请求处理系统的工厂。我们可以创建 IoT 规则以从 Seattle/SeattleThing1/OrderStatus 主题中选择 OrderNumber 属性,然后将其重新发布到 San_Francisco/SanFranciscoThing1/ProcessOrder 主题。这样,西雅图店的订单请求将由旧金山工厂处理。您需要创建规则操作,以便可以将消息重新发布到旧金山主题。有关规则引擎的信息,请参阅 AWS IoT 开发人员指南中的 AWS IoT 规则。您可以使用控制台或下列 CLI 命令创建 IoT 规则:
aws iot create-topic-rule –rule-name <Rule Name> --topic-rule-payload <Rule Value>
7. 现在,您可以使用 MQTT.fx 客户端发布西雅图店的订单消息。
8. IoT 规则将选择此消息中的 OrderNumber 属性并将其重新发布到旧金山工厂设备中。您将从 MQTT.fx 旧金山设备中接收结果。
附录
当您将策略附加到某个组时,该策略将应用至该组中的所有设备。我们建议您使用 TestAuthorization API 在本地测试您的策略,这样便不会影响生产环境中的真实设备。您可以使用下列命令模拟预期结果。
1. 首先,使用下列命令验证您的组的当前附加策略:
#使用下面的命令在您的事物上验证当前有效的策略,该事物只附加了一个组策略# aws iot test-authorization --auth-infos "[{\"actionType\": \"CONNECT\", \"resources\":[<Thing ARN>]}, {\"actionType\": \"PUBLISH\", \"resources\": [<Topic ARN>\"]}]" --client-id <Thing Name> --principal <certificate-ARN>
下面显示命令输出。如您所见,“CONNECT”操作被允许,“PUBLISH”被拒绝。
{ "authResults": [ { "authDecision": "ALLOWED", "authInfo": { "actionType": "CONNECT", "resources": [ "arn:aws:iot:ap-northeast-1:XXXXXXXXXXX:client/SeattleThing1" ] }, "denied": { "implicitDeny": { "policies": [] }, "explicitDeny": { "policies": [] } }, "missingContextValues": [], "allowed": { "policies": [ { "policyName": "GroupManagement-US", "policyArn": "arn:aws:iot:ap-northeast-1:XXXXXXXXXXX:policy/GroupManagement-US" } ] } }, { "authDecision": "IMPLICIT_DENY", "authInfo": { "actionType": "PUBLISH", "resources": [ "arn:aws:iot:ap-northeast-1:XXXXXXXXXXX:topic/Seattle/SeattleThing1" ] }, "denied": { "implicitDeny": { "policies": [ { "policyName": "GroupManagement-US", "policyArn": "arn:aws:iot:ap-northeast-1:XXXXXXXXXXX:policy/GroupManagement-US" } ] }, "explicitDeny": { "policies": [] } }, "missingContextValues": [], "allowed": { "policies": [] } } ] }
2. 在您开始为同一个组附加新的组策略之前,使用以下命令验证该新策略的结果:
#在附加完成新的组策略后使用以下命令验证结果d# aws iot test-authorization --auth-infos "[{\"actionType\": \"CONNECT\", \"resources\": [<Thing ARN>]}, {\"actionType\": \"PUBLISH\", \"resources\": [<Topic ARN>]}]" --client-id <Thing Name> --principal <certificate-ARN> --policy-names-to-add "[<New Group Policy Name>]"
下面显示命令输出。如您所见,“CONNECT”和“PUBLISH”都是允许的操作。
{ "authResults": [ { "authDecision": "ALLOWED", "authInfo": { "actionType": "CONNECT", "resources": [ "arn:aws:iot:ap-northeast-1: XXXXXXXXXXX:client/SeattleThing1" ] }, "denied": { "implicitDeny": { "policies": [ { "policyName": "GroupManagement-Seattle", "policyArn": "arn:aws:iot:ap-northeast-1:XXXXXXXXXXX:policy/GroupManagement-Seattle" } ] }, "explicitDeny": { "policies": [] } }, "missingContextValues": [], "allowed": { "policies": [ { "policyName": "GroupManagement-US", "policyArn": "arn:aws:iot:ap-northeast-1:XXXXXXXXXXX:policy/GroupManagement-US" } ] } }, { "authDecision": "ALLOWED", "authInfo": { "actionType": "PUBLISH", "resources": [ "arn:aws:iot:ap-northeast-1:XXXXXXXXXXXX:topic/Seattle/SeattleThing1" ] }, "denied": { "implicitDeny": { "policies": [ { "policyName": "GroupManagement-US", "policyArn": "arn:aws:iot:ap-northeast-1:XXXXXXXXXXX:policy/GroupManagement-US" } ] }, "explicitDeny": { "policies": [] } }, "missingContextValues": [], "allowed": { "policies": [ { "policyName": "GroupManagement-Seattle", "policyArn": "arn:aws:iot:ap-northeast-1:XXXXXXXXXXX:policy/GroupManagement-Seattle" } ] } } ] }
参考链接:
· AWS IoT 开发人员指南中的事物组
· AWS IoT 开发人员指南中的 AWS IoT 策略
· AWS IoT 开发人员指南中的 AWS IoT 规则