Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Bekerja dengan muatan biner
Untuk menangani payload pesan Anda sebagai data biner mentah (bukan objek JSON), Anda dapat menggunakan operator * untuk merujuknya dalam klausa SELECT.
Dalam topik ini:
Contoh muatan biner
Bila Anda menggunakan* untuk merujuk ke payload pesan sebagai data biner mentah, Anda dapat menambahkan data ke aturan. Jika Anda memiliki muatan kosong atau JSON, payload yang dihasilkan dapat memiliki data yang ditambahkan menggunakan aturan. Berikut ini menunjukkan contoh SELECT klausa yang didukung.
-
Anda dapat menggunakan
SELECTklausa berikut hanya dengan* untuk muatan biner.SELECT * FROM 'topic/subtopic'SELECT * FROM 'topic/subtopic' WHERE timestamp() % 12 = 0
-
Anda juga dapat menambahkan data dan menggunakan
SELECTklausa berikut.SELECT *, principal() as principal, timestamp() as time FROM 'topic/subtopic'SELECT encode(*, 'base64') AS data, timestamp() AS ts FROM 'topic/subtopic'
-
Anda juga dapat menggunakan
SELECTklausa ini dengan muatan biner.Berikut ini mengacu
device_typepada klausa WHERE.SELECT * FROM 'topic/subtopic' WHERE device_type = 'thermostat'Berikut ini juga didukung.
{ "sql": "SELECT * FROM 'topic/subtopic'", "actions": [ { "republish": { "topic": "device/${device_id}" } } ] }
Tindakan aturan berikut tidak mendukung muatan biner sehingga Anda harus mendekodekannya.
-
Beberapa tindakan aturan tidak mendukung input payload biner, seperti tindakan Lambda, jadi Anda harus memecahkan kode muatan biner. Tindakan aturan Lambda dapat menerima data biner, jika base64 dikodekan dan dalam muatan JSON. Anda dapat melakukan ini dengan mengubah aturan menjadi berikut.
SELECT encode(*, 'base64') AS data FROM 'my_topic' -
Pernyataan SQL tidak mendukung string sebagai input. Untuk mengonversi input string ke JSON, Anda dapat menjalankan perintah berikut.
SELECT decode(encode(*, 'base64'), 'base64') AS payload FROM 'topic'
Decoding muatan pesan protobuf
Protocol Buffers (protobuf)
Di bagian ini:
Prasyarat
-
Pemahaman dasar tentang Protocol Buffer (protobuf
) -
.protoFileyang menentukan jenis pesan dan dependensi terkait -
Menginstal Protobuf Compiler (protoc
) pada sistem Anda
Buat file deskriptor
Jika Anda sudah memiliki file deskriptor, Anda dapat melewati langkah ini. File deskriptor (.desc) adalah versi .proto file yang dikompilasi, yang merupakan file teks yang mendefinisikan struktur data dan jenis pesan yang akan digunakan dalam serialisasi protobuf. Untuk menghasilkan file deskriptor, Anda harus menentukan .proto file dan menggunakan kompiler protoc
-
Buat
.protofile yang menentukan jenis pesan..protoFile contoh dapat terlihat seperti berikut:syntax = "proto3"; message Person { optional string name = 1; optional int32 id = 2; optional string email = 3; }Dalam
.protofile contoh ini, Anda menggunakan sintaks proto3 dan menentukan jenis pesan.PersonDefinisiPersonpesan menentukan tiga bidang (nama, id, dan email). Untuk informasi selengkapnya tentang format pesan.protofile, lihat Panduan Bahasa (proto3). -
Gunakan kompiler protoc
untuk mengkompilasi .protofile dan menghasilkan file deskriptor. Contoh perintah untuk membuat file descriptor (.desc) dapat menjadi sebagai berikut:protoc --descriptor_set_out=<FILENAME>.desc \ --proto_path=<PATH_TO_IMPORTS_DIRECTORY> \ --include_imports \ <PROTO_FILENAME>.protoPerintah contoh ini menghasilkan file deskriptor
<FILENAME>.desc, yang dapat digunakan AWS IoT Core Aturan untuk memecahkan kode muatan protobuf yang sesuai dengan struktur data yang ditentukan.<PROTO_FILENAME>.proto-
--descriptor_set_outMenentukan nama file deskriptor (
<FILENAME>.desc) yang harus dihasilkan. -
--proto_pathMenentukan lokasi dari setiap
.protofile impor yang direferensikan oleh file yang sedang dikompilasi. Anda dapat menentukan bendera beberapa kali jika Anda memiliki beberapa.protofile yang diimpor dengan lokasi yang berbeda. -
--include_importsMenentukan bahwa setiap
.protofile yang diimpor juga harus dikompilasi dan disertakan dalam file<FILENAME>.descdeskriptor. -
<PROTO_FILENAME>.protoMenentukan nama
.protofile yang ingin Anda kompilasi.
Untuk informasi selengkapnya tentang referensi protokol, lihat Referensi API
. -
Unggah file deskriptor ke bucket S3
Setelah membuat file deskriptor<FILENAME>.desc, unggah file deskriptor <FILENAME>.desc ke bucket Amazon S3, menggunakan AWS API, SDK AWS , atau file. AWS Management Console
Pertimbangan penting
-
Pastikan Anda mengunggah file deskriptor ke bucket Amazon S3 di Akun AWS tempat yang Wilayah AWS sama dengan tempat Anda ingin mengonfigurasi Aturan.
Pastikan Anda memberikan AWS IoT Core akses untuk membaca
FileDescriptorSetdari S3. Jika bucket S3 Anda menonaktifkan enkripsi sisi server (SSE) atau bucket S3 Anda dienkripsi menggunakan kunci yang dikelola Amazon S3 (SSE-S3), konfigurasi kebijakan tambahan tidak diperlukan. Ini dapat dicapai dengan contoh kebijakan bucket:-
Jika bucket S3 Anda dienkripsi menggunakan AWS Key Management Service kunci (SSE-KMS), pastikan Anda memberikan AWS IoT Core izin untuk menggunakan kunci saat mengakses bucket S3 Anda. Anda dapat melakukannya dengan menambahkan pernyataan ini ke kebijakan utama Anda:
{ "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" }
Konfigurasikan decoding protobuf dalam Aturan
Setelah mengunggah file deskriptor ke bucket Amazon S3, konfigurasikan Aturan yang dapat memecahkan kode format payload pesan protobuf menggunakan fungsi SQL decode (value, decodingScheme). Tanda tangan dan contoh fungsi terperinci dapat ditemukan di fungsi SQL decode (value, decodingScheme) dari referensi SQL.AWS IoT
Berikut ini adalah contoh ekspresi SQL menggunakan fungsi decode (value, decodingScheme):
SELECT VALUE decode(*, 'proto', '<BUCKET NAME>', '<FILENAME>.desc', '<PROTO_FILENAME>', '<PROTO_MESSAGE_TYPE>') FROM '<MY_TOPIC>'
Dalam contoh ekspresi ini:
-
Anda menggunakan fungsi SQL decode (value, decodingScheme) untuk memecahkan kode payload pesan biner yang direferensikan oleh.
*Ini bisa berupa payload berkode protobuf biner atau string JSON yang mewakili payload protobuf yang dikodekan base64. -
Payload pesan yang disediakan dikodekan menggunakan jenis
Personpesan yang ditentukan.PROTO_FILENAME.proto -
Bucket Amazon S3 bernama
BUCKET NAMEberisi yangFILENAME.descdihasilkan dari.PROTO_FILENAME.proto
Setelah Anda menyelesaikan konfigurasi, publikasikan pesan ke AWS IoT Core topik yang menjadi langganan Aturan.
Batasan
AWS IoT Core Aturan mendukung protobuf dengan batasan berikut:
-
Decoding payload pesan protobuf dalam template substitusi tidak didukung.
-
Saat mendekode muatan pesan protobuf, Anda dapat menggunakan fungsi SQL decode dalam satu ekspresi SQL hingga dua kali.
-
Ukuran muatan masuk maksimum adalah 128 KiB (1KiB = 1024 byte), ukuran muatan keluar maksimum adalah 128 KiB, dan ukuran maksimum untuk objek yang
FileDescriptorSetdisimpan dalam ember Amazon S3 adalah 32 KiB. -
Bucket Amazon S3 yang dienkripsi dengan enkripsi SSE-C tidak didukung.
Praktik terbaik
Berikut adalah beberapa praktik terbaik dan kiat pemecahan masalah.
-
Cadangkan file proto Anda di bucket Amazon S3.
Ini adalah praktik yang baik untuk membuat cadangan file proto Anda jika terjadi kesalahan. Misalnya, jika Anda salah memodifikasi file proto tanpa backup saat menjalankan protoc, ini dapat menyebabkan masalah pada tumpukan produksi Anda. Ada beberapa cara untuk mencadangkan file Anda di bucket Amazon S3. Misalnya, Anda dapat menggunakan pembuatan versi di bucket S3. Untuk informasi selengkapnya tentang cara mencadangkan file di bucket Amazon S3, lihat Panduan Pengembang Amazon S3.
-
Konfigurasikan AWS IoT logging untuk melihat entri log.
Ini adalah praktik yang baik untuk mengonfigurasi AWS IoT logging sehingga Anda dapat memeriksa AWS IoT log untuk akun Anda CloudWatch. Ketika kueri SQL aturan memanggil fungsi eksternal, AWS IoT Core Aturan menghasilkan entri log dengan
eventTypedariFunctionExecution, yang berisi bidang alasan yang akan membantu Anda memecahkan masalah kegagalan. Kemungkinan kesalahan termasuk objek Amazon S3 tidak ditemukan, atau deskriptor file protobuf yang tidak valid. Untuk informasi selengkapnya tentang cara mengonfigurasi AWS IoT logging dan melihat entri log, lihat Mengkonfigurasi entri log mesin AWS IoT logging dan Aturan. -
Perbarui
FileDescriptorSetmenggunakan kunci objek baru dan perbarui kunci objek di Aturan Anda.Anda dapat memperbarui
FileDescriptorSetdengan mengunggah file deskriptor yang diperbarui ke bucket Amazon S3 Anda. Pembaruan AndaFileDescriptorSetdapat memakan waktu hingga 15 menit untuk tercermin. Untuk menghindari penundaan ini, adalah praktik yang baik untuk mengunggah pembaruan AndaFileDescriptorSetmenggunakan kunci objek baru, dan memperbarui kunci objek di Aturan Anda.