Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Mengkonsumsi data IoT secara hemat biaya langsung ke Amazon S3 menggunakan AWS IoT Greengrass
Sebastian Viviani dan Rizwan Syed, Amazon Web Services
Ringkasan
Pola ini menunjukkan kepada Anda cara menyerap data Internet of Things (IoT) secara hemat biaya langsung ke bucket Amazon Simple Storage Service (Amazon S3) dengan menggunakan perangkat AWS IoT Greengrass Version 2. Perangkat menjalankan komponen khusus yang membaca data IoT dan menyimpan data dalam penyimpanan persisten (yaitu, disk atau volume lokal). Kemudian, perangkat memampatkan data IoT menjadi file Apache Parquet dan mengunggah data secara berkala ke bucket S3.
Jumlah dan kecepatan data IoT yang Anda konsumsi hanya dibatasi oleh kemampuan perangkat keras tepi dan bandwidth jaringan Anda. Anda dapat menggunakan Amazon Athena untuk menganalisis data yang Anda konsumsi secara hemat biaya. Athena mendukung file Apache Parquet terkompresi dan visualisasi data dengan menggunakan Amazon Managed Grafana.
Prasyarat dan batasan
Prasyarat
Akun AWS yang aktif
Gateway edge yang berjalan pada AWS IoT Greengrass Versi 2 dan mengumpulkan data dari sensor (Sumber data dan proses pengumpulan data berada di luar cakupan pola ini, tetapi Anda dapat menggunakan hampir semua jenis data sensor. Pola ini menggunakan broker MQTT
lokal dengan sensor atau gateway yang mempublikasikan data secara lokal.) Komponen pengelola aliran untuk mengunggah data ke bucket S3
AWS SDK for
Java, AWS SDK JavaScript for, atau AWS SDK for Python (Boto3) untuk menjalankan APIs
Batasan
Data dalam pola ini tidak diunggah secara real time ke bucket S3. Ada periode penundaan, dan Anda dapat mengkonfigurasi periode penundaan. Data di-buffer sementara di perangkat edge dan kemudian diunggah setelah periode berakhir.
SDK hanya tersedia di Java, Node.js, dan Python.
Arsitektur
Tumpukan teknologi target
Amazon S3
AWS IoT Greengrass
Pialang MQTT
Komponen manajer aliran
Arsitektur target
Diagram berikut menunjukkan arsitektur yang dirancang untuk menyerap data sensor IoT dan menyimpan data tersebut dalam bucket S3.

Diagram menunjukkan alur kerja berikut:
Beberapa sensor (misalnya, suhu dan katup) pembaruan dipublikasikan ke broker MQTT lokal.
Kompresor file Parket yang berlangganan sensor ini memperbarui topik dan menerima pembaruan ini.
Kompresor file Parquet menyimpan pembaruan secara lokal.
Setelah periode berlalu, file yang disimpan dikompresi menjadi file Parket dan diteruskan ke pengelola aliran untuk diunggah ke bucket S3 yang ditentukan.
Manajer aliran mengunggah file Parket ke bucket S3.
catatan
Stream manager (StreamManager) adalah komponen terkelola. Untuk contoh cara mengekspor data ke Amazon S3, lihat Stream manager di dokumentasi AWS IoT Greengrass. Anda dapat menggunakan broker MQTT lokal sebagai komponen atau broker lain seperti Eclipse Mosquitto.
Alat
Alat AWS
Amazon Athena adalah layanan kueri interaktif yang membantu Anda menganalisis data secara langsung di Amazon S3 dengan menggunakan SQL standar.
Amazon Simple Storage Service (Amazon S3) adalah layanan penyimpanan objek berbasis cloud yang membantu Anda menyimpan, melindungi, dan mengambil sejumlah data.
AWS IoT Greengrass adalah layanan runtime dan cloud IoT edge open source yang membantu Anda membangun, menerapkan, dan mengelola aplikasi IoT di perangkat Anda.
Alat lainnya
Apache Parquet
adalah format file data berorientasi kolom sumber terbuka yang dirancang untuk penyimpanan dan pengambilan. MQTT (Message Queuing Telemetry Transport) adalah protokol pesan ringan yang dirancang untuk perangkat terbatas.
Praktik terbaik
Gunakan format partisi yang tepat untuk data yang diunggah
Tidak ada persyaratan khusus untuk nama awalan root di bucket S3 (misalnya, "myAwesomeDataSet/" atau"dataFromSource"), tetapi kami menyarankan Anda menggunakan partisi dan awalan yang bermakna sehingga mudah untuk memahami tujuan kumpulan data.
Kami juga menyarankan Anda menggunakan partisi yang tepat di Amazon S3 sehingga kueri berjalan secara optimal pada kumpulan data. Dalam contoh berikut, data dipartisi dalam format HIVE sehingga jumlah data yang dipindai oleh setiap kueri Athena dioptimalkan. Ini meningkatkan kinerja dan mengurangi biaya.
s3://<ingestionBucket>/<rootPrefix>/year=YY/month=MM/day=DD/HHMM_<suffix>.parquet
Epik
| Tugas | Deskripsi | Keterampilan yang dibutuhkan |
|---|---|---|
Buat ember S3. |
| Pengembang aplikasi |
Tambahkan izin IAM ke bucket S3. | Untuk memberi pengguna akses tulis ke bucket S3 dan awalan yang Anda buat sebelumnya, tambahkan kebijakan IAM berikut ke peran AWS IoT Greengrass Anda:
Untuk informasi selengkapnya, lihat Membuat kebijakan IAM untuk mengakses sumber daya Amazon S3 dalam dokumentasi Aurora. Selanjutnya, perbarui kebijakan sumber daya (jika diperlukan) untuk bucket S3 agar memungkinkan akses tulis dengan prinsip AWS yang benar. | Pengembang aplikasi |
| Tugas | Deskripsi | Keterampilan yang dibutuhkan |
|---|---|---|
Perbarui resep komponen. | Perbarui konfigurasi komponen saat Anda membuat penerapan berdasarkan contoh berikut:
Ganti | Pengembang aplikasi |
Buat komponen. | Lakukan salah satu tindakan berikut:
| Pengembang aplikasi |
Perbarui klien MQTT. | Kode sampel tidak menggunakan otentikasi karena komponen terhubung secara lokal ke broker. Jika skenario Anda berbeda, perbarui bagian klien MQTT sesuai kebutuhan. Selain itu, lakukan hal berikut:
| Pengembang aplikasi |
| Tugas | Deskripsi | Keterampilan yang dibutuhkan |
|---|---|---|
Perbarui penyebaran perangkat inti. | Jika penerapan perangkat inti AWS IoT Greengrass Versi 2 sudah ada, revisi penerapannya. Jika penerapan tidak ada, buat penerapan baru. Untuk memberi komponen nama yang benar, perbarui konfigurasi pengelola log untuk komponen baru (jika diperlukan) berdasarkan hal berikut:
Terakhir, selesaikan revisi penerapan untuk perangkat inti AWS IoT Greengrass Anda. | Pengembang aplikasi |
| Tugas | Deskripsi | Keterampilan yang dibutuhkan |
|---|---|---|
Periksa log untuk volume AWS IoT Greengrass. | Periksa hal berikut:
| Pengembang aplikasi |
Periksa ember S3. | Verifikasi apakah data sedang diunggah ke bucket S3. Anda dapat melihat file yang diunggah di setiap periode. Anda juga dapat memverifikasi apakah data diunggah ke bucket S3 dengan menanyakan data di bagian berikutnya. | Pengembang aplikasi |
| Tugas | Deskripsi | Keterampilan yang dibutuhkan |
|---|---|---|
Buat database dan tabel. |
| Pengembang aplikasi |
Berikan Athena akses ke data. |
| Pengembang aplikasi |
Pemecahan Masalah
| Isu | Solusi |
|---|---|
Klien MQTT gagal terhubung |
|
Klien MQTT gagal berlangganan | Validasi izin pada broker MQTT. Jika Anda memiliki broker MQTT dari AWS, lihat broker MQTT 3.1.1 (Moquette) dan broker MQTT 5 (EMQX). |
File parket tidak dibuat |
|
Objek tidak diunggah ke bucket S3 |
|
Sumber daya terkait
DataFrame
(Dokumentasi Pandas) Dokumentasi Parket Apache (Dokumentasi
parket) Kembangkan komponen AWS IoT Greengrass (Panduan Pengembang AWS IoT Greengrass, Versi 2)
Menerapkan komponen AWS IoT Greengrass ke perangkat (Panduan Pengembang AWS IoT Greengrass, Versi 2)
Berinteraksi dengan perangkat IoT lokal (Panduan Pengembang AWS IoT Greengrass, Versi 2)
Broker MQTT 3.1.1 (Moquette) (Panduan Pengembang AWS IoT Greengrass, Versi 2)
Broker MQTT 5 (EMQX) (Panduan Pengembang AWS IoT Greengrass, Versi 2)
Informasi tambahan
Analisis biaya
Skenario analisis biaya berikut menunjukkan bagaimana pendekatan konsumsi data yang tercakup dalam pola ini dapat memengaruhi biaya konsumsi data di AWS Cloud. Contoh harga dalam skenario ini didasarkan pada harga pada saat publikasi. Harga dapat berubah sewaktu-waktu. Selain itu, biaya Anda dapat bervariasi tergantung pada Wilayah AWS, kuota layanan AWS, dan faktor lain yang terkait dengan lingkungan cloud Anda.
Set sinyal masukan
Analisis ini menggunakan rangkaian sinyal input berikut sebagai dasar untuk membandingkan biaya konsumsi IoT dengan alternatif lain yang tersedia.
Jumlah sinyal | Frekuensi | Data per sinyal |
|---|---|---|
125 | 25 Hz | 8 byte |
Dalam skenario ini, sistem menerima 125 sinyal. Setiap sinyal adalah 8 byte dan terjadi setiap 40 milidetik (25 Hz). Sinyal-sinyal ini bisa datang secara individual atau dikelompokkan dalam muatan umum. Anda memiliki opsi untuk membagi dan mengemas sinyal-sinyal ini berdasarkan kebutuhan Anda. Anda juga dapat menentukan latensi. Latensi terdiri dari periode waktu untuk menerima, mengumpulkan, dan menelan data.
Untuk tujuan perbandingan, operasi konsumsi untuk skenario ini berbasis di Wilayah us-east-1 AWS. Perbandingan biaya hanya berlaku untuk layanan AWS. Biaya lain, seperti perangkat keras atau konektivitas, tidak diperhitungkan dalam analisis.
Perbandingan biaya
Tabel berikut menunjukkan biaya bulanan dalam dolar AS (USD) untuk setiap metode konsumsi.
Metode | Biaya bulanan |
|---|---|
AWS IoT* SiteWise | 331.77 USD |
AWS IoT SiteWise Edge dengan paket pemrosesan data (menjaga semua data tetap di tepi) | 200 USD |
Aturan AWS IoT Core dan Amazon S3 untuk mengakses data mentah | 84.54 USD |
Kompresi file parket di tepi dan mengunggah ke Amazon S3 | 0.5 USD |
*Data harus di-downsampled untuk memenuhi kuota layanan. Ini berarti ada beberapa kehilangan data dengan metode ini.
Metode alternatif
Bagian ini menunjukkan biaya yang setara untuk metode alternatif berikut:
AWS IoT SiteWise — Setiap sinyal harus diunggah dalam pesan individual. Oleh karena itu, jumlah total pesan per bulan adalah 125 × 25 × 3600 × 24 × 30, atau 8,1 miliar pesan per bulan. Namun, AWS IoT hanya SiteWise dapat menangani 10 titik data per detik per properti. Dengan asumsi data di-downsampled menjadi 10 Hz, jumlah pesan per bulan dikurangi menjadi 125 × 10 × 3600 × 24 × 30, atau 3,24 miliar. Jika Anda menggunakan komponen penerbit yang mengemas pengukuran dalam kelompok 10 (dengan 1 USD per juta pesan), maka Anda mendapatkan biaya bulanan sebesar 324 USD per bulan. Dengan asumsi bahwa setiap pesan adalah 8 byte (1 Kb/125), itu adalah 25,92 Gb penyimpanan data. Ini menambah biaya bulanan 7,77 USD per bulan. Total biaya untuk bulan pertama adalah 331,77 USD dan meningkat sebesar 7,77 USD setiap bulan.
AWS IoT SiteWise Edge dengan paket pemrosesan data, termasuk semua model dan sinyal yang diproses sepenuhnya di edge (yaitu, tidak ada konsumsi cloud) — Anda dapat menggunakan paket pemrosesan data sebagai alternatif untuk mengurangi biaya dan mengonfigurasi semua model yang dihitung di tepi. Ini dapat bekerja hanya untuk penyimpanan dan visualisasi, bahkan jika tidak ada perhitungan nyata yang dilakukan. Dalam hal ini, perlu menggunakan perangkat keras yang kuat untuk gateway tepi. Ada biaya tetap 200 USD per bulan.
Konsumsi langsung ke AWS IoT Core oleh MQTT dan aturan IoT untuk menyimpan data mentah di Amazon S3 — Dengan asumsi semua sinyal dipublikasikan dalam muatan umum, jumlah total pesan yang dipublikasikan ke AWS IoT Core adalah 25 × 3600 × 24 × 30, atau 64,8 juta per bulan. Dengan 1 USD per juta pesan, itu biaya bulanan 64,8 USD per bulan. Pada 0,15 USD per juta aktivasi aturan dan dengan satu aturan per pesan, yang menambahkan biaya bulanan sebesar 19,44 USD per bulan. Dengan biaya 0,023 USD per Gb penyimpanan di Amazon S3, yang menambahkan 1,5 USD per bulan (meningkat setiap bulan untuk mencerminkan data baru). Total biaya untuk bulan pertama adalah 84,54 USD dan meningkat 1,5 USD setiap bulan.
Mengompresi data di tepi dalam file Parket dan mengunggah ke Amazon S3 (metode yang diusulkan) - Rasio kompresi tergantung pada jenis data. Dengan data industri yang sama diuji untuk MQTT, total data output selama sebulan penuh adalah 1,2 Gb. Biayanya 0,03 USD per bulan. Rasio kompresi (menggunakan data acak) yang dijelaskan dalam tolok ukur lain berada di urutan 66 persen (lebih dekat ke skenario terburuk). Total data adalah 21 Gb dan biaya 0,5 USD per bulan.
Generator file parket
Contoh kode berikut menunjukkan struktur generator file Parket yang ditulis dengan Python. Contoh kode hanya untuk tujuan ilustrasi dan tidak akan berfungsi jika ditempelkan ke lingkungan Anda.
import queue import paho.mqtt.client as mqtt import pandas as pd #queue for decoupling the MQTT thread messageQueue = queue.Queue() client = mqtt.Client() streammanager = StreamManagerClient() def feederListener(topic, message): payload = { "topic" : topic, "payload" : message, } messageQueue.put_nowait(payload) def on_connect(client_instance, userdata, flags, rc): client.subscribe("#",qos=0) def on_message(client, userdata, message): feederListener(topic=str(message.topic), message=str(message.payload.decode("utf-8"))) filename = "tempfile.parquet" streamname = "mystream" destination_bucket= "amzn-s3-demo-bucket" keyname="mykey" period= 60 client.on_connect = on_connect client.on_message = on_message streammanager.create_message_stream( MessageStreamDefinition(name=streamname, strategy_on_full=StrategyOnFull.OverwriteOldestData) ) while True: try: message = messageQueue.get(timeout=myArgs.mqtt_timeout) except (queue.Empty): logger.warning("MQTT message reception timed out") currentTimestamp = getCurrentTime() if currentTimestamp >= nextUploadTimestamp: df = pd.DataFrame.from_dict(accumulator) df.to_parquet(filename) s3_export_task_definition = S3ExportTaskDefinition(input_url=filename, bucket=destination_bucket, key=key_name) streammanager.append_message(streamname, Util.validate_and_serialize_to_json_bytes(s3_export_task_definition)) accumulator = {} nextUploadTimestamp += period else: accumulator.append(message)