View a markdown version of this page

Gerenciar a indexação de coisas - AWS IoT Core

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Gerenciar a indexação de coisas

O índice criado para todas as suas objetos é AWS_Things. É possível controlar o que indexar a partir das seguintes fontes de dados: dados de registro da AWS IoT, dados da sombra do dispositivo da AWS IoT, dados de conectividade da AWS IoT e dados de violações do AWS IoT Device Defender.

Habilitar a indexação de objetos

Você usa o comando da CLI update-indexing-configuration ou a operação UpdateIndexingConfigurationda API para criar AWS_Things o índice e controlar sua configuração. Ao usar o parâmetro --thing-indexing-configuration (thingIndexingConfiguration), você controla o tipo de dados (por exemplo, dados de registro, sombra, conectividade do dispositivo e violações do Device Defender) que é indexado.

O parâmetro --thing-indexing-configuration leva uma string com a seguinte estrutura:

{ "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" } ], "connectivity": { "includeSocketInformation": [ "GET_THING_CONNECTIVITY_DATA" ] } } }

Modos de indexação de objetos

Você pode especificar diferentes modos de indexação em sua configuração de indexação, dependendo de quais fontes de dados você quer indexar e nas quais deseja pesquisar dispositivos:

  • thingIndexingMode: controla se o registro ou a sombra estão indexados. Quando thingIndexingMode é definido como OFF, a indexação de itens é desativada.

  • thingConnectivityIndexingMode: especifica se dados de conectividade são indexados. Isso precisa ser ativado para obter informações de status de conectividade em SearchIndex consultas ou para usar a GetThingConnectivityData API. A resposta da GetThingConnectivityDataAPI também incluirá informações do soquete se isso estiver ativado no filtro e o includeSocketInformation sinalizador estiver true na solicitação da GetThingConnectivityData API.

  • deviceDefenderIndexingMode: especifica se os dados de violações do Device Defender são indexados.

  • namedShadowIndexingMode: especifica se os dados de sombra nomeada são indexados. Para selecionar sombras nomeadas para adicionar à sua configuração de indexação de frotas, defina namedShadowIndexingMode como ON e especifique os nomes de sombras nomeadas em filter.

A tabela abaixo mostra os valores válidos para cada modo de indexação e a fonte de dados indexada para cada valor.

Atributo Valores válidos Registro Shadow Conectividade Violações de DD Sombra nomeada
thingIndexingMode DESL.
REGISTRY
REGISTRY_AND_SHADOW
thingConnectivityIndexingMode Não especificado.
DESL.
STATUS
deviceDefenderIndexingMode Não especificado.
DESL.
VIOLAÇÕES
namedShadowIndexingMode Não especificado.
DESL.
ON

Campos gerenciados e campos personalizados

Campos gerenciados

Os campos gerenciados contêm dados associados a coisas, grupos de coisas, sombras de dispositivos, conectividade de dispositivos e violações do Device Defender. AWS IoT define o tipo de dados nos campos gerenciados. Você especifica os valores de cada campo gerenciado ao criar um objeto do AWS IoT . Por exemplo, nomes de objetos, grupos de objetos e descrições de objetos são todos os campos gerenciados. A indexação de frotas indexa campos gerenciados com base no modo de indexação especificado por você. Os campos gerenciados não podem ser alterados e não aparecem em customFields.

Campos personalizados

Você pode agregar atributos, dados de sombra do dispositivo e dados de violações do Device Defender criando campos personalizados para indexá-los. O atributo customFields é uma lista de pares de nomes de campos e tipos de dados. É possível realizar consultas de agregação com base no tipo de dados. O modo de indexação selecionado afeta os campos que podem ser especificados em customFields. Por exemplo, ao especificar o modo de indexação REGISTRY, não será possível especificar um campo personalizado de uma sombra de um objeto. Você pode usar o comando update-indexing-configuration da CLI para criar ou atualizar os campos personalizados (consulte um exemplo de comando em Atualização de exemplos de configuração de indexação). Para acessar mais informações, consulte Campos personalizados.

Filtro de indexação

O filtro de indexação fornece seleções adicionais para sombras nomeadas, geolocalização e dados de conectividade.

namedShadowNames

Para adicionar sombras nomeadas à sua configuração de indexação de frotas, defina namedShadowIndexingMode como ON e especifique os nomes de sombras nomeadas no filtro namedShadowNames.

Exemplo

"filter": { "namedShadowNames": [ "namedShadow1", "namedShadow2" ] }

geoLocations

Para adicionar dados de localização geográfica à sua configuração de indexação de frota:

  • Se seus dados de localização geográfica estiverem armazenados em uma sombra clássica (sem nome), defina thingIndexingMode como REGISTRY_AND_SHADOW e especifique seus dados de localização geográfica no filtro geoLocations.

    O exemplo de filtro abaixo especifica um objeto geoLocation em uma sombra clássica (sem nome):

    "filter": { "geoLocations": [ { "name": "shadow.reported.location", "order": "LonLat" } ] }
  • Se seus dados de localização geográfica estiverem armazenados em uma sombra nomeada, defina namedShadowIndexingMode como ON, adicione o nome da sombra no filtro namedShadowNames e especifique seus dados de localização geográfica no filtro geoLocations.

    O exemplo de filtro abaixo especifica um objeto geoLocation em uma sombra nomeada (nameShadow1):

    "filter": { "namedShadowNames": [ "namedShadow1" ], "geoLocations": [ { "name": "shadow.name.namedShadow1.reported.location", "order": "LonLat" } ] }

connectivity

  • Para incluir informações de soquete (endereço IP de origem, endereço IP de destino, porta de origem, porta de destino e ID do VPC endpoint) na resposta, use GetThingConnectivityData includeSocketInformation a opção no filtro de conectividade, conforme mostrado no exemplo a seguir. Você também deve definir o includeSocketInformation parâmetro como true ao invocar a GetThingConnectivityData API. Para impedir que chamadores específicos acessem as informações do soquete, você deve especificar isso explicitamente na política do IAM deles definindo a chave de contexto da iot:IncludeSocketInformation condição como. false

    nota

    A opção de incluir informações de soquete só é suportada para a GetThingConnectivityData resposta e não para outras APIs SearchIndex de indexação de frota.

    "filter": { "connectivity": { "includeSocketInformation": [ "GET_THING_CONNECTIVITY_DATA" ] } }

    Para desativar a indexação de informações do soquete, você deve definir includeSocketInformation no filtro de conectividade uma matriz vazia, conforme mostrado no exemplo abaixo.

    nota

    Em uma UpdateIndexingConfiguration solicitação, se a indexação de conectividade estiver ativada e um filtro de conectividade não estiver configurado ou não includeSocketInformation for especificado ou for nulo, o valor anterior do filtro de conectividade será preservado durante a atualização da configuração de indexação.

    Exemplo para desativar a indexação de informações do soquete

    "filter": { "connectivity": { "includeSocketInformation": [ ] } }

Para obter mais informações, consulte IndexingFiltera Referência da AWS IoTAPI.

Atualizar exemplos de configuração de indexação

Para atualizar sua configuração de indexação, use o comando AWS IoT update-indexing-configuration CLI. O exemplo a seguir mostra como usar update-indexing-configuration.

Sintaxe curta:

aws iot update-indexing-configuration --thing-indexing-configuration \ 'thingIndexingMode=REGISTRY_AND_SHADOW, deviceDefenderIndexingMode=VIOLATIONS, namedShadowIndexingMode=ON,thingConnectivityIndexingMode=STATUS, filter={namedShadowNames=[namedShadow1],geoLocations=[{name=shadow.name.namedShadow1.reported.location,order=LonLat}],connectivity={includeSocketInformation=[GET_THING_CONNECTIVITY_DATA]}}, customFields=[{name=attributes.version,type=Number}, {name=shadow.name.namedShadow1.desired.DefaultDesired, type=String}, {name=shadow.desired.power, type=Boolean}, {name=deviceDefender.securityProfile1.NUMBER_VALUE_BEHAVIOR.lastViolationValue.number, type=Number}]'

Sintaxe do JSON:

aws iot update-indexing-configuration --cli-input-json \ '{ "thingIndexingConfiguration": { "thingIndexingMode": "REGISTRY_AND_SHADOW", "thingConnectivityIndexingMode": "STATUS", "deviceDefenderIndexingMode": "VIOLATIONS", "namedShadowIndexingMode": "ON", "filter": { "namedShadowNames": ["namedShadow1"], "geoLocations": [{"name": "shadow.name.namedShadow1.reported.location", "order": "LonLat"}], "connectivity": {"includeSocketInformation": ["GET_THING_CONNECTIVITY_DATA"]}}, "customFields": [ { "name": "shadow.desired.power", "type": "Boolean" }, {"name": "attributes.version", "type": "Number"}, {"name": "shadow.name.namedShadow1.desired.DefaultDesired", "type": "String"}, {"name": "deviceDefender.securityProfile1.NUMBER_VALUE_BEHAVIOR.lastViolationValue.number", "type": "Number"} ] } }'

Esse comando não retorna nenhuma saída.

Para verificar o status do índice do objeto, execute o comando describe-index da CLI:

aws iot describe-index --index-name "AWS_Things"

A saída do comando describe-index é semelhante a:

{ "indexName": "AWS_Things", "indexStatus": "ACTIVE", "schema": "MULTI_INDEXING_MODE" }
nota

A indexação da frota pode levar alguns minutos para atualizar o índice da frota. Recomendamos aguardar até que indexStatus exiba ATIVO antes de usá-lo. Os seus valores no campo do esquema podem ser diferentes, dependendo das fontes de dados que configurou. Para acessar mais informações, consulte Descrever um índice de objetos.

Para obter seus detalhes de configuração de indexação de objetos, execute o comando get-indexing-configuration da CLI:

aws iot get-indexing-configuration

A saída do comando get-indexing-configuration é semelhante a:

{ "thingIndexingConfiguration": { "thingIndexingMode": "REGISTRY_AND_SHADOW", "thingConnectivityIndexingMode": "STATUS", "deviceDefenderIndexingMode": "VIOLATIONS", "namedShadowIndexingMode": "ON", "managedFields": [ { "name": "connectivity.keepAliveDuration", "type": "Number" }, { "name": "connectivity.version", "type": "Number" }, { "name": "deviceDefender.*.*.metricName", "type": "String" }, { "name": "connectivity.connected", "type": "Boolean" }, { "name": "shadow.version", "type": "Number" }, { "name": "deviceDefender.*.*.lastViolationTime", "type": "Number" }, { "name": "deviceDefender.*.*.inViolation", "type": "Boolean" }, { "name": "thingName", "type": "String" }, { "name": "deviceDefender.version", "type": "Number" }, { "name": "shadow.name.*.version", "type": "Number" }, { "name": "registry.version", "type": "Number" }, { "name": "connectivity.sessionExpiry", "type": "Number" }, { "name": "registry.thingTypeName", "type": "String" }, { "name": "deviceDefender.violationCount", "type": "Number" }, { "name": "connectivity.timestamp", "type": "Number" }, { "name": "connectivity.clientId", "type": "String" }, { "name": "thingId", "type": "String" }, { "name": "shadow.name.*.hasDelta", "type": "Boolean" }, { "name": "registry.thingGroupNames", "type": "String" }, { "name": "shadow.hasDelta", "type": "Boolean" }, { "name": "connectivity.cleanSession", "type": "Boolean" }, { "name": "connectivity.disconnectReason", "type": "String" } ], "customFields": [ { "name": "attributes.version", "type": "Number" }, { "name": "shadow.desired.power", "type": "Boolean" }, { "name": "shadow.name.namedShadow1.desired.DefaultDesired", "type": "String" }, { "name": "deviceDefender.securityProfile1.NUMBER_VALUE_BEHAVIOR.lastViolationValue.number", "type": "Number" } ], "filter": { "namedShadowNames": [ "namedShadow1" ], "geoLocations": [ { "name": "shadow.name.namedShadow1.reported.location", "order": "LonLat" } ], "connectivity": { "includeSocketInformation": [ "GET_THING_CONNECTIVITY_DATA" ] } } }, "thingGroupIndexingConfiguration": { "thingGroupIndexingMode": "OFF" } }

Para atualizar os campos personalizados, execute o comando update-indexing-configuration. Um exemplo é este:

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}]'

Esse comando adicionou shadow.desired.intensity à configuração de indexação.

nota

Atualizar a configuração de indexação de campos personalizados substitui todos os campos personalizados existentes. Especifique todos os campos personalizados ao chamar update-indexing-configuration.

Depois que o índice é reconstruído, você pode usar a consulta de agregação nos campos recém-adicionados, dados de registro de pesquisa, dados de sombra e dados de status de conectividade de objeto.

Ao alterar o modo de indexação, verifique se todos os campos personalizados são válidos utilizando o novo modo de indexação. Por exemplo, se você começar usando o modo REGISTRY_AND_SHADOW com um campo personalizado chamado shadow.desired.temperature, deverá excluir o campo personalizado shadow.desired.temperature antes de alterar o modo de indexação para REGISTRY. Se a configuração de indexação contiver campos personalizados que não são indexados pelo modo de indexação, a atualização falhará.

Descrever um índice de objetos

O comando a seguir mostra como usar o comando describe-index da CLI para recuperar o status atual do índice de objetos.

aws iot describe-index --index-name "AWS_Things"

A resposta do comando pode ser semelhante a:

{ "indexName": "AWS_Things", "indexStatus": "BUILDING", "schema": "REGISTRY_AND_SHADOW_AND_CONNECTIVITY_STATUS" }

A primeira vez que você faz a indexação de frotas, AWS IoT cria seu índice. Não é possível consultar o índice se indexStatus estiver no estado BUILDING. O schema do índice de objetos indica qual tipo de dados (REGISTRY_AND_SHADOW_AND_CONNECTIVITY_STATUS) é indexado.

A alteração da configuração do índice faz com que o índice seja recompilado. Durante esse processo, o indexStatus é REBUILDING. É possível executar consultas em dados no índice de objetos enquanto ele está sendo reconstruído. Por exemplo, se você alterar a configuração do índice de REGISTRY para REGISTRY_AND_SHADOW enquanto o índice estiver sendo recompilado, poderá consultar dados do registro, incluindo as últimas atualizações. No entanto, você não pode consultar os dados de sombra até que a reconstrução seja concluída. O tempo necessário para compilar ou recompilar o índice depende da quantidade de dados.

Você pode observar valores diferentes no campo do esquema conforme as fontes de dados configuradas. A tabela a seguir exibe os diferentes valores de esquema e as descrições correspondentes:

Schema Description
DESL. Nenhuma fonte de dados está configurada ou indexada.
REGISTRY Os dados de registro são indexados.
REGISTRY_AND_SHADOW Os dados de registro e dados de sombra (clássica) sem nome são indexados.
REGISTRY_AND_CONNECTIVITY Os dados do registro e os dados de conectividade são indexados.
REGISTRY_AND_SHADOW_AND_CONNECTIVITY_STATUS Os dados de registro, dados de sombra (clássica) sem nome e dados de conectividade são indexados.
MULTI_INDEXING_MODE

Os dados de sombra nomeada ou de violações do Device Defender são indexados, além dos dados de registro, sombra (clássica) sem nome ou conectividade.

Consultar um índice de objetos

Use o comando search-index da CLI para consultar dados no índice.

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", "clientId": "mything1", "keepAliveDuration": 60, "cleanSession": false, "sessionExpiry": 3600 } }, { "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, "clientId": "mything2", "keepAliveDuration": 60, "cleanSession": true } } ], "nextToken": "AQFCuvk7zZ3D9pOYMbFCeHbdZ+h=G" }

Na resposta JSON, "connectivity" (conforme habilitado pela thingConnectivityIndexingMode=STATUS configuração) fornece o status da conexão, o timestamp, o motivo da desconexão, o ID do cliente, a duração do keep-alive, o sinalizador de sessão limpa e a expiração da sessão do dispositivo. O dispositivo "mything1" desconectado (false) no horário POSIX 1556649874716 devido a CONNECTION_LOST. Para acessar mais informações sobre motivos de desconexão, consulte Eventos de ciclo de vida.

"connectivity": { "connected": false, "timestamp": 1556649874716, "disconnectReason": "CONNECTION_LOST", "clientId": "mything1", "keepAliveDuration": 60, "cleanSession": false, "sessionExpiry": 3600 }

O dispositivo "mything2" conectado (true) no horário POSIX 1556649855046:

"connectivity": { "connected": true, "timestamp": 1556649855046, "clientId": "mything2", "keepAliveDuration": 60, "cleanSession": true }

Os registros de data/hora são expressos em milissegundos desde o epoch, portanto, 1556649855046 representa 18:44:15.046 na terça-feira, 30 de abril de 2019 (UTC).

Importante

Se um dispositivo nunca se conectou ao IoT Core ou foi desconectado por mais de 1 hora antes da ativação da indexação da thingConnectivityIndexingMode frota, a resposta terá o connected campo definido como false sem detalhes adicionais da sessão.

Restrições e limitações

Estas são as restrições e limitações para AWS_Things.

Campos de sombra com tipos complexos

Um campo de sombra será indexado somente se o valor do campo for um tipo simples, como um objeto JSON que não contém uma matriz ou uma matriz que consiste inteiramente em tipos simples. Tipo simples é uma string, um número ou um dos literais true ou false. Por exemplo, dado estado de sombra a seguir, o valor do campo "palette" não é indexado porque é uma matriz que contém itens de tipos complexos. O valor de campo "colors" é indexado, pois cada valor na matriz é uma string.

{ "state": { "reported": { "switched": "ON", "colors": [ "RED", "GREEN", "BLUE" ], "palette": [ { "name": "RED", "intensity": 124 }, { "name": "GREEN", "intensity": 68 }, { "name": "BLUE", "intensity": 201 } ] } } }
Nomes de campo de sombra aninhados

Os nomes de campos de sombra aninhados são armazenados como uma string delimitada por ponto (.). Por exemplo, considerando um documento de sombra:

{ "state": { "desired": { "one": { "two": { "three": "v2" } } } } }

O nome do campo three é armazenado como desired.one.two.three. Se você também tiver um documento de sombra, ele é armazenado da seguinte maneira:

{ "state": { "desired": { "one.two.three": "v2" } } }

Ambos correspondem a uma consulta para shadow.desired.one.two.three:v2. Como prática recomendada, não use pontos em nomes de campos de sombra.

Metadados de sombra

Um campo de uma seção de metadados de sombra é indexado, mas somente se o campo correspondente na seção "state" da sombra for indexado. (No exemplo anterior, o campo "palette" na seção de metadados da sombra também não é indexado.)

Dispositivos não registrados

A indexação de frotas não indexa dados de dispositivos não registrados. As coisas devem ser registradas no AWS IoT Registro e devem usar o nome da coisa clientId ao se conectar AWS IoT Core a.

Sombras não registradas

Se você costuma UpdateThingShadowcriar uma sombra usando um nome de coisa que não foi registrado em sua AWS IoT conta, os campos nessa sombra não são indexados. Isso se aplica tanto à sombra clássica sem nome quanto à sombra nomeada.

Valores numéricos

Se qualquer registro ou dado de sombra for reconhecido pelo serviço como um valor numérico, ele será indexado dessa maneira. Você pode realizar consultas envolvendo intervalos e operadores de comparação de valores numéricos, (por exemplo "attribute.foo<5" ou "shadow.reported.foo:[75 TO 80]"). Para ser reconhecido como numérico, o valor dos dados deve ser um número JSON do tipo literal e válido. O valor pode ser um número inteiro no intervalo -2^53...2^53-1, um ponto flutuante de precisão dupla com notação exponencial opcional ou parte de uma matriz que contém apenas esses valores.

Valores nulos

Valores nulos não são indexados.

Valores máximos

O número máximo de campos personalizados para consultas de agregação é cinco.

O número máximo de percentis solicitados para consultas de agregação é 100.

Autorização

Você pode especificar o índice ou a coisa (para GetThingConnectivityData ação) como um nome de recurso da Amazon (ARN) em uma ação AWS IoT política, da seguinte maneira.

Ação Recurso

iot:SearchIndex

O ARN de um índice (por exemplo, arn:aws:iot:your-aws-region:your-aws-account:index/AWS_Things).

iot:DescribeIndex

O ARN de um índice (por exemplo, arn:aws:iot:your-aws-region:your-aws-account:index/AWS_Things).

iot:GetThingConnectivityData

Você pode aplicar essa permissão a coisas específicas. Use a chave de iot:IncludeSocketInformation condição para controlar o acesso às informações do soquete.

nota

Se você tiver permissões para consultar o índice de frota, você poderá acessar os dados das objetos em toda a frota.