

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

# AWS IoT Greengrass コンポーネントを作成する
<a name="create-components"></a>

カスタム AWS IoT Greengrass コンポーネントは、ローカルの開発用コンピュータや Greengrass コアデバイスで開発することができます。AWS IoT Greengrass では、[AWS IoT Greengrass Development Kit Command-Line Interface (GDK CLI)](greengrass-development-kit-cli.md) を提供しており、定義済みのコンポーネントテンプレートや[コミュニティコンポーネント](greengrass-software-catalog.md)からコンポーネントを作成、ビルド、公開することができます。組み込みのシェルコマンドを実行して、コンポーネントを作成、ビルド、パブリッシュすることもできます。カスタム Greengrass コンポーネントを作成するには、次のオプションから選択します。
+ **Greengrass Development Kit CLI を使用する**

  GDK CLI を使用して、ローカル開発コンピュータ上でコンポーネントを開発します。GDK CLI は、コンポーネントのソースコードを構築して recipe とアーティファクトにパッケージ化するため、AWS IoT Greengrass サービスへのプライベートコンポーネントとしてパブリッシュすることができます。コンポーネントをパブリッシュするときにコンポーネントのバージョンとアーティファクト URI を自動的に更新するように GDK CLI を設定できるため、recipe を毎回更新する必要はありません。GDK CLI を使用してコンポーネントを開発する場合、テンプレートまたは [Greengrass ソフトウェアカタログ](greengrass-software-catalog.md)にあるコミュニティコンポーネントを使って開始することができます。詳細については、「[AWS IoT Greengrass Development Kit Command-Line Interface](greengrass-development-kit-cli.md)」を参照してください。
+ **組み込みのシェルコマンドを実行する**

  組み込みのシェルコマンドを実行して、ローカル開発コンピュータまたは Greengrass コアデバイス上でコンポーネントを開発できます。シェルコマンドを使用して、コンポーネントのソースコードをアーティファクトにコピーするか構築します。コンポーネントの新しいバージョンを作成するたびに、新しいコンポーネントバージョンで recipe を作成または更新する必要があります。コンポーネントを AWS IoT Greengrass サービスにパブリッシュするときには、recipe 内の各コンポーネントアーティファクトに URI を更新する必要があります。

**Topics**
+ [コンポーネントを作成する (GDK CLI)](#create-component-gdk-cli)
+ [コンポーネントを作成する (シェルコマンド)](#create-component-shell-commands)

## コンポーネントを作成する (GDK CLI)
<a name="create-component-gdk-cli"></a>

このセクションの指示に従って、GDK CLI を使用してコンポーネントを作成および構築します。

**Greengrass コンポーネントを開発するには (GDK CLI)**

1. GDK CLI をまだインストールしていない場合は、開発コンピュータにインストールします。詳細については、「[AWS IoT Greengrass Development Kit Command-Line Interface をインストールまたは更新する](install-greengrass-development-kit-cli.md)」を参照してください。

1. コンポーネントフォルダを作成するフォルダに移動します。

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

   ```
   mkdir ~/greengrassv2
   cd ~/greengrassv2
   ```

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

   ```
   mkdir %USERPROFILE%\greengrassv2
   cd %USERPROFILE%\greengrassv2
   ```

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

   ```
   mkdir ~/greengrassv2
   cd ~/greengrassv2
   ```

------

1. ダウンロードするコンポーネントテンプレートまたはコミュニティコンポーネントを選択します。GDK CLI がテンプレートまたはコミュニティコンポーネントをダウンロードし、実用的な例を使って開始することができます。[component list](greengrass-development-kit-cli-component.md#greengrass-development-kit-cli-component-list) コマンドを使用して、利用可能なテンプレートとコミュニティコンポーネントのリストを取得します。
   + コンポーネントテンプレートをリスト表示するには、次のコマンドを実行します。レスポンスの各行には、テンプレートの名前とプログラミング言語が含まれています。

     ```
     gdk component list --template
     ```
   + コミュニティコンポーネントをリスト表示するには、次のコマンドを実行します。

     ```
     gdk component list --repository
     ```

1. GDK CLI がテンプレートまたはコミュニティコンポーネントをダウンロードするコンポーネントフォルダを作成および変更します。*HelloWorld* をコンポーネントの名前、またはこのコンポーネントフォルダを識別するのに役立つ別の名前に置き換えます。

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

   ```
   mkdir HelloWorld
   cd HelloWorld
   ```

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

   ```
   mkdir HelloWorld
   cd HelloWorld
   ```

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

   ```
   mkdir HelloWorld
   cd HelloWorld
   ```

------

1. テンプレートまたはコミュニティコンポーネントを現在のフォルダにダウンロードします。[component init](greengrass-development-kit-cli-component.md#greengrass-development-kit-cli-component-init) コマンドを使用します。
   + テンプレートからコンポーネントフォルダを作成するには、次のコマンドを実行します。*HelloWorld* をテンプレートの名前に置き換えて、*python* をプログラミング言語の名前に置き換えます。

     ```
     gdk component init --template HelloWorld --language python
     ```
   + コミュニティコンポーネントからコンポーネントフォルダを作成するには、次のコマンドを実行します。*ComponentName* をコミュニティコンポーネントの名前に置き換えます。

     ```
     gdk component init --repository ComponentName
     ```
**注記**  
<a name="gdk-cli-component-init-empty-folder-requirement"></a>GDK CLI v1.0.0 を使用している場合は、このコマンドは空のフォルダで実行する必要があります。GDK CLI がテンプレートまたはコミュニティコンポーネントを現在のフォルダにダウンロードします。  
<a name="gdk-cli-component-init-empty-folder-requirement-gdk-cli-v1.1.0"></a>GDK CLI v1.1.0 以降を使用する場合、`--name` 引数を使用して、GDK CLI がテンプレートまたはコミュニティコンポーネントをダウンロードするフォルダを指定することができます。この引数を使用する場合は、存在しないフォルダを指定します。GDK CLI によってフォルダが作成されます。この引数を指定しなかった場合、GDK CLI は現在のフォルダを使用しますが、このフォルダは空である必要があります。

1. GDK CLI は `gdk-config.json` という名の [GDK CLI 設定ファイル](gdk-cli-configuration-file.md)から読み込むことで、コンポーネントをビルドおよびパブリッシュします。この設定ファイルは、コンポーネントフォルダのルートにあります。前の手順では、このファイルが作成されました。このステップでは、`gdk-config.json` をコンポーネントに関する情報で更新します。以下の操作を実行します。

   1. テキストエディタで `gdk-config.json` を開きます。

   1. (オプション) コンポーネントの名前を変更します。コンポーネント名は、`component` オブジェクトのキーです。

   1. コンポーネントの作成者を変更します。

   1. (オプション) コンポーネントのバージョンを変更します。次のいずれかを指定します。<a name="gdk-cli-configuration-file-component-version-options"></a>
      + `NEXT_PATCH` - このオプションを選択すると、コンポーネントをパブリッシュするときに GDK CLI がバージョンを設定します。GDK CLI は AWS IoT Greengrass サービスを照会して、コンポーネントの最新のパブリッシュバージョンを特定します。次に、そのバージョンの後の次のパッチバージョンにバージョンを設定します。コンポーネントをまだパプリッシュしていない場合は、GDK CLI はバージョン`1.0.0` を使用します。

        このオプションを選択する場合、AWS IoT Greengrass Core ソフトウェアが動作するローカル開発用コンピュータにコンポーネントをデプロイしテストするために、[Greengrass CLI](greengrass-cli-component.md) を使用することはできません。ローカルデプロイを有効にするには、代わりにセマンティックバージョンを指定する必要があります。
      + **1.0.0** などのセマンティックバージョンです。セマンティックバージョンは、major.minor.patch という番号方式になっています。詳細については、「[セマンティックバージョンの仕様](https://semver.org/)」を参照してください。

        コンポーネントをデプロイしてテストする Greengrass コアデバイスでコンポーネントを開発する場合は、このオプションを選択します。[Greengrass CLI](greengrass-cli-component.md) を使用してローカルデプロイを作成する場合は、特定のバージョンでコンポーネントを構築する必要があります。

   1. (オプション) コンポーネントのビルド設定を変更します。ビルド設定では、GDK CLI がコンポーネントのソースをアーティファクトにビルドする方法を定義します。次の `build_system` のオプションの中から選択します。<a name="gdk-cli-configuration-file-component-build-system-options"></a>
      + `zip` - コンポーネントのフォルダを ZIP ファイルにパッケージ化し、コンポーネントの唯一のアーティファクトとして定義します。次のタイプのコンポーネントには、このオプションを選択します。
        + Python や JavaScript などのインタプリタ形式のプログラミング言語を使用するコンポーネント。
        + 機械学習モデルやその他のリソースなどの、コード以外のファイルをパッケージ化するコンポーネント。

        GDK CLI は、コンポーネントのフォルダをコンポーネントフォルダと同じ名前の zip ファイルに圧縮します。例えば、コンポーネントフォルダの名前が `HelloWorld` の場合、GDK CLI は `HelloWorld.zip` という名前の zip ファイルを作成します。
**注記**  
Windows デバイスで GDK CLI バージョン 1.0.0 を使用する場合、コンポーネントフォルダと zip ファイル名には小文字のみを含める必要があります。

        GDK CLI がコンポーネントのフォルダを zip ファイルに圧縮する際、次のファイルはスキップされます。
        + `gdk-config.json` ファイル
        + recipe ファイル (`recipe.json` または `recipe.yaml`)
        + ビルドフォルダ (`greengrass-build` など)
      + `maven` - `mvn clean package` コマンドを実行して、コンポーネントのソースをアーティファクト内にビルドします。Java コンポーネントなどの [Maven](https://maven.apache.org/) を使用するコンポーネントの場合は、このオプションを選択します。

        Windows デバイスでは、この機能は GDK CLI v1.1.0 以降で利用できます。
      + `gradle` - `gradle build` コマンドを実行して、コンポーネントのソースをアーティファクト内にビルドします。[Gradle](https://gradle.org/) を使用するコンポーネントの場合は、このオプションを選択します。この機能は GDK CLI v1.1.0 以降で利用できます。

        `gradle` ビルドシステムは、ビルドファイルとして Kotlin DSL をサポートしています。この機能は GDK CLI v1.2.0 以降で利用できます。
      + `gradlew` - `gradlew` コマンドを実行して、コンポーネントのソースをアーティファクト内にビルドします。[Gradle Wrapper](https://docs.gradle.org/current/userguide/gradle_wrapper.html) を使用するコンポーネントの場合は、このオプションを選択します。

        この機能は GDK CLI v1.2.0 以降で利用できます。
      + `custom` - カスタムコマンドを実行して、コンポーネントのソースを recipe とアーティファクトにビルドします。`custom_build_command` パラメータでカスタムコマンドを指定します。

   1. `build_system` の `custom` を指定する場合は、`build` オブジェクトに `custom_build_command` を追加します。`custom_build_command` で、1 つの文字列または文字列のリストを指定します。各文字列が、コマンド内の単語になります。例えば、C\$1\$1 コンポーネントのカスタムビルドコマンドを実行する場合は、 **["cmake", "--build", "build", "--config", "Release"]** を指定することができます。

   1. <a name="gdk-cli-s3-bucket-name-formation"></a>GDK CLI v1.1.0 以降を使用する場合、`--bucket` 引数を指定して、GDK CLI がコンポーネントのアーティファクトをアップロードする S3 バケットを指定します。<a name="gdk-cli-s3-bucket-name-formation-format"></a>この引数を指定しない場合、GDK CLI は名前が `bucket-region-accountId` である S3 バケットにアップロードします。ここでは、`gdk-config.json` で指定する値は *bucket* と *region* であり、*accountId* は AWS アカウント ID です。GDK CLI は、バケットが存在しない場合に作成します。

      コンポーネントのパブリッシュ設定を変更します。以下の操作を実行します。

      1. コンポーネントのアーティファクトをホストするために使用する S3 バケット名を指定します。

      1. GDK CLI がコンポーネントをパブリッシュする場所となる AWS リージョン を指定します。

   このステップを終了した時点で、`gdk-config.json` ファイルは、次の例のようになります。

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

1. `recipe.yaml` または `recipe.json` という名のコンポーネント recipe ファイルを更新します。以下の操作を実行します。

   1. `zip` ビルドシステムを使用するテンプレートまたはコミュニティコンポーネントをダウンロードした場合は、ZIP アーティファクト名がコンポーネントフォルダの名前と一致していることを確認してください。GDK CLI は、コンポーネントのフォルダをコンポーネントフォルダと同じ名前の zip ファイルに圧縮します。recipe では、コンポーネントアーティファクトのリストと、ZIP アーティファクト内のファイルを使用するライフサイクルスクリプトの中に、ZIP アーティファクトの名前が含まれます。ZIP ファイル名がコンポーネントフォルダの名前と一致するように `Artifacts` および `Lifecycle` の定義を更新します。次の recipe 例では、`Artifacts` と `Lifecycle` の定義内の zip ファイルの名前が強調表示されています。

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

      ```
      {
        ...
        "Manifests": [
          {
            "Platform": {
              "os": "all"
            },
            "Artifacts": [
              {
                "URI": "s3://{COMPONENT_NAME}/{COMPONENT_VERSION}/HelloWorld.zip",
                "Unarchive": "ZIP"
              }
            ],
            "Lifecycle": {
              "Run": "python3 -u {artifacts:decompressedPath}/HelloWorld/main.py {configuration:/Message}"
            }
          }
        ]
      }
      ```

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

      ```
      ---
      ...
      Manifests:
        - Platform:
            os: all
          Artifacts:
            - URI: "s3://BUCKET_NAME/COMPONENT_NAME/COMPONENT_VERSION/HelloWorld.zip"
              Unarchive: ZIP
          Lifecycle:
            Run: "python3 -u {artifacts:decompressedPath}/HelloWorld/main.py {configuration:/Message}"
      ```

------

   1. (オプション) コンポーネントの説明、デフォルト設定、アーティファクト、ライフサイクルスクリプト、およびプラットフォームサポートを更新します。詳細については、「[AWS IoT Greengrass コンポーネントレシピリファレンス](component-recipe-reference.md)」を参照してください。

   このステップを終了した時点で、recipe ファイルは、次の例のようになります。

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

   ```
   {
     "RecipeFormatVersion": "2020-01-25",
     "ComponentName": "{COMPONENT_NAME}",
     "ComponentVersion": "{COMPONENT_VERSION}",
     "ComponentDescription": "This is a simple Hello World component written in Python.",
     "ComponentPublisher": "{COMPONENT_AUTHOR}",
     "ComponentConfiguration": {
       "DefaultConfiguration": {
         "Message": "World"
       }
     },
     "Manifests": [
       {
         "Platform": {
           "os": "all"
         },
         "Artifacts": [
           {
             "URI": "s3://{COMPONENT_NAME}/{COMPONENT_VERSION}/HelloWorld.zip",
             "Unarchive": "ZIP"
           }
         ],
         "Lifecycle": {
           "Run": "python3 -u {artifacts:decompressedPath}/HelloWorld/main.py {configuration:/Message}"
         }
       }
     ]
   }
   ```

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

   ```
   ---
   RecipeFormatVersion: "2020-01-25"
   ComponentName: "{COMPONENT_NAME}"
   ComponentVersion: "{COMPONENT_VERSION}"
   ComponentDescription: "This is a simple Hello World component written in Python."
   ComponentPublisher: "{COMPONENT_AUTHOR}"
   ComponentConfiguration:
     DefaultConfiguration:
       Message: "World"
   Manifests:
     - Platform:
         os: all
       Artifacts:
         - URI: "s3://BUCKET_NAME/COMPONENT_NAME/COMPONENT_VERSION/HelloWorld.zip"
           Unarchive: ZIP
       Lifecycle:
         Run: "python3 -u {artifacts:decompressedPath}/HelloWorld/main.py {configuration:/Message}"
   ```

------

1. Greengrass コンポーネントを開発して構築します。[コンポーネントビルド](greengrass-development-kit-cli-component.md#greengrass-development-kit-cli-component-build)コマンドは、コンポーネントフォルダにある `greengrass-build` フォルダに recipe とアーティファクトを作成します。以下のコマンドを実行してください。

   ```
   gdk component build
   ```

コンポーネントをテストする準備ができたら、GDK CLI を使用して、AWS IoT Greengrass サービスにパブリッシュします。その後に、コンポーネントを Greengrass コアデバイスにデプロイできます。詳細については、「[コアデバイスにデプロイするコンポーネントをパブリッシュ](publish-components.md)」を参照してください。

## コンポーネントを作成する (シェルコマンド)
<a name="create-component-shell-commands"></a>

このセクションの手順に従って、複数のコンポーネントのソースコードとアーティファクトが含まれる recipe とアーティファクトフォルダを作成します。

**Greengrass コンポーネントを開発するには (シェルコマンド)**

1. <a name="create-component-recipes-artifacts-folder-step"></a>recipe とアーティファクトのサブフォルダを含むコンポーネントのフォルダを作成します。Greengrass コアデバイスで次のコマンドを実行してこれらのフォルダを作成し、コンポーネントフォルダに変更します。*\$1/greengrassv2* または *%USERPROFILE%\$1greengrassv2* をローカル開発に使用するフォルダへのパスに置き換えます。

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

   ```
   mkdir -p ~/greengrassv2/{recipes,artifacts}
   cd ~/greengrassv2
   ```

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

   ```
   mkdir %USERPROFILE%\greengrassv2\\recipes, %USERPROFILE%\greengrassv2\\artifacts
   cd %USERPROFILE%\greengrassv2
   ```

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

   ```
   mkdir ~/greengrassv2/recipes, ~/greengrassv2/artifacts
   cd ~/greengrassv2
   ```

------

1. <a name="create-component-recipe-file-step"></a>テキストエディタを使用して、コンポーネントのメタデータ、パラメータ、依存関係、ライフサイクル、プラットフォーム機能を定義する recipe ファイルを作成します。recipe ファイル名にコンポーネントのバージョンを含めるようにして、どの recipe がどのコンポーネントバージョンを反映しているのかを特定できるようにします。recipe には YAML 形式または JSON 形式を選択できます。

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

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

   ```
   nano recipes/com.example.HelloWorld-1.0.0.json
   ```

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

   ```
   nano recipes/com.example.HelloWorld-1.0.0.yaml
   ```

------
**注記**  
<a name="semver-para"></a>AWS IoT Greengrass はコンポーネントのセマンティックバージョンを使用します。セマンティックバージョンは、major.minor.patch といった番号システムに準拠します。例えば、バージョン `1.0.0` は、コンポーネントの最初のメジャーリリースを表しています。詳細については、「[セマンティックバージョンの仕様](https://semver.org/)」を参照してください。

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

   recipe は、次 Hello World の recipe 例のようになります。

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

   ```
   {
     "RecipeFormatVersion": "2020-01-25",
     "ComponentName": "com.example.HelloWorld",
     "ComponentVersion": "1.0.0",
     "ComponentDescription": "My first AWS IoT Greengrass component.",
     "ComponentPublisher": "Amazon",
     "ComponentConfiguration": {
       "DefaultConfiguration": {
         "Message": "world"
       }
     },
     "Manifests": [
       {
         "Platform": {
           "os": "linux"
         },
         "Lifecycle": {
           "run": "python3 -u {artifacts:path}/hello_world.py {configuration:/Message}"
         }
       },
       {
         "Platform": {
           "os": "windows"
         },
         "Lifecycle": {
           "run": "py -3 -u {artifacts:path}/hello_world.py {configuration:/Message}"
         }
       }
     ]
   }
   ```

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

   ```
   ---
   RecipeFormatVersion: '2020-01-25'
   ComponentName: com.example.HelloWorld
   ComponentVersion: '1.0.0'
   ComponentDescription: My first AWS IoT Greengrass component.
   ComponentPublisher: Amazon
   ComponentConfiguration:
     DefaultConfiguration:
       Message: world
   Manifests:
     - Platform:
         os: linux
       Lifecycle:
         run: |
           python3 -u {artifacts:path}/hello_world.py "{configuration:/Message}"
     - Platform:
         os: windows
       Lifecycle:
         run: |
           py -3 -u {artifacts:path}/hello_world.py "{configuration:/Message}"
   ```

------

   この recipe は、Hello World Python スクリプトを実行します。次のスクリプト例のようになります。

   ```
   import sys
   
   message = "Hello, %s!" % sys.argv[1]
   
   # Print the message to stdout, which Greengrass saves in a log file.
   print(message)
   ```

1. 開発するコンポーネントバージョン用のフォルダを作成します。どのアーティファクトがどのコンポーネントバージョンのものなのかを識別できるように、各コンポーネントバージョンのアーティファクトに対して個別のフォルダを使用することをお勧めします。以下のコマンドを実行してください。

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

   ```
   mkdir -p artifacts/com.example.HelloWorld/1.0.0
   ```

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

   ```
   mkdir artifacts/com.example.HelloWorld/1.0.0
   ```

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

   ```
   mkdir artifacts/com.example.HelloWorld/1.0.0
   ```

------
**重要**  <a name="local-artifact-folder-name-requirements"></a>
アーティファクトフォルダのパスには、次のフォーマットを使用する必要があります。recipe で指定したコンポーネント名とバージョンを含めてください。  

   ```
   artifacts/componentName/componentVersion/
   ```

1. 前のステップで作成したフォルダに、コンポーネントのアーティファクトを作成します。アーティファクトには、ソフトウェア、イメージ、およびその他のコンポーネントが使用するバイナリを含めることができます。

   コンポーネントの準備ができたら、[コンポーネントをテストします](test-components.md)。