Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.
Arbeiten mit binären Nutzlasten
Um Ihre Nachrichtennutzdaten als rohe Binärdaten (und nicht als JSON Objekt) zu behandeln, können Sie den Operator * verwenden, um in einer SELECT Klausel darauf zu verweisen.
Beispiele für binäre Nutzlasten
Wenn Sie * verwenden, um die Nachrichtennutzlast als unformatierte Binärdaten zu bezeichnen, können Sie der Regel Daten hinzufügen. Wenn Sie eine leere oder eine JSON Payload haben, können der resultierenden Payload mithilfe der Regel Daten hinzugefügt werden. Es folgen Beispiele unterstützter SELECT
-Klauseln.
-
Sie können die folgenden
SELECT
-Klauseln nur mit einem Sternchen (*) für binäre Payloads verwenden.SELECT * FROM 'topic/subtopic'
SELECT * FROM 'topic/subtopic' WHERE timestamp() % 12 = 0
-
Sie können auch Daten hinzufügen und die folgenden
SELECT
-Klauseln verwenden.SELECT *, principal() as principal, timestamp() as time FROM 'topic/subtopic'
SELECT encode(*, 'base64') AS data, timestamp() AS ts FROM 'topic/subtopic'
-
Sie können diese
SELECT
-Klauseln auch mit binären Payloads verwenden.In der Klausel wird
device_type
auf Folgendes WHERE verwiesen.SELECT * FROM 'topic/subtopic' WHERE device_type = 'thermostat'
Folgendes wird ebenfalls unterstützt.
{ "sql": "SELECT * FROM 'topic/subtopic'", "actions": [ { "republish": { "topic": "device/${device_id}" } } ] }
Die folgenden Regelaktionen unterstützen keine binären Payloads, sodass Sie sie dekodieren müssen.
-
Für Regelaktionen, die die Eingabe binärer Nutzlast nicht unterstützen, wie z. B. die -Maßnahme, müssen Sie binäre Nutzlasten dekodieren. Die Lambda-Regelaktion kann Binärdaten empfangen, wenn sie base64-codiert sind und sich in einer Nutzlast befinden. JSON Dazu müssen Sie die Regel folgendermaßen ändern:
SELECT encode(*, 'base64') AS data FROM 'my_topic'
-
Die SQL Anweisung unterstützt keine Zeichenfolge als Eingabe. Um eine Zeichenketteneingabe in zu konvertierenJSON, können Sie den folgenden Befehl ausführen.
SELECT decode(encode(*, 'base64'), 'base64') AS payload FROM 'topic'
Payloads von protobuf-Nachrichten entschlüsseln
Protocol Buffers (protobuf)
In diesem Abschnitt:
Voraussetzungen
-
Ein grundlegendes Verständnis von Protocol Buffers (protobuf
) -
Die
.proto
-Dateien, die Nachrichtentypen und zugehörige Abhängigkeiten definieren -
Installieren Sie den protobuf Compiler (protoc
) auf Ihrem System.
Deskriptordateien erstellen
Wenn Sie bereits über die Deskriptordateien verfügen, können Sie diesen Schritt überspringen. Eine Deskriptordatei (.desc
) ist eine kompilierte Version einer .proto
-Datei, bei der es sich um eine Textdatei handelt, die die Datenstrukturen und Nachrichtentypen definiert, die bei einer protobuf-Serialisierung verwendet werden sollen. Um eine Deskriptordatei zu generieren, müssen Sie eine .proto
-Datei definieren und sie mit dem protoc-Compiler
-
Erstellen Sie
.proto
-Dateien, die die Nachrichtentypen definieren. Ein Beispiel.proto
könnte folgendermaßen aussehen:syntax = "proto3"; message Person { optional string name = 1; optional int32 id = 2; optional string email = 3; }
In dieser
.proto
-Beispieldatei verwenden Sie die Proto3-Syntax und definieren den NachrichtentypPerson
. DiePerson
-Nachrichtendefinition spezifiziert drei Felder (Name, ID und E-Mail). Weitere Informationen zu.proto
-Dateiformaten im Language Guide (proto3). -
Verwenden Sie den Protoc-Compiler
, um die .proto
Dateien zu kompilieren und eine Deskriptordatei zu generieren. Ein Beispielbefehl zum Erstellen einer Deskriptordatei (.desc
) kann der folgende sein:protoc --descriptor_set_out=<FILENAME>.desc \ --proto_path=<PATH_TO_IMPORTS_DIRECTORY> \ --include_imports \ <PROTO_FILENAME>.proto
Dieser Beispielbefehl generiert eine Deskriptordatei
<FILENAME>.desc
, mit der AWS IoT Core Rules Protobuf-Payloads dekodieren kann, die der in definierten Datenstruktur entsprechen.<PROTO_FILENAME>.proto
-
--descriptor_set_out
Gibt den Namen der Deskriptordatei (
<FILENAME>.desc
) an, die generiert werden soll. -
--proto_path
Gibt die Speicherorte aller importierten
.proto
-Dateien an, auf die in der kompilierten Datei verwiesen wird. Sie können das Kennzeichen mehrfach angeben, wenn Sie mehrere importierte.proto
-Dateien mit unterschiedlichen Speicherorten haben. -
--include_imports
Gibt an, dass alle importierten
.proto
-Dateien ebenfalls kompiliert und in die<FILENAME>.desc
-Deskriptordatei aufgenommen werden sollen. -
<PROTO_FILENAME>.proto
Gibt den Namen der
.proto
-Datei an, die Sie kompilieren möchten.
Weitere Informationen zur Protokollreferenz finden Sie unter Referenz. API
-
So laden Sie die Dateien zu einem S3-Bucket hoch
Nachdem Sie Ihre Deskriptordateien erstellt haben<FILENAME>.desc
, laden Sie die Deskriptordateien <FILENAME>.desc
mithilfe von, oder in einen Amazon S3 S3-Bucket hoch. AWS API AWS SDK AWS Management Console
Wichtige Überlegungen
-
Stellen Sie sicher, dass Sie die Deskriptordateien in einen Amazon S3 S3-Bucket AWS-Konto in derselben Umgebung hochladen AWS-Region , in der Sie Ihre Regeln konfigurieren möchten.
Stellen Sie sicher, dass Sie AWS IoT Core Zugriff auf das Lesen
FileDescriptorSet
von S3 gewähren. Wenn in Ihrem S3-Bucket die serverseitige Verschlüsselung (SSE) deaktiviert ist oder wenn Ihr S3-Bucket mit von Amazon S3 verwalteten Schlüsseln (SSE-S3) verschlüsselt ist, sind keine zusätzlichen Richtlinienkonfigurationen erforderlich. Dies kann mit der Beispiel-Bucket-Richtlinie erreicht werden:{ "Version": "2012-10-17", "Statement": [ { "Sid": "Statement1", "Effect": "Allow", "Principal": { "Service": "iot.amazonaws.com" }, "Action": "s3:Get*", "Resource": "arn:aws:s3:::
<BUCKET NAME>
/<FILENAME>.desc
" } ] }-
Wenn Ihr S3-Bucket mit einem AWS Key Management Service Schlüssel (SSE-KMS) verschlüsselt ist, stellen Sie sicher, dass Sie beim Zugriff auf Ihren S3-Bucket die AWS IoT Core Erlaubnis zur Verwendung des Schlüssels erteilen. Dazu müssen Sie diese Erklärung zu Ihrer Schlüsselrichtlinie hinzufügen:
{ "Sid": "Statement1", "Effect": "Allow", "Principal": { "Service": "iot.amazonaws.com" }, "Action": [ "kms:Decrypt", "kms:GenerateDataKey*", "kms:DescribeKey" ], "Resource": "arn:aws:kms:
us-west-2
:111122223333
:key/1234abcd-12ab-34cd-56ef-1234567890ab
" }
Konfigurieren Sie die protobuf-Dekodierung in Regeln.
Nachdem Sie die Deskriptordateien in Ihren Amazon S3 S3-Bucket hochgeladen haben, konfigurieren Sie eine Regel, die Ihr Protobuf-Nachrichtennutzdatenformat mithilfe der Funktion decode (value,) dekodieren kann. decodingScheme SQL Eine ausführliche Funktionssignatur und ein Beispiel finden Sie in der Funktion decode (value,) der Referenz. decodingScheme SQL AWS IoT SQL
Im Folgenden finden Sie einen SQL Beispielausdruck, der die Funktion decode (value,decodingScheme) verwendet:
SELECT VALUE decode(*, 'proto', '<BUCKET NAME>', '<FILENAME>.desc', '<PROTO_FILENAME>', '<PROTO_MESSAGE_TYPE>') FROM '<MY_TOPIC>'
In diesem Beispielausdruck:
-
Sie verwenden die SQL Funktion decode (value,decodingScheme), um die Nutzdaten der binären Nachricht zu dekodieren, auf die von verwiesen wird.
*
Dabei kann es sich um eine binäre Protobuf-kodierte Payload oder um eine Zeichenfolge handeln, die eine JSON Base64-kodierte Protobuf-Nutzlast darstellt. -
Die bereitgestellte Nachrichtennutzlast ist mit dem Nachrichtentyp
Person
definierten inPROTO_FILENAME.proto
kodiert. -
Der benannte Amazon S3 S3-Bucket
BUCKET NAME
enthält dasFILENAME.desc
generierte vonPROTO_FILENAME.proto
.
Nachdem Sie die Konfiguration abgeschlossen haben, veröffentlichen Sie eine Nachricht zu dem Thema, das die Regel abonniert hat. AWS IoT Core
Einschränkungen
AWS IoT Core Regeln unterstützen Protobuf mit den folgenden Einschränkungen:
-
Die Dekodierung von protobuf-Nachrichtennutzlasten innerhalb von Ersatzvorlagen wird nicht unterstützt.
-
Bei der Dekodierung von Payloads von Protobuf-Nachrichten können Sie die SQLDecodierungsfunktion innerhalb eines einzigen Ausdrucks bis zu zweimal verwenden. SQL
-
Die maximale Größe der eingehenden Nutzlast beträgt 128 KiB (1 = 1024 Byte), die maximale Größe der ausgehenden Nutzlast beträgt 128 KiB und die maximale Größe für ein
FileDescriptorSet
-Objekt, das in einem Amazon S3-Bucket gespeichert ist, beträgt 32 KiB. -
Mit SSE -C-Verschlüsselung verschlüsselte Amazon S3 S3-Buckets werden nicht unterstützt.
Bewährte Methoden
Nachfolgend Best Practices und Tipps zur Fehlerbehebung.
-
Laden Sie die proto-Dateien in den Amazon S3 Bucket hoch.
Es empfiehlt sich, die proto-Dateien zu sichern, falls etwas schief geht. Wenn Sie z. B. bei der Ausführung von protoc die proto-Dateien fälschlicherweise ohne Sicherungen ändern, kann dies zu Problemen in Ihrem Produktionsstapel führen. Es gibt mehrere Möglichkeiten, Dateien in einem Amazon S3-Bucket zu sichern. Sie können beispielsweise die Versionierung in S3-Buckets verwenden. Weitere Informationen zum Sichern von Dateien in Amazon S3-Buckets im Amazon S3 Developer Guide.
-
Konfigurieren Sie die AWS IoT Protokollierung, um Protokolleinträge anzuzeigen.
Es empfiehlt sich, die AWS IoT Protokollierung so zu konfigurieren, dass Sie die AWS IoT Protokolle für Ihr Konto überprüfen können CloudWatch. Wenn die SQL Abfrage einer Regel eine externe Funktion aufruft, generiert AWS IoT Core Rules einen Protokolleintrag mit dem Wert
eventType
ofFunctionExecution
, der das Feld „Grund“ enthält, das Ihnen bei der Behebung von Fehlern hilft. Zu den möglichen Fehlern gehören ein Amazon S3 S3-Objekt, das nicht gefunden wurde, oder ein ungültiger protobuf-Dateideskriptor. Weitere Informationen zur Konfiguration der AWS IoT -Protokollierung und zum Anzeigen der Protokolleinträge unter AWS IoT Protokollierung konfigurieren und Protokolleinträge der Rules Engine. -
Aktualisieren Sie
FileDescriptorSet
mit einem neuen Objektschlüssel und aktualisieren Sie den Objektschlüssel in der Regel.Zum Aktualisieren von
FileDescriptorSet
laden Sie eine aktualisierte Deskriptordatei in den Amazon S3 S3-Bucket hoch. Es kann bis zu 15 Minuten dauern, bisFileDescriptorSet
-Aktualisierungen angezeigt werden. Es empfiehlt sich, die aktualisierteFileDescriptorSet
mit einem neuen Objektschlüssel hochzuladen und den Objektschlüssel in der Regel zu aktualisieren.