

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# チュートリアル: コンポーネントの更新を延期する Greengrass コンポーネントを開発する
<a name="defer-component-updates-tutorial"></a>

このチュートリアルを完了すると、無線デプロイによる更新を延期するコンポーネントを開発することができます。デバイスに更新をデプロイするときに、次のような条件に基づいて更新を遅らせる必要が生じる場合があります。
+ デバイスのバッテリー残量が少ない。
+ デバイスが中断できないプロセスかジョブを実行中である。
+ デバイスのインターネット接続が制限されているか、コストが高い。

**注記**  
*コンポーネント*は、 AWS IoT Greengrass コアデバイスで実行されるソフトウェアモジュールです。コンポーネントを使用すると、複雑なアプリケーションを個別のビルディングブロックとして作成し管理することができ、Greengrass コアデバイス間で再利用することができます。

このチュートリアルでは、以下の作業を行います。

1. Greengrass Development Kit CLI (GDK CLI) を開発用コンピュータにインストールします。GDK CLI は、カスタム Greengrass コンポーネントの開発に役立つ機能を提供します。

1. コアデバイスのバッテリレベルがしきい値を下回ったときに、コンポーネントの更新を延期する Hello World コンポーネントを開発します。このコンポーネントは、[SubscribeToComponentUpdates](ipc-component-lifecycle.md#ipc-operation-subscribetocomponentupdates) IPC 操作を使用して更新通知にサブスクライブします。通知を受信すると、バッテリ残量がカスタマイズ可能なしきい値より低いかどうかを確認します。バッテリー残量がしきい値を下回っている場合は、[DeferComponentUpdate](ipc-component-lifecycle.md#ipc-operation-defercomponentupdate) IPC 操作を使用して、更新を 30 秒間遅らせます。このコンポーネントは、GDK CLI を使用して開発用コンピュータで開発します。
**注記**  
このコンポーネントは、実際のバッテリを模倣するために、コアデバイスで作成したファイルからバッテリレベルを読み取ります。そのため、このチュートリアルはバッテリのないコアデバイスでも実行できます。

1. そのコンポーネントを AWS IoT Greengrass サービスに発行します。

1. そのコンポーネント AWS クラウド を から Greengrass コアデバイスにデプロイしてテストします。次に、コアデバイスの仮想バッテリレベルを変更し、別のデプロイを作成して、バッテリレベルが低いときにコアデバイスが更新を延期する様子を確認します。

このチュートリアルは 20～30 分を要します。

# 前提条件
<a name="defer-component-updates-tutorial-prerequisites"></a>

このチュートリアルを完了するには、以下が必要です。
+ AWS アカウント。アカウントをお持ちでない場合は、「[のセットアップ AWS アカウント](setting-up.md#set-up-aws-account)」を参照してください。
+ 管理者権限を持つ AWS Identity and Access Management (IAM) ユーザー。
+ インターネット接続が可能な Greengrass コアデバイス。コアデバイスの設定方法の詳細については、「[AWS IoT Greengrass コアデバイスのセットアップ](setting-up.md)」を参照してください。
  + デバイス上のすべてのユーザーに [Python](https://www.python.org/downloads/) 3.6 以降がインストールされており、`PATH` 環境変数に追加されていること。Windows の場合は、すべてのユーザーに対して Python Launcher for Windows ランチャーがインストールされている必要があります。
**重要**  <a name="windows-core-device-python-installation"></a>
Windows では、デフォルトでは Python がすべてのユーザーにインストールされません。Python をインストールするときには、インストールをカスタマイズして、AWS IoT Greengrass Core ソフトウェアが Python スクリプトを実行するように設定する必要があります。たとえば、グラフィカル Python インストーラを使用する場合には、次の操作を行います。  
**Install launcher for all users (recommended)** (すべてのユーザーにランチャーをインストールする (推奨)) を選択します。
を選択します。。**Customize installation**
**Next** を選択します。
を選択します。。**Install for all users**
を選択します。。**Add Python to environment variables**
**[インストール]** を選択します。
詳細については、「*Python 3 ドキュメント*」の「[Windows で Python を使う](https://docs.python.org/3/using/windows.html)」を参照してください。
+ インターネットに接続された Windows、macOS、または Unix のような開発用コンピュータ。
  + [Python](https://www.python.org/downloads/) 3.6 以降が開発コンピュータにインストールされていること。
  + [Git](https://git-scm.com/) が開発コンピュータにインストールされていること。
  + <a name="development-component-aws-cli-prerequisite"></a>開発コンピュータに AWS Command Line Interface (AWS CLI) がインストールされており、認証情報が設定されていること。詳細については、「*AWS Command Line Interface ユーザーガイド*」の「[Installing, updating, and uninstalling the AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html)」と「[Configuring settings for the AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html)」を参照してください。
**注記**  
Raspberry Pi または別の 32 ビット ARM デバイスを使用する場合は、AWS CLI V1.AWS CLI をインストールします。V2 は 32 ビット ARM デバイスでは利用できません。詳細については、「[AWS CLI バージョン 1 のインストール、更新、およびアンインストール](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv1.html)」を参照してください。

# ステップ 1: Greengrass Development Kit CLI をインストールする
<a name="install-gdk-cli-defer-updates"></a>

[Greengrass Development Kit CLI (GDK CLI)](greengrass-development-kit-cli.md) は、カスタム Greengrass コンポーネントの開発に役立つ機能を提供します。GDK CLI を使用して、カスタムコンポーネントを作成、ビルドおよびパブリッシュできます。

GDK CLI を開発コンピュータにインストールしていない場合は、次の手順を実行してインストールします。

**GDK CLI の最新バージョンをインストールする**

1. 開発コンピュータ上で下記のコマンドを実行し、[GitHub リポジトリ](https://github.com/aws-greengrass/aws-greengrass-gdk-cli)から 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>GDK CLI が正常にインストールされたことを確認するには、次のコマンドを実行します。

   ```
   gdk --help
   ```

   `gdk` コマンドが見つからない場合は、コマンドのフォルダを PATH に追加してください。
   + Linux デバイスの場合、`/home/MyUser/.local/bin` を PATH に追加して、*MyUser* をユーザーの名前に置き換えます。
   + Windows デバイスの場合、`PythonPath\\Scripts` を PATH に追加して、*PythonPath* をデバイスの Python フォルダへのパスに置き換えます。

# ステップ 2: 更新を延期するコンポーネントを開発する
<a name="develop-component-defer-updates"></a>

このセクションでは、コアデバイスのバッテリレベルが、コンポーネントをデプロイしたときに設定したしきい値を下回ったときに、コンポーネントの更新を延期する Hello World コンポーネントを Python で開発します。このコンポーネントでは、v2 for Python AWS IoT Device SDK で[プロセス間通信 (IPC) インターフェイス](interprocess-communication.md)を使用します。[SubscribeToComponentUpdates](ipc-component-lifecycle.md#ipc-operation-subscribetocomponentupdates) IPC 操作を使用して、コアデバイスがデプロイを受信したときに通知を受け取ります。次に、[DeferComponentUpdate](ipc-component-lifecycle.md#ipc-operation-defercomponentupdate) IPC オペレーションを使用して、デバイスのバッテリー残量に基づいて更新を延期または承認します。

**更新を延期する Hello World コンポーネントを開発するには**

1. 開発コンピュータ上に、コンポーネントのソースコード用のフォルダを作成します。

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

1. テキストエディタを使用して `gdk-config.json` という名前のファイルを作成します。GDK CLI は `gdk-config.json` という名の [GDK CLI 設定ファイル](gdk-cli-configuration-file.md)から読み込むことで、コンポーネントをビルドおよびパブリッシュします。この設定ファイルは、コンポーネントフォルダのルートにあります。

   <a name="nano-command-intro"></a>例えば、Linux ベースのシステムでは、次のコマンドを実行し、GNU nano を使用してファイルを作成できます。

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

   次の JSON をファイルにコピーします。
   + *Amazon* を自分の名前に置き換えます。
   + *us-west-2* を、コアデバイスが動作 AWS リージョン する に置き換えます。GDK CLI がこのコンポーネントをこの AWS リージョンにパブリッシュします。
   + *greengrass-component-artifacts* を使用する S3 バケットプレフィックスに置き換えます。GDK CLI を使用してコンポーネントを発行すると、GDK CLI はコンポーネントのアーティファクトを、この値、、 AWS リージョンおよび AWS アカウント ID から名前が形成された S3 バケットにアップロードします`bucketPrefix-region-accountId`。

     たとえば、 **greengrass-component-artifacts**と を指定し**us-west-2**、 AWS アカウント ID が の場合**123456789012**、GDK CLI は という名前の S3 バケットを使用します`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"
   }
   ```

   設定ファイルは、以下を指定します。
   + GDK CLI が Greengrass コンポーネントをクラウドサービスに AWS IoT Greengrass 公開するときに使用するバージョン。 は、 AWS IoT Greengrass クラウドサービスで利用可能な最新バージョンの後に次のパッチバージョンを選択するように`NEXT_PATCH`指定します。コンポーネントに AWS IoT Greengrass クラウドサービスのバージョンがまだない場合、GDK CLI は を使用します`1.0.0`。
   + コンポーネントのビルドシステム。`zip` ビルドシステムを使用した場合、GDK CLI はコンポーネントのソースを ZIP ファイルにパッケージ化して、コンポーネントの単一のアーティファクトにします。
   + GDK CLI AWS リージョン が Greengrass コンポーネントを発行する 。
   + GDK CLI がコンポーネントのアーティファクトをアップロードする場所となる S3 バケットのプレフィックス。

1. テキストエディタを使用して、`main.py` という名前のファイルにコンポーネントのソースコードを作成します。

   <a name="nano-command-intro"></a>例えば、Linux ベースのシステムでは、次のコマンドを実行し、GNU nano を使用してファイルを作成できます。

   ```
   nano main.py
   ```

   ファイルに次の Python コードをコピーします。

   ```
   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()
   ```

   この Python アプリケーションは次を実行します。
   + 後でコアデバイスで作成する仮想バッテリレベルファイルから、コアデバイスのバッテリレベルを読み取ります。この仮想バッテリーレベルファイルは実際のバッテリーを模倣しているため、バッテリーのないコアデバイスでもこのチュートリアルを完了できます。
   + バッテリのしきい値と、仮想バッテリレベルファイルへのパスに対するコマンドライン引数を読み取ります。コンポーネント recipe は、設定パラメータに基づいてこれらのコマンドライン引数を設定するため、コンポーネントをデプロイするときにこれらの値はカスタマイズできます。
   + vV2の IPC クライアント V2 を使用して AWS IoT Greengrass Core ソフトウェアと通信します。 [AWS IoT Device SDK](https://github.com/aws/aws-iot-device-sdk-python-v2)オリジナルの IPC クライアントと比較して、IPC クライアント V2 では、カスタムコンポーネントで IPC を使用するために記述する必要があるコードの量が減っています。
   + [SubscribeToComponentUpdates](ipc-component-lifecycle.md#ipc-operation-subscribetocomponentupdates) IPC 操作を使用して、更新通知にサブスクライブします。 AWS IoT Greengrass Core ソフトウェアは、各デプロイの前後に通知を送信します。コンポーネントは、通知を受信するたびに次の関数を呼び出します。通知が今後のデプロイに関するものである場合、コンポーネントはバッテリ残量がしきい値より低いかどうかを確認します。バッテリ残量がしきい値を下回っている場合は、コンポーネントは [DeferComponentUpdate](ipc-component-lifecycle.md#ipc-operation-defercomponentupdate) IPC 操作を使用して、更新を 30 秒間遅らせます。それ以外の、バッテリ残量がしきい値を下回っていない場合には、コンポーネントは更新を承認し、更新が続行されます。

     ```
     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()
     ```
**注記**  
 AWS IoT Greengrass Core ソフトウェアはローカルデプロイの更新通知を送信しないため、 AWS IoT Greengrass クラウドサービスを使用してこのコンポーネントをデプロイしてテストします。

1. テキストエディタを使用して、 `recipe.json` または `recipe.yaml` という名前のファイルにコンポーネント recipe を作成します。コンポーネント*レシピ*は、コンポーネントのメタデータ、デフォルト設定パラメータ、プラットフォームに固有のライフサイクルスクリプトを定義します。

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

   <a name="nano-command-intro"></a>例えば、Linux ベースのシステムでは、次のコマンドを実行し、GNU nano を使用してファイルを作成できます。

   ```
   nano recipe.json
   ```

   次の JSON をファイルにコピーします。

   ```
   {
     "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>例えば、Linux ベースのシステムでは、次のコマンドを実行し、GNU nano を使用してファイルを作成できます。

   ```
   nano recipe.yaml
   ```

   ファイルに次の YAML をコピーします。

   ```
   ---
   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
   ```

------

   この recipe は以下を指定します。
   + バッテリのしきい値、Linux コアデバイスの仮想バッテリファイルパス、および Windows コアデバイスの仮想バッテリファイルパスに対するデフォルト設定パラメータ。
   +  AWS IoT Device SDK v2 for Python の最新バージョンをインストールする `install` ライフサイクル。
   + `main.py` で Python アプリケーションを実行する `run` ライフサイクル。
   + `COMPONENT_NAME` および `COMPONENT_VERSION` などのプレースホルダ。GDK CLI がコンポーネント recipe を構築するときにこの情報を置き換えます。

   コンポーネント recipe の詳細については、「[AWS IoT Greengrass コンポーネントレシピリファレンス](component-recipe-reference.md)」を参照してください。

# ステップ 3: コンポーネントを AWS IoT Greengrass サービスに発行する
<a name="publish-component-defer-updates"></a>

このセクションでは、Hello World コンポーネントを AWS IoT Greengrass クラウドサービスに公開します。 AWS IoT Greengrass クラウドサービスでコンポーネントが利用可能になったら、コアデバイスにデプロイできます。GDK CLI を使用して、開発用コンピュータから AWS IoT Greengrass クラウドサービスにコンポーネントを発行します。GDK CLI が、ユーザーに代わってコンポーネントの recipe とアーティファクトをアップロードします。

**Hello World コンポーネントを AWS IoT Greengrass サービスに発行するには**

1. GDK CLI を使用して次のコマンドを実行し、コンポーネントを構築します。[コンポーネントビルドコマンド](greengrass-development-kit-cli-component.md#greengrass-development-kit-cli-component-build) は、GDK CLI 設定ファイルに基づいて、recipe とアーティファクトを作成します。このプロセスでは、GDK CLI が、コンポーネントのソースコードが含まれる ZIP ファイルを作成します。

   ```
   gdk component build
   ```

   次の例に示すようなメッセージが表示されます。

   ```
   [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. 次のコマンドを実行して、コンポーネントを AWS IoT Greengrass クラウドサービスに発行します。[コンポーネントパブリッシュコマンド](greengrass-development-kit-cli-component.md#greengrass-development-kit-cli-component-publish)は、S3 バケットにコンポーネントの ZIP ファイルのアーティファクトをアップロードします。その後、コンポーネント recipe 内の ZIP ファイルの S3 URI を更新し、recipe を AWS IoT Greengrass サービスにアップロードします。このプロセスでは、GDK CLI は、Hello World コンポーネントのどのバージョンが AWS IoT Greengrass クラウドサービスで既に使用可能であるかをチェックするため、そのバージョンの次のパッチバージョンを選択できます。コンポーネントがまだない場合は、GDK CLI は `1.0.0` バージョンを使用します。

   ```
   gdk component publish
   ```

   次の例に示すようなメッセージが表示されます。出力には、GDK CLI が作成したコンポーネントのバージョンが示されます。

   ```
   [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. S3 バケット名を出力からコピーします。後ほど、このバケット名を使用して、コアデバイスがこのバケットからコンポーネントアーティファクトをダウンロードできるようにします。

1. (オプション) AWS IoT Greengrass コンソールでコンポーネントを表示して、正常にアップロードされたことを確認します。以下の操作を実行します。

   1. [AWS IoT Greengrass コンソール](https://console.aws.amazon.com/greengrass)のナビゲーションメニューで、**[Components]** (コンポーネント) を選択します。

   1. **[Components]** (コンポーネント) ページで、**[My components]** (マイコンポーネント) タブを選択し、次に **com.example.BatteryAwareHelloWorld** を選択します。

      このページには、コンポーネントの recipe と、コンポーネントに関するその他の情報が表示されます。

1. <a name="core-device-allow-s3-bucket-access-console-intro-1"></a>コアデバイスが S3 バケット内のコンポーネントアーティファクトにアクセスすることを許可します。

   <a name="core-device-allow-s3-bucket-access-console-intro-2"></a>各コアデバイスには、 とやり取り AWS IoT して AWS クラウドにログを送信できるようにする[コアデバイス IAM ロール](device-service-role.md)があります。このデバイスロールは、デフォルトでは S3 バケットへのアクセスを許可しないため、コアデバイスが S3 バケットからコンポーネントアーティファクトを取得できるようにするポリシーを作成して、アタッチする必要があります。

   <a name="core-device-allow-s3-bucket-access-console-intro-3"></a>デバイスのロールで S3 バケットへのアクセスが既に許可されている場合は、このステップを省略できます。そうでない場合は、次に示す方法で、アクセスを許可する IAM ポリシーを作成し、ロールにアタッチします。

   1. <a name="core-device-allow-s3-bucket-access-console-step-1"></a>[[IAM console]](https://console.aws.amazon.com/iam) (IAM コンソール) ナビゲーションメニューで、**[Policies]** (ポリシー) を選択し、**[Create policy]** (ポリシーの作成) を選択します。

   1. **JSON** タブで、プレースホルダーコンテンツを以下のポリシーに置き換えます。*greengrass-component-artifacts-us-west-2-123456789012* を、GDK CLI がコンポーネントのアーティファクトをアップロードした S3 バケットの名前に置き換えます。

      例えば、GDK CLI の設定ファイルで **greengrass-component-artifacts** および **us-west-2** を指定し、 AWS アカウント ID が **123456789012** の場合、GDK CLI は `greengrass-component-artifacts-us-west-2-123456789012` という名前の S3 バケットを使用します。

------
#### [ 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>[**次へ**] を選択します。

   1. <a name="core-device-allow-s3-bucket-access-console-step-4"></a>**[ポリシーの詳細セクション]** で、**[名前]** に「**MyGreengrassV2ComponentArtifactPolicy**」と入力します。

   1. <a name="core-device-allow-s3-bucket-access-console-step-5"></a>[**Create policy**] (ポリシーの作成) を選択します。

   1. <a name="core-device-allow-s3-bucket-access-console-step-6"></a>[[IAM console]](https://console.aws.amazon.com/iam) (IAM コンソール) ナビゲーションメニューで、**[Role]** (ロール) をクリックし、コアデバイスのロールの名前を選択します。 AWS IoT Greengrass Core ソフトウェアのインストール時にこのロール名を指定しました。名前を指定していない場合、デフォルトで `GreengrassV2TokenExchangeRole` が設定されます。

   1. <a name="core-device-allow-s3-bucket-access-console-step-7"></a>**[Permissions]** (アクセス許可) タブを選択し、**[Add permissions]** (アクセス許可の追加) を選択してから、**[Attach policies]** (ポリシーの添付) を選択します。

   1. <a name="core-device-allow-s3-bucket-access-console-step-8"></a>**[アクセス許可の追加]** ページで、作成した `MyGreengrassV2ComponentArtifactPolicy` ポリシーの横にあるチェックボックスを選択し、**[アクセス許可の追加]** を選択します。

# ステップ 4: デバイス上でコンポーネントをデプロイしてテストする
<a name="deploy-component-defer-updates"></a>

このセクションでは、コンポーネントをコアデバイスにデプロイして、その機能をテストします。コアデバイスでは、実際のバッテリーを模倣する仮想バッテリレベルファイルを作成します。次に、別のデプロイを作成し、コアデバイス上のコンポーネントログファイルを確認して、コンポーネントの更新の延期と承認を確認します。

**更新を延期する Hello World コンポーネントをデプロイしてテストするには**

1. テキストエディタを使用して、仮想バッテリレベルファイルを作成します。このファイルは実際のバッテリーを模倣しています。
   + Linux コアデバイスの場合は、`/home/ggc_user/virtual_battery.json` という名前のファイルを作成します。`sudo` の権限でテキストエディタを実行します。
   + Windows コアデバイスの場合は、`C:\Users\ggc_user\virtual_battery.json` という名前のファイルを作成します。管理者としてテキストエディタを実行します。

   <a name="nano-command-intro"></a>例えば、Linux ベースのシステムでは、次のコマンドを実行し、GNU nano を使用してファイルを作成できます。

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

   次の JSON をファイルにコピーします。

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

1. Hello World コンポーネントをコアデバイスにデプロイします。以下の操作を実行します。

   1. [AWS IoT Greengrass コンソール](https://console.aws.amazon.com/greengrass)のナビゲーションメニューで、**[Components]** (コンポーネント) を選択します。

   1. **[Components]** (コンポーネント) ページで、**[My components]** (マイコンポーネント) タブを選択し、次に **com.example.BatteryAwareHelloWorld** を選択します。

   1. **com.example.BatteryAwareHelloWorld** ページで、**[Deploy]** (デプロイ) を選択します。

   1. <a name="deploy-component-choose-deployment-step"></a>**[Add to deployment]** (デプロイに追加) で、改訂する既存のデプロイを選択するか、新しいデプロイを作成することを選択して、**[Next]** (次へ) を選択します。

   1. <a name="deploy-component-choose-target-step"></a>新しいデプロイの作成を選択した場合、デプロイのターゲットコアデバイスまたはモノグループを選択します。リポジトリの **[Specify target]** (ターゲットを指定) ページの、**[Deployment target]** (ターゲットのデプロイ) で、コアデバイスまたはモノグループを選択し、**[Next]** (次へ) を選択します。

   1. **[Select components]** (コンポーネントを選択) ページで、**com.example.BatteryAwareHelloWorld** コンポーネントが選択されていることを確認し、**[Next]** (次) を選択します。

   1. **[Configure components]** (コンポーネントを設定) ページで、**com.example.BatteryAwareHelloWorld** を選択したら、次の操作を行います。

      1. **[Configure component]** (コンポーネントを設定) を選択します。

      1. **[com.example.BatteryAwareHelloWorld を設定]** モーダルの **[設定の更新]** の下にある **[マージする設定]** に、以下の設定更新を入力します。

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

      1. **[Confirm]** (確認) を選択してモーダルを閉じ、次に **[Next]** (次) を選択します。

   1. **[詳細設定を確認]** ページ内の **[デプロイポリシー]** セクションにある **[コンポーネントの更新ポリシー]** で、**[コンポーネントに通知する]** が選択されていることを確認します。新しいデプロイを作成するときには、**[Notify components]** (コンポーネントに通知) がデフォルトで選択されています。

   1. <a name="deploy-component-review-and-deploy-step"></a>[**Review**] ページで、[**デプロイ**] を選択します。

      デプロイに最大 1 分かかる場合があります。

1.  AWS IoT Greengrass Core ソフトウェアは、コンポーネントプロセスからの stdout を `logs`フォルダのログファイルに保存します。次のコマンドを実行し、Hello World コンポーネントが実行され、ステータスメッセージが表示されることを確認します。

------
#### [ 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
   ```

------

   次の例に示すようなメッセージが表示されます。

   ```
   Hello, World! Battery level (50) is below threshold (70), so the component will defer updates.
   ```
**注記**  
ファイルが存在しない場合、デプロイがまだ完了していない可能性があります。ファイルが 30 秒以内に表示されない場合は、デプロイが失敗している可能性があります。これは、コアデバイスに S3 バケットからコンポーネントのアーティファクトをダウンロードする権限がない場合などに発生します。次のコマンドを実行して、 AWS IoT Greengrass Core ソフトウェアログファイルを表示します。このファイルは、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` コマンドは、ファイルのコンテンツを端末に書き込みます。このコマンドを複数回実行して、ファイル内の変更を確認してください。

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

1. コアデバイスへの新しいデプロイを作成し、コンポーネントが更新を延期していることを確認します。以下の操作を実行します。

   1. [AWS IoT Greengrass コンソール](https://console.aws.amazon.com/greengrass)のナビゲーションメニューで、**[Deployments]** (デプロイ) を選択します。

   1. 前のステップで、作成したか、修正したデプロイを選択します。

   1. [deployment] (デプロイ) ページで、**[Revise]** (修正) を選択します。

   1. **[Revise deployment]** (デプロイの改訂) モーダルで、**[Revise deployment]** (デプロイの改訂) を選択します。

   1. それぞれのステップで **[Next]** (次) を選んでから、**[Deploy]** (デプロイ) を選択します。

1. 次のコマンドを実行して、コンポーネントのログを再度表示し、更新が延期されていることを確認します。

------
#### [ 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
   ```

------

   次の例に示すようなメッセージが表示されます。コンポーネントは更新を 30 秒間延期するため、コンポーネントはこのメッセージを繰り返し出力します。

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

1. テキストエディタを使用して仮想バッテリ残量ファイルを編集し、バッテリレベルをしきい値を超える値に変更して、デプロイが続行されるようにします。
   + Linux コアデバイスの場合は、`/home/ggc_user/virtual_battery.json` という名前のファイルを編集します。`sudo` の権限でテキストエディタを実行します。
   + Windows コアデバイスの場合は、`C:\Users\ggc_user\virtual_battery.json` という名前のファイルを編集します。管理者としてテキストエディタを実行します。

   <a name="nano-command-intro"></a>例えば、Linux ベースのシステムでは、次のコマンドを実行し、GNU nano を使用してファイルを作成できます。

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

   バッテリー残量を `80` に変更します。

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

1. 次のコマンドを実行して、コンポーネントのログを再度表示し、更新が承認されていることを確認します。

------
#### [ 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
   ```

------

   次の例に示されているようなメッセージが表示されます。

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

これで、このチュートリアルは終了です。Hello World コンポーネントが、コアデバイスのバッテリ残量に基づいて更新を延期または承認します。このチュートリアルで説明しているトピックの詳細については、以下を参照してください。
+ [AWS IoT Greengrass コンポーネントを開発する](develop-greengrass-components.md)
+ [AWS IoT Greengrass コンポーネントをデバイスにデプロイする](manage-deployments.md)
+ [を使用して AWS IoT Device SDK Greengrass nucleus、その他のコンポーネント、および と通信します。 AWS IoT CoreGreengrass nucleus、その他のコンポーネント、および と通信する AWS IoT Core](interprocess-communication.md)
+ [AWS IoT Greengrass Development Kit Command-Line Interface](greengrass-development-kit-cli.md)