在零售场景中使用 AWS IoT Device Management 处理订单请求

阅读数:69 2019 年 9 月 25 日 15:51

在零售场景中使用 AWS IoT Device Management 处理订单请求

在此博文中,我们将模拟常见的商业场景,以向您展示如何在 AWS IoT Device Management 中使用组策略功能。具体来说,我们将描述:

  • 如何创建分层组结构及如何将您的 IoT 设备分配到不同的组。
  • 如何基于组策略将消息发布到不同的 IoT 设备。

场景

在零售场景中使用 AWS IoT Device Management 处理订单请求
我们将使用西雅图一家零售店作为示例,该零售店向 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'
  1. 对于我们的场景,我们将创建两个事物: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
  1. 在发布 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}/*"
}
]
}
  1. 复制代码
    创建策略后,您可以将每个策略单独附加到不同组中。您可以使用控制台或下列 CLI 命令将策略附加到组中。
复制代码
aws iot attach-policy --target <Thing Group Arn> --policy-name <Policy Name>
  1. 复制代码
    附加三个策略后,您可以构建自己的订单请求系统。在此情况下,我们将 MQTT.fx 用作 MQTT 客户端(它代表西雅图的商店和旧金山的工厂)来连接 AWS IoT Core。
  2. 复制代码
    现在,我们来进入有趣的部分。我们可以模拟西雅图接收订单的商店,然后再模拟旧金山使用 IoT 规则处理订单请求处理系统的工厂。我们可以创建 IoT 规则以从 Seattle/SeattleThing1/OrderStatus 主题中选择 OrderNumber 属性,然后将其重新发布到 San_Francisco/SanFranciscoThing1/ProcessOrder 主题。这样,西雅图店的订单请求将由旧金山工厂处理。您需要创建规则操作,以便可以将消息重新发布到旧金山主题。有关规则引擎的信息,请参阅 AWS IoT 开发人员指南中的 AWS IoT 规则。您可以使用控制台或下列 CLI 命令创建 IoT 规则:
复制代码
aws iot create-topic-rulerule-name <Rule Name> --topic-rule-payload <Rule Value>
  1. 复制代码
    现在,您可以使用 MQTT.fx 客户端发布西雅图店的订单消息。

在零售场景中使用 AWS IoT Device Management 处理订单请求

  1. 复制代码
    IoT 规则将选择此消息中的 OrderNumber 属性并将其重新发布到旧金山工厂设备中。您将从 MQTT.fx 旧金山设备中接收结果。

在零售场景中使用 AWS IoT Device Management 处理订单请求

附录

当您将策略附加到某个组时,该策略将应用至该组中的所有设备。我们建议您使用 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": []
}
}
]
}
  1. 复制代码
    在您开始为同一个组附加新的组策略之前,使用以下命令验证该新策略的结果:
复制代码
#在附加完成新的组策略后使用以下命令验证结果 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 技术博客。

原文链接:
https://amazonaws-china.com/cn/blogs/china/iot-device-management-group-policy/

欲了解 AWS 的更多信息,请访问【AWS 技术专区】

评论

发布