Konfigurasi ekspor untuk tujuan AWS Cloud yang didukung - AWS IoT Greengrass

AWS IoT Greengrass Version 1 memasuki fase umur panjang pada 30 Juni 2023. Untuk informasi selengkapnya, lihat kebijakan AWS IoT Greengrass V1 pemeliharaan. Setelah tanggal ini, tidak AWS IoT Greengrass V1 akan merilis pembaruan yang menyediakan fitur, penyempurnaan, perbaikan bug, atau patch keamanan. Perangkat yang berjalan AWS IoT Greengrass V1 tidak akan terganggu dan akan terus beroperasi dan terhubung ke cloud. Kami sangat menyarankan Anda bermigrasi ke AWS IoT Greengrass Version 2, yang menambahkan fitur baru yang signifikan dan dukungan untuk platform tambahan.

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Konfigurasi ekspor untuk tujuan AWS Cloud yang didukung

Gunakan fungsi Lambda yang ditentukan pengguna StreamManagerClient di dalam AWS IoT Greengrass SDK core untuk berinteraksi dengan pengelola pengaliran. Ketika fungsi Lambda membuat pengaliran atau memperbarui pengaliran, fungsi ini melewati objek MessageStreamDefinition yang mewakili properti pengaliran, termasuk definisi ekspor. Objek ExportDefinition berisi konfigurasi ekspor yang ditentukan untuk pengaliran. Stream manager menggunakan konfigurasi ekspor ini untuk menentukan di mana dan bagaimana untuk mengekspor aliran tersebut.

Diagram model objek dari ExportDefinition jenis properti.

Anda dapat menentukan konfigurasi ekspor nol atau lebih pada suatu aliran, termasuk beberapa konfigurasi ekspor untuk satu jenis tujuan. Misalnya, Anda dapat mengekspor aliran ke dua saluran AWS IoT Analytics dan satu Kinesis data stream.

Untuk usaha ekspor yang gagal, stream manager terus-menerus mencoba mengekspor data ke AWS Cloud pada interval hingga lima menit. Jumlah upaya coba lagi tidak memiliki batas maksimum.

catatan

StreamManagerClient juga menyediakan target tujuan yang dapat Anda gunakan untuk mengekspor aliran ke server HTTP. Target ini ditujukan untuk tujuan pengujian saja. Target ini tidak stabil atau didukung untuk digunakan di lingkungan produksi.

Anda bertanggung jawab untuk mempertahankan AWS Cloud sumber daya ini.

AWS IoT Analytics saluran

Stream manager mendukung ekspor otomatis ke AWS IoT Analytics. AWS IoT Analytics memungkinkan Anda melakukan analisis lanjutan pada data Anda untuk membantu membuat keputusan bisnis dan meningkatkan model machine learning. Untuk informasi lebih lanjut, lihat Apa AWS IoT Analytics? dalam AWS IoT Analytics Panduan Pengguna.

Dalam SDK Core AWS IoT Greengrass tersebut, fungsi Lambda Anda menggunakan IoTAnalyticsConfig untuk menentukan konfigurasi ekspor untuk jenis tujuan ini. Untuk informasi lebih lanjut, lihat referensi SDK untuk bahasa target Anda:

Persyaratan

Tujuan ekspor ini memiliki persyaratan sebagai berikut:

  • Saluran target di dalam AWS IoT Analytics harus ada di dalam Akun AWS yang sama dan Wilayah AWS sebagai grup Greengrass.

  • Sebuah Peran grup Greengrass harus memberikan iotanalytics:BatchPutMessage izin untuk menargetkan saluran. Misalnya:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iotanalytics:BatchPutMessage" ], "Resource": [ "arn:aws:iotanalytics:region:account-id:channel/channel_1_name", "arn:aws:iotanalytics:region:account-id:channel/channel_2_name" ] } ] }

    Anda dapat memberikan akses terperinci atau bersyarat ke sumber daya, misalnya dengan menggunakan skema penamaan wildcard *. Untuk informasi lebih lanjut, lihat Menambahkan dan menghapus kebijakan IAM dalam Panduan Pengguna IAM.

Mengekspor ke AWS IoT Analytics

Untuk membuat aliran yang mengekspor ke AWS IoT Analytics, fungsi Lambda Anda buat aliran dengan definisi ekspor yang mencakup satu atau lebih IoTAnalyticsConfig objek. Objek ini menentukan pengaturan ekspor, seperti saluran target, ukuran batch, batch interval, dan prioritas.

Ketika fungsi Lambda Anda menerima data dari perangkat, mereka menambahkan pesan yang berisi gumpalan data ke aliran target.

Kemudian, manajer pengaliran mengekspor data berdasarkan pengaturan batch dan prioritas yang ditentukan di dalam konfigurasi ekspor pengaliran.

 

Amazon Kinesis data streams

Pengelola pengaliran mendukung ekspor otomatis ke Amazon Kinesis Data Streams. Kinesis Data Streams umumnya digunakan untuk mengumpulkan data volume tinggi dan memuatnya ke dalam gudang data atau klaster map-reduce. Untuk informasi lebih lanjut, lihat Apa itu Amazon Kinesis Data Streams? dalam Panduan Developer Amazon Kinesis.

Dalam SDK Core AWS IoT Greengrass tersebut, fungsi Lambda Anda menggunakan KinesisConfig untuk menentukan konfigurasi ekspor untuk jenis tujuan ini. Untuk informasi lebih lanjut, lihat referensi SDK untuk bahasa target Anda:

Persyaratan

Tujuan ekspor ini memiliki persyaratan sebagai berikut:

  • Pengaliran target di dalam Kinesis Data Streams harus sama Akun AWS dan Wilayah AWS sebagai grup Greengrass.

  • Sebuah Peran grup Greengrass harus memberikan kinesis:PutRecords izin untuk menargetkan pengaliran data. Misalnya:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "kinesis:PutRecords" ], "Resource": [ "arn:aws:kinesis:region:account-id:stream/stream_1_name", "arn:aws:kinesis:region:account-id:stream/stream_2_name" ] } ] }

    Anda dapat memberikan akses terperinci atau bersyarat ke sumber daya, misalnya dengan menggunakan skema penamaan wildcard *. Untuk informasi lebih lanjut, lihat Menambahkan dan menghapus kebijakan IAM dalam Panduan Pengguna IAM.

Mengekspor ke Kinesis Data Streams

Untuk membuat pengaliran yang mengeksport ke Kinesis Data Streams, fungsi Lambda anda buat pengaliran dengan definisi ekspor yang mencakup satu atau lebih KinesisConfig objek. Objek ini menentukan pengaturan ekspor, seperti aliran data target, ukuran batch, interval batch, dan prioritas.

Ketika fungsi Lambda Anda menerima data dari perangkat, mereka menambahkan pesan yang berisi gumpalan data ke aliran target. Kemudian, manajer pengaliran mengekspor data berdasarkan pengaturan batch dan prioritas yang ditentukan di dalam konfigurasi ekspor pengaliran.

Stream manager menghasilkan UUID acak yang unik sebagai kunci partisi untuk setiap rekaman yang diunggah ke Amazon Kinesis.

 

Properti aset AWS IoT SiteWise

Stream manager mendukung ekspor otomatis ke AWS IoT SiteWise. AWS IoT SiteWise memungkinkan Anda mengumpulkan, mengatur, dan menganalisis data dari peralatan industri dalam skala besar. Untuk informasi lebih lanjut, lihat Apa AWS IoT SiteWise? dalam AWS IoT SiteWise Panduan Pengguna.

Dalam SDK Core AWS IoT Greengrass tersebut, fungsi Lambda Anda menggunakan IoTSiteWiseConfig untuk menentukan konfigurasi ekspor untuk jenis tujuan ini. Untuk informasi lebih lanjut, lihat referensi SDK untuk bahasa target Anda:

catatan

AWS juga menyediakan Konektor IoT SiteWise , yang merupakan solusi pra-dibuat yang dapat Anda gunakan dengan sumber OPC-UA.

Persyaratan

Tujuan ekspor ini memiliki persyaratan sebagai berikut:

  • Targetkan properti aset di AWS IoT SiteWise harus dalam yang sama Akun AWS dan Wilayah AWS sebagai grup Greengrass.

    catatan

    Untuk daftar Wilayah yang didukung AWS IoT SiteWise tersebut, lihat AWS IoT SiteWise kuota dan titik akhir dalam AWS Referensi Umum.

  • Sebuah Peran grup Greengrass harus mengizinkan iotsitewise:BatchPutAssetPropertyValue izin untuk menargetkan properti aset. Kebijakan berikut menggunakan kunci kondisi iotsitewise:assetHierarchyPath untuk memberikan akses ke aset akar target dan anak-anaknya. Anda dapat menghapus Condition dari kebijakan untuk mengizinkan akses ke semua aset AWS IoT SiteWise atau menentukan ARN aset individu.

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "iotsitewise:BatchPutAssetPropertyValue", "Resource": "*", "Condition": { "StringLike": { "iotsitewise:assetHierarchyPath": [ "/root node asset ID", "/root node asset ID/*" ] } } } ] }

    Anda dapat memberikan akses terperinci atau bersyarat ke sumber daya, misalnya dengan menggunakan skema penamaan wildcard *. Untuk informasi lebih lanjut, lihat Menambahkan dan menghapus kebijakan IAM dalam Panduan Pengguna IAM.

    Untuk informasi keamanan penting, lihat BatchPutAssetPropertyValue otorisasidiAWS IoT SiteWisePanduan Pengguna.

Mengekspor ke AWS IoT SiteWise

Untuk membuat aliran yang mengekspor ke AWS IoT SiteWise, fungsi Lambda Anda buat aliran dengan definisi ekspor yang mencakup satu atau lebih IoTSiteWiseConfig objek. Objek ini mendefinisikan pengaturan ekspor, seperti ukuran batch, batch interval, dan prioritas.

Ketika fungsi Lambda Anda menerima data properti aset dari perangkat, mereka menambahkan pesan yang berisi data ke pengaliran target. Pesan adalah objek PutAssetPropertyValueEntry serial JSON yang berisi nilai properti untuk satu atau lebih properti aset. Untuk informasi selengkapnya, lihat: Tambahkan pesan untuk tujuan ekspor AWS IoT SiteWise.

catatan

Saat Anda mengirim data ke AWS IoT SiteWise, data Anda harus memenuhi persyaratan tindakan BatchPutAssetPropertyValue. Untuk informasi selengkapnya, lihat BatchPutAssetPropertyValue di Referensi API AWS IoT SiteWise.

Kemudian, manajer pengaliran mengekspor data berdasarkan pengaturan batch dan prioritas yang ditentukan di dalam konfigurasi ekspor pengaliran.

 

Anda dapat menyesuaikan pengaturan pengelola pengaliran dan logika fungsi Lambda untuk merancang strategi ekspor Anda. Misalnya:

  • Untuk ekspor yang mendekati real time, atur ukuran batch dan pengaturan interval yang rendah dan tambahkan data ke aliran saat diterima.

  • Untuk mengoptimalkan batching, mengurangi kendala bandwidth, atau meminimalkan biaya, fungsi Lambda Anda dapat mengumpulkan timestamp-quality-value Titik data (TQV) diterima untuk properti aset tunggal sebelum menambahkan data ke aliran. Salah satu strateginya adalah mengelompokkan entri hingga 10 kombinasi aset properti yang berbeda, atau alias properti, dalam satu pesan, dan bukan mengirim lebih dari satu entri untuk properti yang sama. Hal ini membantu manajer pengaliran untuk tetap berada dalam kuota AWS IoT SiteWise.

 

Objek Amazon S3

Stream manager mendukung ekspor otomatis ke Amazon S3. Sebagai contoh, Anda dapat menggunakan Amazon S3 untuk menyimpan dan mengambil sejumlah besar data. Untuk informasi lebih lanjut, lihat Apa Amazon S3? dalam Panduan Developer Amazon Simple Storage Service.

Dalam SDK Core AWS IoT Greengrass tersebut, fungsi Lambda Anda menggunakan S3ExportTaskExecutorConfig untuk menentukan konfigurasi ekspor untuk jenis tujuan ini. Untuk informasi lebih lanjut, lihat referensi SDK untuk bahasa target Anda:

Persyaratan

Tujuan ekspor ini memiliki persyaratan sebagai berikut:

  • Target Amazon S3 bucket harus berada di Akun AWS sebagai grup Greengrass.

  • Jika kontainerisasi default untuk grup Greengrass adalah kontainer Greengrass, Anda harus mengatur parameter STREAM_MANAGER_READ_ONLY_DIRS untuk menggunakan direktori file input yang berada di bawah /tmp atau tidak pada sistem file root.

  • Jika fungsi Lambda berjalan di kontainer Greengrass mode menulis file input ke direktori file input, Anda harus membuat sumber daya volume lokal untuk direktori dan mount direktori ke kontainer dengan izin menulis. Hal ini memastikan bahwa file ditulis ke sistem file root dan terlihat di luar kontainer. Untuk informasi selengkapnya, lihat Akses sumber daya lokal dengan fungsi dan konektor Lambda.

  • Sebuah Peran grup Greengrass harus mengizinkan izin berikut untuk target bucket. Misalnya:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:PutObject", "s3:AbortMultipartUpload", "s3:ListMultipartUploadParts" ], "Resource": [ "arn:aws:s3:::bucket-1-name/*", "arn:aws:s3:::bucket-2-name/*" ] } ] }

    Anda dapat memberikan akses terperinci atau bersyarat ke sumber daya, misalnya dengan menggunakan skema penamaan wildcard *. Untuk informasi lebih lanjut, lihat Menambahkan dan menghapus kebijakan IAM dalam Panduan Pengguna IAM.

Mengekspor ke Amazon S3

Untuk membuat pengaliran yang mengekspor ke Amazon S3, fungsi Lambda Anda menggunakan S3ExportTaskExecutorConfig objek untuk mengonfigurasi kebijakan ekspor. Kebijakan ini mendefinisikan pengaturan ekspor, seperti ambang dan prioritas unggahan multipart. Untuk ekspor Amazon S3, pengelola pengaliran mengunggah data yang dibaca dari file lokal pada perangkat core. Untuk memulai unggahan, fungsi Lambda Anda menambahkan tugas ekspor ke pengaliran target. Tugas ekspor berisi informasi tentang file input dan objek Amazon S3 target. Pengelola pengaliran mengeksekusi tugas dalam urutan yang mereka tambahkan ke pengaliran.

catatan

Target bucket harus sudah ada dalam Akun AWS. Jika sebuah objek untuk kunci tertentu tidak ada, pengelola pengaliran membuat objek untuk Anda.

Alur kerja tingkat tinggi ini ditunjukkan dalam diagram berikut.

Diagram alur kerja pengelola pengaliran untuk ekspor Amazon S3.

Pengelola pengaliran menggunakan unggahan multipart ambang properti, ukuran bagian minimum pengaturan, dan ukuran file input untuk menentukan cara untuk mengunggah data. Ambang batas unggahan multipart harus lebih besar atau sama dengan ukuran bagian minimum. Jika Anda ingin meng-upload data secara paralel, Anda dapat membuat beberapa aliran.

Kunci yang menentukan objek Amazon S3 target Anda dapat mencakup string Java DateTimeFormatter yang valid di placeholder !{timestamp:value}. Anda dapat menggunakan placeholder stempel waktu ini untuk membagi data di Amazon S3 berdasarkan waktu data file input tersebut diunggah. Sebagai contoh, nama kunci berikut memutuskan untuk nilai seperti my-key/2020/12/31/data.txt.

my-key/!{timestamp:YYYY}/!{timestamp:MM}/!{timestamp:dd}/data.txt
catatan

Jika Anda ingin memantau status ekspor untuk suatu aliran, pertama-tama buat status aliran dan kemudian konfigurasi aliran ekspor untuk menggunakannya. Untuk informasi selengkapnya, lihat Pantau tugas ekspor.

Kelola data input

Anda dapat penulis kode yang digunakan aplikasi IoT untuk mengelola siklus hidup dari input data. Contoh alur kerja berikut menunjukkan cara Anda mungkin menggunakan fungsi Lambda untuk mengelola data ini.

  1. Proses lokal menerima data dari perangkat atau periferal, lalu menulis data ke file dalam direktori pada perangkat core. Ini adalah file input untuk pengelola pengaliran.

    catatan

    Untuk menentukan apakah Anda harus mengonfigurasi akses ke direktori file input, lihat parameter STREAM_MANAGER_READ_ONLY_DIRS ini.

    Proses yang menjalankan pengelola pengaliran dalam mewarisi semua izin sistem file identitas akses default untuk grup. Pengelola pengaliran harus memiliki izin untuk mengakses file input. Anda dapat menggunakan chmod(1) perintah untuk mengubah izin dari file, jika perlu.

  2. Sebuah fungsi Lambda memindai direktori dan menambahkan tugas ekspor ke pengaliran target ketika file baru dibuat. Tugas adalah JSON-serialized S3ExportTaskDefinition objek yang menentukan URL dari file input, bucket dan kunci Amazon S3 target, dan metadata pengguna opsional.

  3. Stream manager membaca file input dan mengekspor data ke Amazon S3 dalam urutan tugas yang ditambahkan. Bucket target harus sudah ada dalam perangkat Akun AWS Anda. Jika sebuah objek untuk kunci tertentu tidak ada, pengelola pengaliran membuat objek untuk Anda.

  4. Fungsi Lambda membaca pesan dari pengaliran status untuk memantau status ekspor. Setelah tugas ekspor selesai, fungsi Lambda dapat menghapus file input yang sesuai. Untuk informasi selengkapnya, lihat Pantau tugas ekspor.

Pantau tugas ekspor

Anda dapat penulis kode yang digunakan aplikasi IoT untuk memantau status ekspor Amazon S3 Anda. Fungsi Lambda Anda harus membuat status pengaliran lalu mengonfigurasi pengaliran ekspor untuk menulis pembaruan ke status untuk status pengaliran. Pengaliran status tunggal dapat menerima pembaruan status dari beberapa pengaliran yang mengekspor ke Amazon S3.

Pertama-tama, buat aliran yang akan digunakan sebagai status aliran. Anda dapat mengonfigurasi kebijakan ukuran dan penyimpanan bagi aliran tersebut untuk mengontrol umur pesan status. Misalnya:

  • Tetapkan Persistence ke Memory jika Anda tidak ingin menyimpan pesan status.

  • Tetapkan StrategyOnFull ke OverwriteOldestData agar pesan status baru tidak hilang.

Kemudian, buat atau perbarui aliran ekspor untuk menggunakan status aliran. Secara khusus, atur properti konfigurasi status dari konfigurasi ekspor S3ExportTaskExecutorConfig pengaliran. Ini memberitahu pengelola pengaliran untuk menulis pesan status tentang tugas ekspor ke pengaliran status. Di StatusConfig objek, tentukan nama pengaliran status dan tingkat verbositas. Nilai yang didukung berikut berkisar dari verbositas paling kecil (ERROR) hingga verbositas tertinggi (TRACE). Default-nya adalah INFO.

  • ERROR

  • WARN

  • INFO

  • DEBUG

  • TRACE

 

Contoh alur kerja berikut menunjukkan cara fungsi Lambda mungkin menggunakan status pengaliran untuk memantau status ekspor.

  1. Seperti yang dijelaskan dalam alur kerja sebelumnya, fungsi Lambda menambahkan tugas ekspor ke pengaliran yang dikonfigurasi untuk menulis pesan status tentang tugas ekspor ke pengaliran status. Operasi penambahan mengembalikan nomor urut yang mewakili ID tugas.

  2. Sebuah fungsi Lambda membaca pesan secara berurutan dari pengaliran status, lalu menyaring pesan berdasarkan nama pengaliran dan ID tugas atau berdasarkan properti tugas ekspor dari konteks pesan. Sebagai contoh, fungsi Lambda dapat difilter oleh URL file input dari tugas ekspor, yang diwakili oleh S3ExportTaskDefinition objek dalam konteks pesan.

    Kode status berikut menunjukkan bahwa tugas ekspor telah mencapai keadaan selesai:

    • Success. Upload berhasil diselesaikan.

    • Failure. Stream manager mengalami kesalahan, misalnya, bucket yang ditentukan tidak ada. Setelah menyelesaikan masalah, Anda dapat menambahkan tugas ekspor ke aliran lagi.

    • Canceled. Tugas dibatalkan karena definisi aliran atau ekspor dihapus, atau time-to-live (TTL) periode tugas berakhir.

    catatan

    Tugas mungkin juga memiliki status InProgress atau Warning. Pengelola pengaliran mengeluarkan peringatan ketika suatu peristiwa mengembalikan kesalahan yang tidak memengaruhi pelaksanaan tugas. Sebagai contoh, kegagalan untuk membersihkan unggahan parsial dibatalkan mengembalikan peringatan.

  3. Setelah tugas ekspor selesai, fungsi Lambda dapat menghapus file input yang sesuai.

Contoh berikut menunjukkan cara fungsi Lambda mungkin membaca dan memproses pesan status.

Python
import time from greengrasssdk.stream_manager import ( ReadMessagesOptions, Status, StatusConfig, StatusLevel, StatusMessage, StreamManagerClient, ) from greengrasssdk.stream_manager.util import Util client = StreamManagerClient() try: # Read the statuses from the export status stream is_file_uploaded_to_s3 = False while not is_file_uploaded_to_s3: try: messages_list = client.read_messages( "StatusStreamName", ReadMessagesOptions(min_message_count=1, read_timeout_millis=1000) ) for message in messages_list: # Deserialize the status message first. status_message = Util.deserialize_json_bytes_to_obj(message.payload, StatusMessage) # Check the status of the status message. If the status is "Success", # the file was successfully uploaded to S3. # If the status was either "Failure" or "Cancelled", the server was unable to upload the file to S3. # We will print the message for why the upload to S3 failed from the status message. # If the status was "InProgress", the status indicates that the server has started uploading # the S3 task. if status_message.status == Status.Success: logger.info("Successfully uploaded file at path " + file_url + " to S3.") is_file_uploaded_to_s3 = True elif status_message.status == Status.Failure or status_message.status == Status.Canceled: logger.info( "Unable to upload file at path " + file_url + " to S3. Message: " + status_message.message ) is_file_uploaded_to_s3 = True time.sleep(5) except StreamManagerException: logger.exception("Exception while running") except StreamManagerException: pass # Properly handle errors. except ConnectionError or asyncio.TimeoutError: pass # Properly handle errors.

Referensi Python SDK: baca_pesan | StatusPesan

Java
import com.amazonaws.greengrass.streammanager.client.StreamManagerClient; import com.amazonaws.greengrass.streammanager.client.utils.ValidateAndSerialize; import com.amazonaws.greengrass.streammanager.model.ReadMessagesOptions; import com.amazonaws.greengrass.streammanager.model.Status; import com.amazonaws.greengrass.streammanager.model.StatusConfig; import com.amazonaws.greengrass.streammanager.model.StatusLevel; import com.amazonaws.greengrass.streammanager.model.StatusMessage; try (final StreamManagerClient client = GreengrassClientBuilder.streamManagerClient().build()) { try { boolean isS3UploadComplete = false; while (!isS3UploadComplete) { try { // Read the statuses from the export status stream List<Message> messages = client.readMessages("StatusStreamName", new ReadMessagesOptions().withMinMessageCount(1L).withReadTimeoutMillis(1000L)); for (Message message : messages) { // Deserialize the status message first. StatusMessage statusMessage = ValidateAndSerialize.deserializeJsonBytesToObj(message.getPayload(), StatusMessage.class); // Check the status of the status message. If the status is "Success", the file was successfully uploaded to S3. // If the status was either "Failure" or "Canceled", the server was unable to upload the file to S3. // We will print the message for why the upload to S3 failed from the status message. // If the status was "InProgress", the status indicates that the server has started uploading the S3 task. if (Status.Success.equals(statusMessage.getStatus())) { System.out.println("Successfully uploaded file at path " + FILE_URL + " to S3."); isS3UploadComplete = true; } else if (Status.Failure.equals(statusMessage.getStatus()) || Status.Canceled.equals(statusMessage.getStatus())) { System.out.println(String.format("Unable to upload file at path %s to S3. Message %s", statusMessage.getStatusContext().getS3ExportTaskDefinition().getInputUrl(), statusMessage.getMessage())); sS3UploadComplete = true; } } } catch (StreamManagerException ignored) { } finally { // Sleep for sometime for the S3 upload task to complete before trying to read the status message. Thread.sleep(5000); } } catch (e) { // Properly handle errors. } } catch (StreamManagerException e) { // Properly handle exception. }

Referensi SDK Java: readMessages | StatusMessage

Node.js
const { StreamManagerClient, ReadMessagesOptions, Status, StatusConfig, StatusLevel, StatusMessage, util, } = require('aws-greengrass-core-sdk').StreamManager; const client = new StreamManagerClient(); client.onConnected(async () => { try { let isS3UploadComplete = false; while (!isS3UploadComplete) { try { // Read the statuses from the export status stream const messages = await c.readMessages("StatusStreamName", new ReadMessagesOptions() .withMinMessageCount(1) .withReadTimeoutMillis(1000)); messages.forEach((message) => { // Deserialize the status message first. const statusMessage = util.deserializeJsonBytesToObj(message.payload, StatusMessage); // Check the status of the status message. If the status is 'Success', the file was successfully uploaded to S3. // If the status was either 'Failure' or 'Cancelled', the server was unable to upload the file to S3. // We will print the message for why the upload to S3 failed from the status message. // If the status was "InProgress", the status indicates that the server has started uploading the S3 task. if (statusMessage.status === Status.Success) { console.log(`Successfully uploaded file at path ${FILE_URL} to S3.`); isS3UploadComplete = true; } else if (statusMessage.status === Status.Failure || statusMessage.status === Status.Canceled) { console.log(`Unable to upload file at path ${FILE_URL} to S3. Message: ${statusMessage.message}`); isS3UploadComplete = true; } }); // Sleep for sometime for the S3 upload task to complete before trying to read the status message. await new Promise((r) => setTimeout(r, 5000)); } catch (e) { // Ignored } } catch (e) { // Properly handle errors. } }); client.onError((err) => { // Properly handle connection errors. // This is called only when the connection to the StreamManager server fails. });

Referensi SDK Node.js: readMessages | StatusMessage