本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
管理事物索引
AWS_Things
是为您的所有事物创建的索引。您可以从以下数据源控制要索引的内容:AWS IoT
注册表数据,AWS IoT Device Shadow数据,AWS IoT 连接数据以及AWS IoT Device Defender违规数据。
启用事物索引
您可以使用update-indexing-configurationCLI命令或UpdateIndexingConfigurationAPI操作来创建AWS_Things
索引并控制其配置。--thing-indexing-configuration
(thingIndexingConfiguration
) 参数允许您控制建立索引的数据类型(例如,注册表、影子和设备连接数据和Device Defender 违规数据)。
--thing-indexing-configuration
参数采用具有以下结构的字符串:
{ "thingIndexingMode": "OFF"|"REGISTRY"|"REGISTRY_AND_SHADOW", "thingConnectivityIndexingMode": "OFF"|"STATUS", "deviceDefenderIndexingMode": "OFF"|"VIOLATIONS", "namedShadowIndexingMode": "OFF"|"ON", "managedFields": [ { "name": "string", "type": "Number"|"String"|"Boolean" }, ... ], "customFields": [ { "name": "string", "type": "Number"|"String"|"Boolean" }, ... ], "filter": { "namedShadowNames": [ "string" ], "geoLocations": [ { "name": "String", "order": "LonLat|LatLon" } ] } }
事物索引模式
您可以在索引配置中指定不同的事物索引模式,具体取决于要从哪些数据来源编制索引和搜索设备:
-
thingIndexingMode
:控制是否为注册表或影子编制索引。如果thingIndexingMode
设置为OFF
,则禁用事物索引。
-
thingConnectivityIndexingMode
:指定是否为事物连接数据编制索引。
-
deviceDefenderIndexingMode
:指定是否为 Device Defender 违规数据编制索引。 -
namedShadowIndexingMode
:指定是否为命名影子数据编制索引。要选择要添加到实例集索引配置的命名影子,请将namedShadowIndexingMode
设置为ON
并在filter
中指定命名的影子名称。
下表显示了每种索引模式的有效值以及为每个值编入索引的数据来源。
属性 | 有效值 | 注册表 | 影子 | 连接 | DD 违规 | 命名的影子 |
---|---|---|---|---|---|---|
thingIndexingMode |
OFF | |||||
REGISTRY | ✓ | |||||
REGISTRY_AND_SHADOW | ✓ | ✓ | ||||
thingConnectivityIndexingMode |
未指定。 | |||||
OFF | ||||||
STATUS | ✓ | |||||
deviceDefenderIndexingMode |
未指定。 | |||||
OFF | ||||||
VIOLATIONS | ✓ | |||||
namedShadowIndexingMode |
未指定。 | |||||
OFF | ||||||
开 | ✓ |
托管字段和自定义字段
托管字段
托管字段包含与事物、事物组、设备影子、设备连接和 Device Defender 违规相关的数据。 AWS IoT 定义托管字段中的数据类型。您可以在创建 AWS IoT
事物时指定每个托管式字段的值。例如,事物名称、事物组和事物描述都是托管字段。实例集索引根据您指定的索引模式为托管式字段编制索引。托管字段无法更改或显示在 customFields
中。
自定义字段
您可以通过创建自定义字段来对属性、Device Shadow 数据和 Device Defender 违规数据进行汇总来进行索引。customFields
属性是字段名称和数据类型对的列表。您可以根据数据类型执行聚合查询。您选择的索引模式会影响可以在 customFields
中指定的字段。例如,如果您指定 REGISTRY
索引模式,则无法从事物影子中指定字段。您可以使用update-indexing-configurationCLI命令来创建或更新自定义字段(请参阅更新索引配置示例中的示例命令)。有关更多信息,请参阅自定义字段。
索引筛选器
索引筛选器为命名影子和地理位置数据提供了其他选择。
namedShadowNames
要将命名影子添加到实例集索引配置,请将 namedShadowIndexingMode
设置为 ON
,并在 namedShadowNames
中指定命名影子名称。
示例
"filter": { "namedShadowNames": [ "namedShadow1", "namedShadow2" ] }
geoLocations
要将地理位置数据添加到实例集索引配置,请执行以下操作:
-
如果您的地理定位数据存储在经典(未命名)阴影中,请
thingIndexingMode
将其设置为 REGISTRY AND _SHADOW,并在过滤器中指定您的地理位置数据。geoLocations
下面的示例过滤器指定了经典(未命名)阴影中的 geoLocation 对象:
"filter": { "geoLocations": [ { "name": "shadow.reported.location", "order": "LonLat" } ] }
-
如果您的地理位置数据存储在命名影子中,请
namedShadowIndexingMode
设置为“开启”,在namedShadowNames
筛选器中添加影子名称,然后在geoLocations
筛选器中指定您的地理位置数据。下面的示例过滤器在命名的 shadow (
nameShadow1
) 中指定了一个 geoLocation 对象:"filter": { "namedShadowNames": [ "namedShadow1" ], "geoLocations": [ { "name": "shadow.name.namedShadow1.reported.location", "order": "LonLat" } ] }
有关更多信息,请参阅 “ IndexingFilter参AWS IoT API考”。
更新索引配置示例
要更新您的索引配置,请使用 AWS IoT update-indexing-configurationCLI命令。以下示例显示了如何使用 update-indexing-configuration 标签。
简短语法:
aws iot update-indexing-configuration --thing-indexing-configuration \ 'thingIndexingMode=REGISTRY_AND_SHADOW, deviceDefenderIndexingMode=VIOLATIONS, namedShadowIndexingMode=ON,filter={namedShadowNames=[thing1shadow]}, thingConnectivityIndexingMode=STATUS, customFields=[{name=attributes.version,type=Number}, {name=shadow.name.thing1shadow.desired.DefaultDesired, type=String}, {name=shadow.desired.power, type=Boolean}, {name=deviceDefender.securityProfile1.NUMBER_VALUE_BEHAVIOR.lastViolationValue.number, type=Number}]'
JSON语法:
aws iot update-indexing-configuration --cli-input-json \ '{ "thingIndexingConfiguration": { "thingIndexingMode": "REGISTRY_AND_SHADOW", "thingConnectivityIndexingMode": "STATUS", "deviceDefenderIndexingMode": "VIOLATIONS", "namedShadowIndexingMode": "ON", "filter": { "namedShadowNames": ["thing1shadow"]}, "customFields": [ { "name": "shadow.desired.power", "type": "Boolean" }, {"name": "attributes.version", "type": "Number"}, {"name": "shadow.name.thing1shadow.desired.DefaultDesired", "type": "String"}, {"name": "deviceDefender.securityProfile1.NUMBER_VALUE_BEHAVIOR.lastViolationValue.number", "type": Number} ] } }'
此命令不会生成任何输出。
要检查事物索引状态,请运行以下describe-index
CLI命令:
aws iot describe-index --index-name "AWS_Things"
describe-index
命令的输出如下所示:
{ "indexName": "AWS_Things", "indexStatus": "ACTIVE", "schema": "MULTI_INDEXING_MODE" }
注意
机群索引可能需要一点时间才能更新机群指数。我们建议等到indexStatus
演出ACTIVE后再使用。根据配置的数据来源,您可以在模式字段中具有不同的值。有关更多信息,请参阅描述事物索引。
要获取你的东西索引配置的详细信息,请运行以下get-indexing-configuration
CLI命令:
aws iot get-indexing-configuration
get-indexing-configuration
命令的输出如下所示:
{ "thingIndexingConfiguration": { "thingIndexingMode": "REGISTRY_AND_SHADOW", "thingConnectivityIndexingMode": "STATUS", "deviceDefenderIndexingMode": "VIOLATIONS", "namedShadowIndexingMode": "ON", "managedFields": [ { "name": "connectivity.disconnectReason", "type": "String" }, { "name": "registry.version", "type": "Number" }, { "name": "thingName", "type": "String" }, { "name": "deviceDefender.violationCount", "type": "Number" }, { "name": "shadow.hasDelta", "type": "Boolean" }, { "name": "shadow.name.*.version", "type": "Number" }, { "name": "shadow.version", "type": "Number" }, { "name": "connectivity.version", "type": "Number" }, { "name": "connectivity.timestamp", "type": "Number" }, { "name": "shadow.name.*.hasDelta", "type": "Boolean" }, { "name": "registry.thingTypeName", "type": "String" }, { "name": "thingId", "type": "String" }, { "name": "connectivity.connected", "type": "Boolean" }, { "name": "registry.thingGroupNames", "type": "String" } ], "customFields": [ { "name": "shadow.name.thing1shadow.desired.DefaultDesired", "type": "String" }, { "name": "deviceDefender.securityProfile1.NUMBER_VALUE_BEHAVIOR.lastViolationValue.number", "type": "Number" }, { "name": "shadow.desired.power", "type": "Boolean" }, { "name": "attributes.version", "type": "Number" } ], "filter": { "namedShadowNames": [ "thing1shadow" ] } }, "thingGroupIndexingConfiguration": { "thingGroupIndexingMode": "OFF" } }
要更新自定义字段,可以运行 update-indexing-configuration
命令。示例如下:
aws iot update-indexing-configuration --thing-indexing-configuration 'thingIndexingMode=REGISTRY_AND_SHADOW,customFields=[{name=attributes.version,type=Number},{name=attributes.color,type=String},{name=shadow.desired.power,type=Boolean},{name=shadow.desired.intensity,type=Number}]'
此命令已将 shadow.desired.intensity
添加到索引配置中。
注意
更新自定义字段索引配置将覆盖所有现有的自定义字段。请确保在调用 update-indexing-configuration 时指定所有自定义字段。
重建索引后,您可以对新添加的字段、搜索注册表数据、影子数据和事物连接状态数据使用聚合查询。
更改索引模式时,请使用新的索引模式以确保所有自定义字段均有效。例如,如果从 REGISTRY_AND_SHADOW
模式开始使用名为 shadow.desired.temperature
的自定义字段,则必须先删除 shadow.desired.temperature
自定义字段,然后再将索引模式更改为 REGISTRY
。如果您的索引配置包含未通过索引模式建立索引的自定义字段,则更新失败。
描述事物索引
以下命令向您展示如何使用该describe-indexCLI命令检索事物索引的当前状态。
aws iot describe-index --index-name "AWS_Things"
命令的响应如下所示:
{ "indexName": "AWS_Things", "indexStatus": "BUILDING", "schema": "REGISTRY_AND_SHADOW_AND_CONNECTIVITY_STATUS" }
首次为舰队编制索引时, AWS IoT 会生成索引。如果 indexStatus
处于 BUILDING
状态,您无法查询索引。事物索引的 schema
指示将对什么类型的数据 (REGISTRY_AND_SHADOW_AND_CONNECTIVITY_STATUS
) 建立索引。
更改索引的配置会导致重新生成索引。此过程中的 indexStatus
为 REBUILDING
。在重建期间,您可以对事物索引中的数据运行查询。例如,如果您将索引配置从 REGISTRY
更改为 REGISTRY_AND_SHADOW
,同时正在重新生成索引,则您可以查询注册表数据,包括最新的更新。但是,在重新生成操作完成之前,无法查询影子数据。生成或重新生成索引所需的时间量取决于数据量。
根据配置的数据来源,您可能在模式字段中看到不同的值。下表显示了不同的模式值和相应的说明:
架构 | 描述 |
---|---|
OFF | 没有配置或索引数据源。 |
REGISTRY | 对注册表数据建立索引。 |
REGISTRY_AND_SHADOW | 对注册表数据和未命名(经典)影子数据建立索引。 |
REGISTRY_AND_CONNECTIVITY | 为注册数据和连接数据建立索引。 |
REGISTRY_AND_SHADOW_AND_CONNECTIVITY_STATUS | 对注册表数据、未命名(典型)影子数据和连接数据都建立了索引。 |
MULTI_INDEXING_MODE | 除了注册表、未命名(经典)影子或连接数据之外,也对命名影子或 Device Defender 违规数据建立了索引。 |
查询事物索引
使用search-indexCLI命令查询索引中的数据。
aws iot search-index --index-name "AWS_Things" --query-string "thingName:mything*"
{ "things":[{ "thingName":"mything1", "thingGroupNames":[ "mygroup1" ], "thingId":"a4b9f759-b0f2-4857-8a4b-967745ed9f4e", "attributes":{ "attribute1":"abc" }, "connectivity": { "connected":false, "timestamp":1556649874716, "disconnectReason": "CONNECTION_LOST" } }, { "thingName":"mything2", "thingTypeName":"MyThingType", "thingGroupNames":[ "mygroup1", "mygroup2" ], "thingId":"01014ef9-e97e-44c6-985a-d0b06924f2af", "attributes":{ "model":"1.2", "country":"usa" }, "shadow":{ "desired":{ "location":"new york", "myvalues":[3, 4, 5] }, "reported":{ "location":"new york", "myvalues":[1, 2, 3], "stats":{ "battery":78 } }, "metadata":{ "desired":{ "location":{ "timestamp":123456789 }, "myvalues":{ "timestamp":123456789 } }, "reported":{ "location":{ "timestamp":34535454 }, "myvalues":{ "timestamp":34535454 }, "stats":{ "battery":{ "timestamp":34535454 } } } }, "version":10, "timestamp":34535454 }, "connectivity": { "connected":true, "timestamp":1556649855046 } }], "nextToken":"AQFCuvk7zZ3D9pOYMbFCeHbdZ+h=G" }
在JSON响应中,"connectivity"
(由thingConnectivityIndexingMode=STATUS
设置启用)提供了一个布尔值、一个时间戳和一个 disconnectReason 表示设备是否已连接的 AWS IoT Core值。设备POSIX当时"mything1"
断开连接 (false
) 1556649874716
的原因是CONNECTION_LOST
。有关断开原因的更多信息,请参阅生命周期事件。
"connectivity": { "connected":false, "timestamp":1556649874716, "disconnectReason": "CONNECTION_LOST" }
POSIX当时"mything2"
连接的设备 (true
)1556649855046
:
"connectivity": { "connected":true, "timestamp":1556649855046 }
时间戳以自纪元以来的毫秒为单位,因此1556649855046
表示 2019 年 4 月 30 日星期二下午 6:44:15 .046()。UTC
重要
如果设备已断开连接大约一小时,则连接状态的 "timestamp"
值和 "disconnectReason"
值可能会缺失。
限制和局限性
AWS_Things
具有这些限制。
- 具有复杂类型的影子字段
-
仅当阴影字段的值为简单类型(例如不包含数组的JSON对象或完全由简单类型组成的数组)时,才会对该字段进行索引。“简单类型”是指字符串、数字或文本
true
或false
之一。例如,如果是以下影子状态,则系统将不会编制索引字段"palette"
的值,因为它是一个包含复杂类型项目的数组。字段"colors"
的值将会编制索引,因为该数组中的每个值都是一个字符串。{ "state": { "reported": { "switched": "ON", "colors": [ "RED", "GREEN", "BLUE" ], "palette": [ { "name": "RED", "intensity": 124 }, { "name": "GREEN", "intensity": 68 }, { "name": "BLUE", "intensity": 201 } ] } } }
- 嵌套影子字段名称
-
嵌套影子字段的名称存储为以句点 (.) 分隔的字符串。例如,假设存在以下影子文档:
{ "state": { "desired": { "one": { "two": { "three": "v2" } } } } }
字段
three
的名称存储为desired.one.two.three
。如果您还有影子文档,存储方式如下:{ "state": { "desired": { "one.two.three": "v2" } } }
都匹配
shadow.desired.one.two.three:v2
的查询。最佳实践是不要在影子字段名称中使用句点。 - 影子元数据
-
影子的元数据部分中的字段编制了索引,但仅当影子的
"state"
部分中的相应字段编制了索引时才会出现这种情况。(在之前的示例中,影子的元数据部分中的"palette"
字段也不会编制索引。) - 未注册的设备
-
实例集索引对设备的连接状态编制索引,该设备的连接
clientId
与注册表中已注册事物的thingName
相同。 - 未注册的影子
-
如果您使用UpdateThingShadow尚未在 AWS IoT 账户中注册的事物名称创建影子,则不会为该影子中的字段编制索引。这适用于经典的未命名影子和命名影子。
- 数字值
-
如果任何注册表或影子数据被服务识别为数值,则会对其照此编制索引。您可以针对数字值创建涉及范围和比较运算符的查询(例如
"attribute.foo<5"
或"shadow.reported.foo:[75 TO 80]"
)。要识别为数字,数据的值必须是有效的文字类型JSON数字。该值可以是2^53...2^53-1范围内的整数,具有可选指数表示法的双精度浮点,或仅包含这些值的数组的一部分。 - Null 值
-
未对 Null 值建立索引。
- 最大值
-
聚合查询的最大自定义字段数是 5。
聚合查询请求的最大百分位数是 100。
授权
您可以在 AWS IoT 策略操作中将事物索引指定为 Amazon 资源名称 (ARN),如下所示。
操作 | 资源 |
---|---|
|
索引ARN(例如, |
|
索引ARN(例如, |
注意
如果您有权查询实例集索引,可以访问整个实例集的事物数据。