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
Saat 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
SELECT
klausa 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
SELECT
klausa 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
SELECT
klausa ini dengan muatan biner.Berikut ini mengacu
device_type
pada 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
) -
.proto
Fileyang 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
.proto
file yang menentukan jenis pesan..proto
File contoh dapat terlihat seperti berikut:syntax = "proto3"; message Person { optional string name = 1; optional int32 id = 2; optional string email = 3; }
Dalam
.proto
file contoh ini, Anda menggunakan sintaks proto3 dan menentukan jenis pesan.Person
DefinisiPerson
pesan menentukan tiga bidang (nama, id, dan email). Untuk informasi selengkapnya tentang format pesan.proto
file, lihat Panduan Bahasa (proto3). -
Gunakan kompiler protoc
untuk mengkompilasi .proto
file 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>.proto
Perintah 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_out
Menentukan nama file deskriptor (
<FILENAME>.desc
) yang harus dihasilkan. -
--proto_path
Menentukan lokasi dari setiap
.proto
file impor yang direferensikan oleh file yang sedang dikompilasi. Anda dapat menentukan bendera beberapa kali jika Anda memiliki beberapa.proto
file yang diimpor dengan lokasi yang berbeda. -
--include_imports
Menentukan bahwa setiap
.proto
file yang diimpor juga harus dikompilasi dan disertakan dalam file<FILENAME>.desc
deskriptor. -
<PROTO_FILENAME>.proto
Menentukan nama
.proto
file 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
FileDescriptorSet
dari 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:{ "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
" } ] }-
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 Anda 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
Person
pesan yang ditentukan.PROTO_FILENAME.proto
-
Bucket Amazon S3 bernama
BUCKET NAME
berisi yangFILENAME.desc
dihasilkan dari.PROTO_FILENAME.proto
Setelah Anda menyelesaikan konfigurasi, publikasikan pesan ke AWS IoT Core topik yang menjadi aturan berlangganan.
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
FileDescriptorSet
disimpan 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
eventType
dariFunctionExecution
, 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
FileDescriptorSet
menggunakan kunci objek baru dan perbarui kunci objek di Aturan Anda.Anda dapat memperbarui
FileDescriptorSet
dengan mengunggah file deskriptor yang diperbarui ke bucket Amazon S3 Anda. Pembaruan AndaFileDescriptorSet
dapat memakan waktu hingga 15 menit untuk tercermin. Untuk menghindari penundaan ini, adalah praktik yang baik untuk mengunggah pembaruan AndaFileDescriptorSet
menggunakan kunci objek baru, dan memperbarui kunci objek di Aturan Anda.