

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

# Tutorial: Mengembangkan komponen Greengrass yang menunda pembaruan komponen
<a name="defer-component-updates-tutorial"></a>

Anda dapat menyelesaikan tutorial ini untuk mengembangkan komponen yang menunda pembaruan over-the-air penerapan. Saat menerapkan pembaruan ke perangkat, Anda mungkin ingin menunda pembaruan berdasarkan kondisi, seperti berikut ini:
+ Perangkat ini memiliki tingkat baterai rendah.
+ Perangkat menjalankan proses atau pekerjaan yang tidak dapat diganggu.
+ Perangkat ini memiliki koneksi internet terbatas atau mahal.

**catatan**  
*Komponen* adalah modul perangkat lunak yang berjalan pada perangkat AWS IoT Greengrass inti. Komponen memungkinkan Anda untuk membuat dan mengelola aplikasi yang kompleks sebagai blok bangunan diskrit yang dapat Anda gunakan kembali dari satu perangkat inti Greengrass ke yang lain.

Dalam tutorial ini, Anda akan melakukan hal-hal berikut:

1. Instal Greengrass Development Kit CLI (GDK CLI) di komputer pengembangan Anda. CLI GDK menyediakan fitur yang membantu Anda mengembangkan komponen Greengrass khusus.

1. Kembangkan komponen Hello World yang menunda pembaruan komponen saat tingkat baterai perangkat inti di bawah ambang batas. Komponen ini berlangganan untuk memperbarui notifikasi menggunakan operasi [SubscribeToComponentUpdates](ipc-component-lifecycle.md#ipc-operation-subscribetocomponentupdates)IPC. Saat menerima notifikasi, ia memeriksa apakah level baterai lebih rendah dari ambang batas yang dapat disesuaikan. Jika level baterai di bawah ambang batas, itu menunda pembaruan selama 30 detik menggunakan operasi [DeferComponentUpdate](ipc-component-lifecycle.md#ipc-operation-defercomponentupdate)IPC. Anda mengembangkan komponen ini di komputer pengembangan Anda menggunakan CLI GDK.
**catatan**  
Komponen ini membaca tingkat baterai dari file yang Anda buat pada perangkat inti untuk meniru baterai nyata, sehingga Anda dapat menyelesaikan tutorial ini pada perangkat inti tanpa baterai.

1. Publikasikan komponen itu ke AWS IoT Greengrass layanan.

1. Terapkan komponen itu dari perangkat inti Greengrass AWS Cloud ke untuk mengujinya. Kemudian, Anda memodifikasi level baterai virtual pada perangkat inti, dan membuat penerapan tambahan untuk melihat bagaimana perangkat inti menunda pembaruan saat level baterai rendah.

Anda dapat mengharapkan untuk menghabiskan 20-30 menit pada tutorial ini.

# Prasyarat
<a name="defer-component-updates-tutorial-prerequisites"></a>

Untuk menyelesaikan tutorial ini, Anda memerlukan hal berikut:
+ Sebuah Akun AWS. Jika Anda tidak memilikinya, lihat [Mengatur sebuah Akun AWS](setting-up.md#set-up-aws-account).
+ Pengguna AWS Identity and Access Management (IAM) dengan izin administrator.
+ Perangkat inti Greengrass dengan koneksi internet. Untuk informasi lebih lanjut tentang cara menyiapkan perangkat inti, lihat [Menyiapkan perangkat AWS IoT Greengrass inti](setting-up.md).
  + [Python](https://www.python.org/downloads/) 3.6 atau yang lebih baru diinstal untuk semua pengguna pada perangkat inti dan ditambahkan ke variabel lingkungan. `PATH` Di Windows, Anda juga harus menginstal Python Launcher untuk Windows untuk semua pengguna.
**penting**  <a name="windows-core-device-python-installation"></a>
Di Windows, Python tidak menginstal untuk semua pengguna secara default. Ketika Anda menginstal Python, Anda harus menyesuaikan instalasi untuk mengkonfigurasinya untuk perangkat lunak AWS IoT Greengrass Core untuk menjalankan skrip Python. Misalnya, jika Anda menggunakan penginstal Python grafis, lakukan hal berikut:  
Pilih **Instal peluncur untuk semua pengguna (disarankan)**.
Pilih **Customize installation**.
Pilih **Next**.
Pilih **Install for all users**.
Pilih **Add Python to environment variables**.
Pilih **Instal**.
Untuk informasi selengkapnya, lihat [Menggunakan Python di Windows](https://docs.python.org/3/using/windows.html) dalam dokumentasi *Python* 3.
+ Komputer pengembangan seperti Windows, macOS, atau Unix dengan koneksi internet.
  + [Python](https://www.python.org/downloads/) 3.6 atau yang lebih baru diinstal pada komputer pengembangan Anda.
  + [Git](https://git-scm.com/) diinstal pada komputer pengembangan Anda.
  + <a name="development-component-aws-cli-prerequisite"></a>AWS Command Line Interface (AWS CLI) diinstal dan dikonfigurasi dengan kredensi pada komputer pengembangan Anda. Untuk informasi selengkapnya, lihat [Menginstal, memperbarui, dan melepas pemasangan AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html) dan [Mengonfigurasi AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html) di *Panduan Pengguna AWS Command Line Interface *.
**catatan**  
Jika Anda menggunakan Raspberry Pi atau perangkat ARM 32-bit lainnya, instal AWS CLI V1. AWS CLI V2 tidak tersedia untuk perangkat ARM 32-bit. Untuk informasi selengkapnya, lihat [Menginstal, memperbarui, dan menghapus instalan AWS CLI versi 1](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv1.html).

# Langkah 1: Instal CLI Kit Pengembangan Greengrass
<a name="install-gdk-cli-defer-updates"></a>

Kit [Pengembangan Greengrass CLI (GDK CLI) menyediakan fitur yang membantu Anda mengembangkan komponen Greengrass](greengrass-development-kit-cli.md) khusus. Anda dapat menggunakan CLI GDK untuk membuat, membangun, dan menerbitkan komponen kustom.

Jika Anda belum menginstal CLI GDK di komputer pengembangan Anda, selesaikan langkah-langkah berikut untuk menginstalnya.

**Untuk menginstal versi terbaru dari CLI GDK**

1. [Di komputer pengembangan Anda, jalankan perintah berikut untuk menginstal versi terbaru CLI GDK dari GitHub repositorinya.](https://github.com/aws-greengrass/aws-greengrass-gdk-cli)

   ```
   python3 -m pip install -U git+https://github.com/aws-greengrass/aws-greengrass-gdk-cli.git@v1.6.2
   ```

1. <a name="gdk-cli-verify-installation"></a>Jalankan perintah berikut untuk memverifikasi bahwa CLI GDK berhasil diinstal.

   ```
   gdk --help
   ```

   Jika `gdk` perintah tidak ditemukan, tambahkan foldernya ke PATH.
   + Di perangkat Linux, tambahkan `/home/MyUser/.local/bin` ke PATH, dan ganti *MyUser* dengan nama pengguna Anda.
   + Pada perangkat Windows, tambahkan `PythonPath\\Scripts` ke PATH, dan ganti *PythonPath* dengan jalur ke folder Python di perangkat Anda.

# Langkah 2: Kembangkan komponen yang menunda pembaruan
<a name="develop-component-defer-updates"></a>

Di bagian ini, Anda mengembangkan komponen Hello World dengan Python yang menunda pembaruan komponen saat tingkat baterai perangkat inti berada di bawah ambang batas yang Anda konfigurasikan saat Anda menerapkan komponen. Dalam komponen ini, Anda menggunakan [antarmuka interprocess communication (IPC)](interprocess-communication.md) di AWS IoT Device SDK v2 untuk Python. Anda menggunakan operasi [SubscribeToComponentUpdates](ipc-component-lifecycle.md#ipc-operation-subscribetocomponentupdates)IPC untuk menerima pemberitahuan saat perangkat inti menerima penerapan. Kemudian, Anda menggunakan operasi [DeferComponentUpdate](ipc-component-lifecycle.md#ipc-operation-defercomponentupdate)IPC untuk menunda atau mengakui pembaruan berdasarkan tingkat baterai perangkat.

**Untuk mengembangkan komponen Hello World yang menunda pembaruan**

1. Di komputer pengembangan Anda, buat folder untuk kode sumber komponen.

   ```
   mkdir com.example.BatteryAwareHelloWorld
   cd com.example.BatteryAwareHelloWorld
   ```

1. Gunakan editor teks untuk membuat file bernama`gdk-config.json`. CLI GDK membaca dari file [konfigurasi CLI GDK](gdk-cli-configuration-file.md), `gdk-config.json` bernama, untuk membangun dan menerbitkan komponen. File konfigurasi ini ada di root folder komponen.

   <a name="nano-command-intro"></a>Misalnya, pada sistem berbasis Linux, Anda dapat menjalankan perintah berikut untuk menggunakan GNU nano untuk membuat file.

   ```
   nano gdk-config.json
   ```

   Salin JSON berikut ke dalam file.
   + Ganti *Amazon* dengan nama Anda.
   + Ganti *us-west-2* dengan Wilayah AWS tempat perangkat inti Anda beroperasi. CLI GDK menerbitkan komponen dalam hal ini. Wilayah AWS
   + Ganti *greengrass-component-artifacts* dengan awalan bucket S3 untuk digunakan. Saat Anda menggunakan CLI GDK untuk mempublikasikan komponen, CLI GDK mengunggah artefak komponen ke bucket S3 yang namanya dibentuk dari nilai ini, file, dan ID Anda menggunakan format Wilayah AWS berikut:. Akun AWS `bucketPrefix-region-accountId`

     Misalnya, jika Anda menentukan **greengrass-component-artifacts** dan**us-west-2**, dan Akun AWS ID Anda**123456789012**, CLI GDK menggunakan bucket S3 bernama. `greengrass-component-artifacts-us-west-2-123456789012`

   ```
   {
     "component": {
       "com.example.BatteryAwareHelloWorld": {
         "author": "Amazon",
         "version": "NEXT_PATCH",
         "build": {
           "build_system" : "zip"
         },
         "publish": {
           "region": "us-west-2",
           "bucket": "greengrass-component-artifacts"
         }
       }
     },
     "gdk_version": "1.0.0"
   }
   ```

   File konfigurasi menentukan hal berikut:
   + Versi yang akan digunakan saat CLI GDK menerbitkan komponen Greengrass ke layanan cloud. AWS IoT Greengrass `NEXT_PATCH`menentukan untuk memilih versi patch berikutnya setelah versi terbaru yang tersedia di layanan AWS IoT Greengrass cloud. Jika komponen belum memiliki versi di layanan AWS IoT Greengrass cloud, `1.0.0` CLI GDK akan menggunakannya.
   + Sistem build untuk komponen. Saat Anda menggunakan sistem `zip` build, CLI GDK mengemas sumber komponen ke dalam file ZIP yang menjadi artefak tunggal komponen.
   +  Wilayah AWS Tempat CLI GDK menerbitkan komponen Greengrass.
   + Awalan untuk bucket S3 tempat CLI GDK mengunggah artefak komponen.

1. Gunakan editor teks untuk membuat kode sumber komponen dalam file bernama`main.py`.

   <a name="nano-command-intro"></a>Misalnya, pada sistem berbasis Linux, Anda dapat menjalankan perintah berikut untuk menggunakan GNU nano untuk membuat file.

   ```
   nano main.py
   ```

   Salin kode Python berikut ke dalam file.

   ```
   import json
   import os
   import sys
   import time
   import traceback
   
   from pathlib import Path
   
   from awsiot.greengrasscoreipc.clientv2 import GreengrassCoreIPCClientV2
   
   HELLO_WORLD_PRINT_INTERVAL = 15  # Seconds
   DEFER_COMPONENT_UPDATE_INTERVAL = 30 * 1000  # Milliseconds
   
   
   class BatteryAwareHelloWorldPrinter():
       def __init__(self, ipc_client: GreengrassCoreIPCClientV2, battery_file_path: Path, battery_threshold: float):
           self.battery_file_path = battery_file_path
           self.battery_threshold = battery_threshold
           self.ipc_client = ipc_client
           self.subscription_operation = None
   
       def on_component_update_event(self, event):
           try:
               if event.pre_update_event is not None:
                   if self.is_battery_below_threshold():
                       self.defer_update(event.pre_update_event.deployment_id)
                       print('Deferred update for deployment %s' %
                             event.pre_update_event.deployment_id)
                   else:
                       self.acknowledge_update(
                           event.pre_update_event.deployment_id)
                       print('Acknowledged update for deployment %s' %
                             event.pre_update_event.deployment_id)
               elif event.post_update_event is not None:
                   print('Applied update for deployment')
           except:
               traceback.print_exc()
   
       def subscribe_to_component_updates(self):
           if self.subscription_operation == None:
               # SubscribeToComponentUpdates returns a tuple with the response and the operation.
               _, self.subscription_operation = self.ipc_client.subscribe_to_component_updates(
                   on_stream_event=self.on_component_update_event)
   
       def close_subscription(self):
           if self.subscription_operation is not None:
               self.subscription_operation.close()
               self.subscription_operation = None
   
       def defer_update(self, deployment_id):
           self.ipc_client.defer_component_update(
               deployment_id=deployment_id, recheck_after_ms=DEFER_COMPONENT_UPDATE_INTERVAL)
   
       def acknowledge_update(self, deployment_id):
           # Specify recheck_after_ms=0 to acknowledge a component update.
           self.ipc_client.defer_component_update(
               deployment_id=deployment_id, recheck_after_ms=0)
   
       def is_battery_below_threshold(self):
           return self.get_battery_level() < self.battery_threshold
   
       def get_battery_level(self):
           # Read the battery level from the virtual battery level file.
           with self.battery_file_path.open('r') as f:
               data = json.load(f)
               return float(data['battery_level'])
   
       def print_message(self):
           message = 'Hello, World!'
           if self.is_battery_below_threshold():
               message += ' Battery level (%d) is below threshold (%d), so the component will defer updates' % (
                   self.get_battery_level(), self.battery_threshold)
           else:
               message += ' Battery level (%d) is above threshold (%d), so the component will acknowledge updates' % (
                   self.get_battery_level(), self.battery_threshold)
           print(message)
   
   
   def main():
       # Read the battery threshold and virtual battery file path from command-line args.
       args = sys.argv[1:]
       battery_threshold = float(args[0])
       battery_file_path = Path(args[1])
       print('Reading battery level from %s and deferring updates when below %d' % (
           str(battery_file_path), battery_threshold))
   
       try:
           # Create an IPC client and a Hello World printer that defers component updates.
           ipc_client = GreengrassCoreIPCClientV2()
           hello_world_printer = BatteryAwareHelloWorldPrinter(
               ipc_client, battery_file_path, battery_threshold)
           hello_world_printer.subscribe_to_component_updates()
           try:
               # Keep the main thread alive, or the process will exit.
               while True:
                   hello_world_printer.print_message()
                   time.sleep(HELLO_WORLD_PRINT_INTERVAL)
           except InterruptedError:
               print('Subscription interrupted')
           hello_world_printer.close_subscription()
       except Exception:
           print('Exception occurred', file=sys.stderr)
           traceback.print_exc()
           exit(1)
   
   
   if __name__ == '__main__':
       main()
   ```

   Aplikasi Python ini melakukan hal berikut:
   + Membaca tingkat baterai perangkat inti dari file tingkat baterai virtual yang akan Anda buat di perangkat inti nanti. File tingkat baterai virtual ini meniru baterai sungguhan, sehingga Anda dapat menyelesaikan tutorial ini pada perangkat inti yang tidak memiliki baterai.
   + Membaca argumen baris perintah untuk ambang baterai dan jalur ke file tingkat baterai virtual. Resep komponen menetapkan argumen baris perintah ini berdasarkan parameter konfigurasi, sehingga Anda dapat menyesuaikan nilai-nilai ini saat menerapkan komponen.
   + Menggunakan klien IPC V2 di [AWS IoT Device SDK v2 untuk Python untuk](https://github.com/aws/aws-iot-device-sdk-python-v2) berkomunikasi dengan perangkat lunak Core AWS IoT Greengrass . Dibandingkan dengan klien IPC asli, klien IPC V2 mengurangi jumlah kode yang perlu Anda tulis untuk menggunakan IPC dalam komponen khusus.
   + Berlangganan untuk memperbarui pemberitahuan menggunakan operasi [SubscribeToComponentUpdates](ipc-component-lifecycle.md#ipc-operation-subscribetocomponentupdates)IPC. Perangkat lunak AWS IoT Greengrass Core mengirimkan pemberitahuan sebelum dan sesudah setiap penerapan. Komponen memanggil fungsi berikut setiap kali menerima pemberitahuan. Jika notifikasi untuk penerapan yang akan datang, komponen akan memeriksa apakah level baterai lebih rendah dari ambang batas. Jika level baterai di bawah ambang batas, komponen menunda pembaruan selama 30 detik menggunakan operasi [DeferComponentUpdate](ipc-component-lifecycle.md#ipc-operation-defercomponentupdate)IPC. Jika tidak, jika tingkat baterai tidak di bawah ambang batas, komponen mengakui pembaruan, sehingga pembaruan dapat dilanjutkan.

     ```
     def on_component_update_event(self, event):
         try:
             if event.pre_update_event is not None:
                 if self.is_battery_below_threshold():
                     self.defer_update(event.pre_update_event.deployment_id)
                     print('Deferred update for deployment %s' %
                           event.pre_update_event.deployment_id)
                 else:
                     self.acknowledge_update(
                         event.pre_update_event.deployment_id)
                     print('Acknowledged update for deployment %s' %
                           event.pre_update_event.deployment_id)
             elif event.post_update_event is not None:
                 print('Applied update for deployment')
         except:
             traceback.print_exc()
     ```
**catatan**  
Perangkat lunak AWS IoT Greengrass Core tidak mengirim pemberitahuan pembaruan untuk penerapan lokal, jadi Anda menerapkan komponen ini menggunakan layanan AWS IoT Greengrass cloud untuk mengujinya.

1. Gunakan editor teks untuk membuat resep komponen dalam file bernama `recipe.json` atau`recipe.yaml`. *Resep* komponen mendefinisikan metadata komponen, parameter konfigurasi default, dan skrip siklus hidup khusus platform.

------
#### [ JSON ]

   <a name="nano-command-intro"></a>Misalnya, pada sistem berbasis Linux, Anda dapat menjalankan perintah berikut untuk menggunakan GNU nano untuk membuat file.

   ```
   nano recipe.json
   ```

   Salin JSON berikut ke dalam file.

   ```
   {
     "RecipeFormatVersion": "2020-01-25",
     "ComponentName": "COMPONENT_NAME",
     "ComponentVersion": "COMPONENT_VERSION",
     "ComponentDescription": "This Hello World component defers updates when the battery level is below a threshold.",
     "ComponentPublisher": "COMPONENT_AUTHOR",
     "ComponentConfiguration": {
       "DefaultConfiguration": {
         "BatteryThreshold": 50,
         "LinuxBatteryFilePath": "/home/ggc_user/virtual_battery.json",
         "WindowsBatteryFilePath": "C:\\Users\\ggc_user\\virtual_battery.json"
       }
     },
     "Manifests": [
       {
         "Platform": {
           "os": "linux"
         },
         "Lifecycle": {
           "install": "python3 -m pip install --user awsiotsdk --upgrade",
           "Run": "python3 -u {artifacts:decompressedPath}/com.example.BatteryAwareHelloWorld/main.py \"{configuration:/BatteryThreshold}\" \"{configuration:/LinuxBatteryFilePath}\""
         },
         "Artifacts": [
           {
             "Uri": "s3://BUCKET_NAME/COMPONENT_NAME/COMPONENT_VERSION/com.example.BatteryAwareHelloWorld.zip",
             "Unarchive": "ZIP"
           }
         ]
       },
       {
         "Platform": {
           "os": "windows"
         },
         "Lifecycle": {
           "install": "py -3 -m pip install --user awsiotsdk --upgrade",
           "Run": "py -3 -u {artifacts:decompressedPath}/com.example.BatteryAwareHelloWorld/main.py \"{configuration:/BatteryThreshold}\" \"{configuration:/WindowsBatteryFilePath}\""
         },
         "Artifacts": [
           {
             "Uri": "s3://BUCKET_NAME/COMPONENT_NAME/COMPONENT_VERSION/com.example.BatteryAwareHelloWorld.zip",
             "Unarchive": "ZIP"
           }
         ]
       }
     ]
   }
   ```

------
#### [ YAML ]

   <a name="nano-command-intro"></a>Misalnya, pada sistem berbasis Linux, Anda dapat menjalankan perintah berikut untuk menggunakan GNU nano untuk membuat file.

   ```
   nano recipe.yaml
   ```

   Salin YAML berikut ke dalam file.

   ```
   ---
   RecipeFormatVersion: "2020-01-25"
   ComponentName: "COMPONENT_NAME"
   ComponentVersion: "COMPONENT_VERSION"
   ComponentDescription: "This Hello World component defers updates when the battery level is below a threshold."
   ComponentPublisher: "COMPONENT_AUTHOR"
   ComponentConfiguration:
     DefaultConfiguration:
       BatteryThreshold: 50
       LinuxBatteryFilePath: "/home/ggc_user/virtual_battery.json"
       WindowsBatteryFilePath: "C:\\Users\\ggc_user\\virtual_battery.json"
   Manifests:
     - Platform:
         os: linux
       Lifecycle:
         install: python3 -m pip install --user awsiotsdk --upgrade
         Run: python3 -u {artifacts:decompressedPath}/com.example.BatteryAwareHelloWorld/main.py "{configuration:/BatteryThreshold}" "{configuration:/LinuxBatteryFilePath}"
       Artifacts:
         - Uri: "s3://BUCKET_NAME/COMPONENT_NAME/COMPONENT_VERSION/com.example.BatteryAwareHelloWorld.zip"
           Unarchive: ZIP
     - Platform:
         os: windows
       Lifecycle:
         install: py -3 -m pip install --user awsiotsdk --upgrade
         Run: py -3 -u {artifacts:decompressedPath}/com.example.BatteryAwareHelloWorld/main.py "{configuration:/BatteryThreshold}" "{configuration:/WindowsBatteryFilePath}"
       Artifacts:
         - Uri: "s3://BUCKET_NAME/COMPONENT_NAME/COMPONENT_VERSION/com.example.BatteryAwareHelloWorld.zip"
           Unarchive: ZIP
   ```

------

   Resep ini menentukan yang berikut:
   + Parameter konfigurasi default untuk ambang baterai, jalur file baterai virtual pada perangkat inti Linux, dan jalur file baterai virtual pada perangkat inti Windows.
   + `install`Siklus hidup yang menginstal versi terbaru v2 AWS IoT Device SDK untuk Python.
   + `run`Siklus hidup yang menjalankan aplikasi Python di. `main.py`
   + Placeholder, seperti `COMPONENT_NAME` dan`COMPONENT_VERSION`, di mana CLI GDK menggantikan informasi saat membangun resep komponen.

   Untuk informasi lebih lanjut tentang resep komponen, lihat[AWS IoT Greengrass referensi resep komponen](component-recipe-reference.md).

# Langkah 3: Publikasikan komponen ke AWS IoT Greengrass layanan
<a name="publish-component-defer-updates"></a>

Di bagian ini, Anda mempublikasikan komponen Hello World ke layanan AWS IoT Greengrass cloud. Setelah komponen tersedia di layanan AWS IoT Greengrass cloud, Anda dapat menerapkannya ke perangkat inti. Anda menggunakan CLI GDK untuk mempublikasikan komponen dari komputer pengembangan Anda ke layanan cloud AWS IoT Greengrass . CLI GDK mengunggah resep dan artefak komponen untuk Anda.

**Untuk mempublikasikan komponen Hello World ke AWS IoT Greengrass layanan**

1. Jalankan perintah berikut untuk membangun komponen menggunakan CLI GDK. [Perintah pembuatan komponen](greengrass-development-kit-cli-component.md#greengrass-development-kit-cli-component-build) membuat resep dan artefak berdasarkan file konfigurasi CLI GDK. Dalam proses ini, CLI GDK membuat file ZIP yang berisi kode sumber komponen.

   ```
   gdk component build
   ```

   Anda akan melihat pesan yang mirip dengan contoh berikut ini.

   ```
   [2022-04-28 11:20:16] INFO - Getting project configuration from gdk-config.json
   [2022-04-28 11:20:16] INFO - Found component recipe file 'recipe.yaml' in the  project directory.
   [2022-04-28 11:20:16] INFO - Building the component 'com.example.BatteryAwareHelloWorld' with the given project configuration.
   [2022-04-28 11:20:16] INFO - Using 'zip' build system to build the component.
   [2022-04-28 11:20:16] WARNING - This component is identified as using 'zip' build system. If this is incorrect, please exit and specify custom build command in the 'gdk-config.json'.
   [2022-04-28 11:20:16] INFO - Zipping source code files of the component.
   [2022-04-28 11:20:16] INFO - Copying over the build artifacts to the greengrass component artifacts build folder.
   [2022-04-28 11:20:16] INFO - Updating artifact URIs in the recipe.
   [2022-04-28 11:20:16] INFO - Creating component recipe in 'C:\Users\finthomp\greengrassv2\com.example.BatteryAwareHelloWorld\greengrass-build\recipes'.
   ```

1. Jalankan perintah berikut untuk mempublikasikan komponen ke layanan AWS IoT Greengrass cloud. [Perintah component publish](greengrass-development-kit-cli-component.md#greengrass-development-kit-cli-component-publish) mengunggah artefak file ZIP komponen ke bucket S3. Kemudian, ia memperbarui URI S3 file ZIP dalam resep komponen dan mengunggah resep ke layanan. AWS IoT Greengrass Dalam proses ini, CLI GDK memeriksa versi komponen Hello World apa yang sudah tersedia di AWS IoT Greengrass layanan cloud, sehingga dapat memilih versi patch berikutnya setelah versi itu. Jika komponen belum ada, CLI GDK menggunakan versi. `1.0.0`

   ```
   gdk component publish
   ```

   Anda akan melihat pesan yang mirip dengan contoh berikut ini. Output memberi tahu Anda versi komponen yang dibuat CLI GDK.

   ```
   [2022-04-28 11:20:29] INFO - Getting project configuration from gdk-config.json
   [2022-04-28 11:20:29] INFO - Found component recipe file 'recipe.yaml' in the  project directory.
   [2022-04-28 11:20:29] INFO - Found credentials in shared credentials file: ~/.aws/credentials
   [2022-04-28 11:20:30] INFO - No private version of the component 'com.example.BatteryAwareHelloWorld' exist in the account. Using '1.0.0' as the next version to create.
   [2022-04-28 11:20:30] INFO - Publishing the component 'com.example.BatteryAwareHelloWorld' with the given project configuration.
   [2022-04-28 11:20:30] INFO - Uploading the component built artifacts to s3 bucket.
   [2022-04-28 11:20:30] INFO - Uploading component artifacts to S3 bucket: greengrass-component-artifacts-us-west-2-123456789012. If this is your first time using this bucket, add the 's3:GetObject' permission to each core device's token exchange role to allow it to download the component artifacts. For more information, see https://docs.aws.amazon.com/greengrass/v2/developerguide/device-service-role.html.
   [2022-04-28 11:20:30] INFO - Not creating an artifacts bucket as it already exists.
   [2022-04-28 11:20:30] INFO - Updating the component recipe com.example.BatteryAwareHelloWorld-1.0.0.
   [2022-04-28 11:20:31] INFO - Creating a new greengrass component com.example.BatteryAwareHelloWorld-1.0.0
   [2022-04-28 11:20:31] INFO - Created private version '1.0.0' of the component in the account.'com.example.BatteryAwareHelloWorld'.
   ```

1. Salin nama bucket S3 dari output. Anda menggunakan nama bucket nanti untuk memungkinkan perangkat inti mengunduh artefak komponen dari bucket ini.

1. (Opsional) Lihat komponen di AWS IoT Greengrass konsol untuk memverifikasi bahwa komponen tersebut berhasil diunggah. Lakukan hal-hal berikut:

   1. Pada menu navigasi [konsol AWS IoT Greengrass](https://console.aws.amazon.com/greengrass) tersebut, pilih **Komponen**.

   1. Pada halaman **Components**, pilih tab **My components**, lalu pilih **com.example.BatteryAwareHelloWorld**.

      Pada halaman ini, Anda dapat melihat resep komponen dan informasi lain tentang komponen.

1. <a name="core-device-allow-s3-bucket-access-console-intro-1"></a>Izinkan perangkat inti mengakses artefak komponen dalam bucket S3.

   <a name="core-device-allow-s3-bucket-access-console-intro-2"></a>Setiap perangkat [inti memiliki peran IAM perangkat inti](device-service-role.md) yang memungkinkannya berinteraksi dengan AWS IoT dan mengirim log ke AWS Cloud. Peran perangkat ini tidak mengizinkan akses ke bucket S3 secara default, sehingga Anda harus membuat dan melampirkan kebijakan yang memungkinkan perangkat inti mengambil artefak komponen dari bucket S3.

   <a name="core-device-allow-s3-bucket-access-console-intro-3"></a>Jika peran perangkat Anda sudah memungkinkan akses ke bucket S3, Anda dapat melewati langkah ini. Jika tidak, buat kebijakan IAM yang memungkinkan akses dan melampirkannya pada peran, sebagai berikut:

   1. <a name="core-device-allow-s3-bucket-access-console-step-1"></a>Di menu navigasi [konsol IAM](https://console.aws.amazon.com/iam), pilih **Kebijakan**, lalu pilih **Buat kebijakan**.

   1. Pada tab **JSON**, ganti placeholder konten dengan kebijakan berikut. Ganti *greengrass-component-artifacts-us-west-2-123456789012* dengan nama bucket S3 tempat CLI GDK mengunggah artefak komponen.

      Misalnya, jika Anda menentukan **greengrass-component-artifacts** dan **us-west-2** dalam file konfigurasi CLI GDK, dan ID Akun AWS **123456789012** Anda, CLI GDK menggunakan bucket S3 bernama. `greengrass-component-artifacts-us-west-2-123456789012`

------
#### [ JSON ]

****  

      ```
      {
        "Version":"2012-10-17",		 	 	 
        "Statement": [
          {
            "Effect": "Allow",
            "Action": [
              "s3:GetObject"
            ],
            "Resource": "arn:aws:s3:::greengrass-component-artifacts-us-west-2-123456789012/*"
          }
        ]
      }
      ```

------

   1. <a name="core-device-allow-s3-bucket-access-console-step-3"></a>Pilih **Berikutnya**.

   1. <a name="core-device-allow-s3-bucket-access-console-step-4"></a>Di **bagian Detail kebijakan**, untuk **Nama**, masukkan**MyGreengrassV2ComponentArtifactPolicy**.

   1. <a name="core-device-allow-s3-bucket-access-console-step-5"></a>Pilih **Buat kebijakan**.

   1. <a name="core-device-allow-s3-bucket-access-console-step-6"></a>Di menu navigasi [konsol IAM](https://console.aws.amazon.com/iam), pilih **Peran**, lalu pilih nama peran untuk perangkat inti. Anda menentukan nama peran ini saat menginstal perangkat lunak AWS IoT Greengrass Core. Jika Anda tidak menentukan nama, defaultnya adalah`GreengrassV2TokenExchangeRole`.

   1. <a name="core-device-allow-s3-bucket-access-console-step-7"></a>Di bawah **Izin**, pilih **Tambahkan izin**, lalu pilih **Lampirkan** kebijakan.

   1. <a name="core-device-allow-s3-bucket-access-console-step-8"></a>Pada halaman **Tambahkan izin**, pilih kotak centang di samping `MyGreengrassV2ComponentArtifactPolicy` kebijakan yang Anda buat, lalu pilih **Tambahkan izin**.

# Langkah 4: Menyebarkan dan menguji komponen pada perangkat inti
<a name="deploy-component-defer-updates"></a>

Di bagian ini, Anda menyebarkan komponen ke perangkat inti untuk menguji fungsinya. Pada perangkat inti, Anda membuat file tingkat baterai virtual untuk meniru baterai nyata. Kemudian, Anda membuat penerapan tambahan dan mengamati file log komponen pada perangkat inti untuk melihat komponen menunda dan mengakui pembaruan.

**Untuk menyebarkan dan menguji komponen Hello World yang menunda pembaruan**

1. Gunakan editor teks untuk membuat file tingkat baterai virtual. File ini meniru baterai sungguhan.
   + Pada perangkat inti Linux, buat file bernama`/home/ggc_user/virtual_battery.json`. Jalankan editor teks dengan `sudo` izin.
   + Pada perangkat inti Windows, buat file bernama`C:\Users\ggc_user\virtual_battery.json`. Jalankan editor teks sebagai administrator.

   <a name="nano-command-intro"></a>Misalnya, pada sistem berbasis Linux, Anda dapat menjalankan perintah berikut untuk menggunakan GNU nano untuk membuat file.

   ```
   sudo nano /home/ggc_user/virtual_battery.json
   ```

   Salin JSON berikut ke dalam file.

   ```
   {
     "battery_level": 50
   }
   ```

1. Menyebarkan komponen Hello World ke perangkat inti. Lakukan hal-hal berikut:

   1. Pada menu navigasi [konsol AWS IoT Greengrass](https://console.aws.amazon.com/greengrass) tersebut, pilih **Komponen**.

   1. Pada halaman **Components**, pilih tab **My components**, lalu pilih **com.example.BatteryAwareHelloWorld**.

   1. Pada halaman **com.example.BatteryAwareHelloWorld** pilih **Deploy**.

   1. <a name="deploy-component-choose-deployment-step"></a>**Dari **Tambahkan ke penerapan**, pilih penerapan yang ada untuk direvisi, atau pilih untuk membuat penerapan baru, lalu pilih Berikutnya.**

   1. <a name="deploy-component-choose-target-step"></a>Jika Anda memilih untuk membuat penerapan baru, pilih perangkat inti target atau grup hal untuk penerapan. Pada halaman **Tentukan target**, di bawah **target Deployment**, pilih perangkat inti atau grup benda, lalu pilih **Berikutnya**.

   1. Pada halaman **Pilih komponen**, verifikasi bahwa **com.example.BatteryAwareHelloWorld**komponen dipilih, pilih **Berikutnya**.

   1. Pada halaman **Configure components**, pilih **com.example.BatteryAwareHelloWorld**, lalu lakukan hal berikut:

      1. Pilih **Konfigurasi komponen**.

      1. Dalam **konfigurasi com.example.BatteryAwareHelloWorld** modal, di bawah **Configuration update**, di **Configuration to merge**, masukkan update konfigurasi berikut.

         ```
         {
           "BatteryThreshold": 70
         }
         ```

      1. Pilih **Konfirmasi** untuk menutup modal, lalu pilih **Berikutnya**.

   1. Pada halaman **Konfirmasi pengaturan lanjutan**, di bagian **Kebijakan penerapan**, di bawah **Kebijakan pembaruan komponen**, konfirmasikan bahwa **komponen Beri tahu** dipilih. **Notify komponen** dipilih secara default saat Anda membuat penerapan baru.

   1. <a name="deploy-component-review-and-deploy-step"></a>Di halaman **Tinjau**, pilih **Deploy**.

      Penyebaran dapat memakan waktu hingga satu menit untuk diselesaikan.

1. Perangkat lunak AWS IoT Greengrass Core menyimpan stdout dari proses komponen ke file log di folder. `logs` Jalankan perintah berikut untuk memverifikasi bahwa komponen Hello World berjalan dan mencetak pesan status.

------
#### [ Linux or Unix ]

   ```
   sudo tail -f /greengrass/v2/logs/com.example.BatteryAwareHelloWorld.log
   ```

------
#### [ Windows Command Prompt (CMD) ]

   ```
   type C:\greengrass\v2\logs\com.example.BatteryAwareHelloWorld.log
   ```

------
#### [ PowerShell ]

   ```
   gc C:\greengrass\v2\logs\com.example.BatteryAwareHelloWorld.log -Tail 10 -Wait
   ```

------

   Anda akan melihat pesan yang mirip dengan contoh berikut ini.

   ```
   Hello, World! Battery level (50) is below threshold (70), so the component will defer updates.
   ```
**catatan**  
Jika file tidak ada, penerapan mungkin belum lengkap. Jika file tidak ada dalam waktu 30 detik, penerapan kemungkinan gagal. Ini dapat terjadi jika perangkat inti tidak memiliki izin untuk mengunduh artefak komponen dari bucket S3, misalnya. Jalankan perintah berikut untuk melihat file log perangkat lunak AWS IoT Greengrass inti. File ini mencakup log dari layanan deployment perangkat inti Greengrass.  

   ```
   sudo tail -f /greengrass/v2/logs/greengrass.log
   ```

   ```
   type C:\greengrass\v2\logs\greengrass.log
   ```
<a name="windows-cmd-type-observe-logs"></a>`type`Perintah menulis konten file ke terminal. Jalankan perintah ini beberapa kali untuk mengamati perubahan dalam file.

   ```
   gc C:\greengrass\v2\logs\greengrass.log -Tail 10 -Wait
   ```

1. Buat penerapan baru ke perangkat inti untuk memverifikasi bahwa komponen menunda pembaruan. Lakukan hal-hal berikut:

   1. Di menu navigasi [AWS IoT Greengrass konsol](https://console.aws.amazon.com/greengrass), pilih **Deployment**.

   1. Pilih penerapan yang Anda buat atau revisi sebelumnya.

   1. Pada halaman penyebaran, pilih **Revisi**.

   1. Dalam modal **Revise deployment**, pilih **Revise** deployment.

   1. Pilih **Berikutnya** di setiap langkah, lalu pilih **Deploy**.

1. Jalankan perintah berikut untuk melihat log komponen lagi, dan verifikasi bahwa itu menunda pembaruan.

------
#### [ Linux or Unix ]

   ```
   sudo tail -f /greengrass/v2/logs/com.example.BatteryAwareHelloWorld.log
   ```

------
#### [ Windows Command Prompt (CMD) ]

   ```
   type C:\greengrass\v2\logs\com.example.BatteryAwareHelloWorld.log
   ```

------
#### [ PowerShell ]

   ```
   gc C:\greengrass\v2\logs\com.example.BatteryAwareHelloWorld.log -Tail 10 -Wait
   ```

------

   Anda akan melihat pesan yang mirip dengan contoh berikut ini. Komponen menunda pembaruan selama 30 detik, sehingga komponen mencetak pesan ini berulang kali.

   ```
   Deferred update for deployment 50722a95-a05f-4e2a-9414-da80103269aa.
   ```

1. Gunakan editor teks untuk mengedit file tingkat baterai virtual dan mengubah tingkat baterai ke nilai di atas ambang batas, sehingga penerapan dapat dilanjutkan.
   + Pada perangkat inti Linux, edit file bernama`/home/ggc_user/virtual_battery.json`. Jalankan editor teks dengan `sudo` izin.
   + Pada perangkat inti Windows, edit file bernama`C:\Users\ggc_user\virtual_battery.json`. Jalankan editor teks sebagai administrator.

   <a name="nano-command-intro"></a>Misalnya, pada sistem berbasis Linux, Anda dapat menjalankan perintah berikut untuk menggunakan GNU nano untuk membuat file.

   ```
   sudo nano /home/ggc_user/virtual_battery.json
   ```

   Ubah level baterai menjadi`80`.

   ```
   {
     "battery_level": 80
   }
   ```

1. Jalankan perintah berikut untuk melihat log komponen lagi, dan verifikasi bahwa ia mengakui pembaruan.

------
#### [ Linux or Unix ]

   ```
   sudo tail -f /greengrass/v2/logs/com.example.BatteryAwareHelloWorld.log
   ```

------
#### [ Windows Command Prompt (CMD) ]

   ```
   type C:\greengrass\v2\logs\com.example.BatteryAwareHelloWorld.log
   ```

------
#### [ PowerShell ]

   ```
   gc C:\greengrass\v2\logs\com.example.BatteryAwareHelloWorld.log -Tail 10 -Wait
   ```

------

   Anda akan melihat pesan yang mirip dengan contoh berikut.

   ```
   Hello, World! Battery level (80) is above threshold (70), so the component will acknowledge updates.
   Acknowledged update for deployment f9499eb2-4a40-40a7-86c1-c89887d859f1.
   ```

Anda telah menyelesaikan tutorial ini. Komponen Hello World menunda atau mengakui pembaruan berdasarkan tingkat baterai perangkat inti. Untuk informasi selengkapnya tentang topik yang dieksplorasi pada tutorial ini, lihat berikut ini:
+ [Kembangkan AWS IoT Greengrass komponen](develop-greengrass-components.md)
+ [Menyebarkan AWS IoT Greengrass komponen ke perangkat](manage-deployments.md)
+ [Gunakan AWS IoT Device SDK untuk berkomunikasi dengan inti Greengrass, komponen lain, dan AWS IoT CoreBerkomunikasi dengan inti Greengrass, komponen lain, dan AWS IoT Core](interprocess-communication.md)
+ [AWS IoT Greengrass Kit Pengembangan Antarmuka Baris Perintah](greengrass-development-kit-cli.md)