

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

# Docker コンテナで AWS IoT Greengrass Core ソフトウェアを実行する
<a name="run-greengrass-docker"></a>

AWS IoT Greengrass は、Docker コンテナで実行するように設定できます。Docker は、Linux コンテナに基づくアプリケーションの構築、実行、テスト、およびデプロイを行うためのツールを提供するプラットフォームです。 AWS IoT Greengrass Docker イメージを実行するときに、Docker コンテナに AWS 認証情報を提供するかどうかを選択し、 AWS IoT Greengrass Core ソフトウェアインストーラが Greengrass コアデバイスが動作するために必要なリソースを自動的にプロビジョニング AWS できるようにします。認証情報を提供し AWS ない場合は、 AWS リソースを手動でプロビジョニングし、Docker コンテナで AWS IoT Greengrass Core ソフトウェアを実行できます。

**Topics**
+ [サポートされているプラットフォームと要件](#greengrass-docker-supported-platforms)
+ [ソフトウェアダウンロード](#greengrass-docker-downloads)
+ [AWS リソースをプロビジョニングする方法を選択する](#greengrass-docker-resource-provisioning)
+ [Dockerfile から AWS IoT Greengrass イメージを構築する](build-greengrass-dockerfile.md)
+ [自動プロビジョニングを使用して Docker AWS IoT Greengrass で を実行する](run-greengrass-docker-automatic-provisioning.md)
+ [手動プロビジョニングを使用して Docker AWS IoT Greengrass で を実行する](run-greengrass-docker-manual-provisioning.md)
+ [Docker コンテナ AWS IoT Greengrass でのトラブルシューティング](docker-troubleshooting.md)

## サポートされているプラットフォームと要件
<a name="greengrass-docker-supported-platforms"></a>

Core ソフトウェアを AWS IoT Greengrass Docker コンテナにインストールして実行するには、ホストコンピュータが以下の最小要件を満たしている必要があります。
+ <a name="docker-host-reqs"></a>インターネットに接続された Linux ベースのオペレーティングシステム。
+ <a name="docker-engine-reqs"></a>[Docker Engine](https://docs.docker.com/engine/install/) バージョン 18.09 以降。
+ <a name="docker-compose-reqs"></a>(オプション) [Docker Compose](https://docs.docker.com/compose/install/) バージョン 1.22 以降。Docker Compose は、Docker Compose CLI を使用して Docker イメージを実行する場合のみ必要です。

Docker コンテナ内で Lambda 関数コンポーネントを実行するには、追加の要件を満たすようにコンテナを設定する必要があります。詳細については、「[Lambda 関数の要件](setting-up.md#greengrass-v2-lambda-requirements)」を参照してください。

### プロセスモードでコンポーネントを実行する
<a name="docker-container-mode-limitation"></a>

AWS IoT Greengrass は、Docker コンテナ内の分離されたランタイム環境での Lambda AWS IoT Greengrass 関数または AWS提供コンポーネントの実行をサポートしていません。これらのコンポーネントは、分離せずにプロセスモードで実行する必要があります。

Lambda 関数コンポーネントを設定するときは、分離モードを **[No container]** (コンテナなし) に設定します。詳細については、「[AWS Lambda 関数を実行する](run-lambda-functions.md)」を参照してください。

以下 AWSが提供するコンポーネントのいずれかをデプロイするときは、各コンポーネントの設定を更新して、 `containerMode`パラメータを に設定します`NoContainer`。設定の更新の詳細については、「[コンポーネント設定の更新](update-component-configurations.md)」を参照してください。
+ [CloudWatch メトリクス](cloudwatch-metrics-component.md)
+ [Device Defender](device-defender-component.md)
+ [Firehose](kinesis-firehose-component.md)
+ [Modbus-RTU プロトコルアダプタ](modbus-rtu-protocol-adapter-component.md)
+ [Amazon SNS](sns-component.md)

## AWS IoT Greengrass Docker ソフトウェアのダウンロード
<a name="greengrass-docker-downloads"></a>

AWS IoT Greengrass には、Amazon Linux 2 (x86\$164) ベースイメージに AWS IoT Greengrass Core ソフトウェアと依存関係がインストールされているコンテナイメージを構築するための Dockerfile が用意されています。Dockerfile のベースイメージを変更して、別のプラットフォームアーキテクチャ AWS IoT Greengrass で実行できます。

Dockerfile パッケージを、[GitHub](https://github.com/aws-greengrass/aws-greengrass-docker) からダウンロードします。

Dockerfile は古いバージョンの Greengrass を使用しています。必要なバージョンの Greengrass を使用するようにファイルを更新する必要があります。Dockerfile から AWS IoT Greengrass コンテナイメージを構築する方法については、「」を参照してください[Dockerfile から AWS IoT Greengrass コンテナイメージを構築する](build-greengrass-dockerfile.md)。

## AWS リソースをプロビジョニングする方法を選択する
<a name="greengrass-docker-resource-provisioning"></a>

 AWS IoT Greengrass Core ソフトウェアを Docker コンテナにインストールする場合、Greengrass コアデバイスが動作するために必要な AWS リソースを自動的にプロビジョニングするか、手動でプロビジョニングしたリソースを使用するかを選択できます。
+ **自動リソースプロビジョニング** — インストーラは、 AWS IoT Greengrass コンテナイメージを初めて実行するときに、 AWS IoT モノ、 AWS IoT モノのグループ、IAM ロール、および AWS IoT ロールエイリアスをプロビジョニングします。インストーラは、ローカル開発ツールをコアデバイスにデプロイすることもできるため、デバイスを使用してカスタムソフトウェアコンポーネントを開発とテストできます。これらのリソースを自動的にプロビジョニングするには、Docker イメージに環境変数として AWS 認証情報を提供する必要があります。

  自動プロビジョニングを使用するには、Docker 環境変数 `PROVISION=true` を設定し、認証ファイルをマウントして、 AWS 認証情報をコンテナに提供する必要があります。
+ **手動リソースプロビジョニング** — コンテナに AWS 認証情報を提供しない場合は、 AWS IoT Greengrass コンテナイメージを実行する前にリソースを手動でプロビジョニング AWS できます。これらのリソースに関する情報を Docker コンテナ内の AWS IoT Greengrass Core ソフトウェアインストーラに提供するには、設定ファイルを作成する必要があります。

  手動プロビジョニングを使用するには、Docker 環境変数 `PROVISION=false` を設定する必要があります。手動プロビジョニングがデフォルトのオプションです。

詳細については、「[Dockerfile から AWS IoT Greengrass コンテナイメージを構築する](build-greengrass-dockerfile.md)」を参照してください。

# Dockerfile から AWS IoT Greengrass コンテナイメージを構築する
<a name="build-greengrass-dockerfile"></a>

AWS には、Docker コンテナで AWS IoT Greengrass Core ソフトウェアをダウンロードして実行するために使用できる Dockerfile が用意されています。Dockerfiles には、 AWS IoT Greengrass コンテナイメージを構築するためのソースコードが含まれています。

 AWS IoT Greengrass コンテナイメージを構築する前に、インストールする AWS IoT Greengrass Core ソフトウェアのバージョンを選択するように Dockerfile を設定する必要があります。また、環境変数を設定することで、インストール時のリソースのプロビジョニング方法を選択したり、他のインストールオプションをカスタマイズすることもできます。このセクションでは、Dockerfile AWS IoT Greengrass から Docker イメージを設定および構築する方法について説明します。



## Dockerfile パッケージをダウンロードする
<a name="download-dockerfile-package"></a>

Dockerfile AWS IoT Greengrass パッケージは GitHub からダウンロードできます。

[AWS Greengrass Docker リポジトリ](https://github.com/aws-greengrass/aws-greengrass-docker)

パッケージをダウンロードしたら、コンテンツをコンピュータ上の `download-directory/aws-greengrass-docker-nucleus-version` フォルダに抽出します。Dockerfile は古いバージョンの Greengrass を使用しています。必要なバージョンの Greengrass を使用するようにファイルを更新する必要があります。

## AWS IoT Greengrass Core ソフトウェアバージョンを指定する
<a name="set-dockerfile-build-argument"></a>

Dockerfile で次のビルド引数を使用して、Docker イメージで使用する AWS IoT Greengrass Core AWS IoT Greengrass ソフトウェアのバージョンを指定します。デフォルトでは、Dockerfile は最新バージョンの AWS IoT Greengrass Core ソフトウェアを使用します。

`GREENGRASS_RELEASE_VERSION`  
 AWS IoT Greengrass Core ソフトウェアのバージョン。デフォルトでは、Dockerfile は Greengrass nucleus の利用可能な最新バージョンをダウンロードします。この値を、ダウンロードする nucleus のバージョンに設定します。

## 環境変数を設定する
<a name="set-dockerfile-environment-variables"></a>

環境変数を使用すると、Docker コンテナに AWS IoT Greengrass Core ソフトウェアをインストールする方法をカスタマイズできます。Docker AWS IoT Greengrass イメージの環境変数は、さまざまな方法で設定できます。
+ 同じ環境変数を使用して複数のイメージを作成するには、Dockerfile で環境変数を直接設定します。
+ `docker run` を使用してコンテナを開始するには、コマンドで環境変数を引数として渡すか、環境変数ファイルで環境変数を設定してから、そのファイルを引数として渡します。Docker で環境変数を設定するための詳細については、Docker ドキュメントの「[environment variables](https://docs.docker.com/engine/reference/commandline/run/#env)」を参照してください。
+ `docker-compose up` を使用してコンテナを開始するには、環境変数ファイルで環境変数を設定してから、そのファイルを引数として渡します。Compose で環境変数を設定するための詳細については、「[Docker ドキュメント](https://docs.docker.com/compose/environment-variables/)」を参照してください。

 AWS IoT Greengrass Docker イメージには、次の環境変数を設定できます。

**注記**  
Dockerfile の `TINI_KILL_PROCESS_GROUP` 変数は変更しないでください。この変数を使用すると、PIDs グループ内のすべての PID `SIGTERM`に転送できるため、Docker コンテナが停止したときに AWS IoT Greengrass Core ソフトウェアが正しくシャットダウンできます。

`GGC_ROOT_PATH`  
(オプション) AWS IoT Greengrass Core ソフトウェアのルートとして使用するコンテナ内のフォルダへのパス。  
デフォルト: `/greengrass/v2`

`PROVISION`  
(オプション) AWS IoT Greengrass Core が AWS リソースをプロビジョニングするかどうかを決定します。  
+ を指定すると`true`、 AWS IoT Greengrass Core ソフトウェアはコンテナイメージを AWS IoT モノとして登録し、Greengrass コアデバイスが必要とする AWS リソースをプロビジョニングします。 AWS IoT Greengrass Core ソフトウェアは、 AWS IoT モノ、 AWS IoT モノのグループ、IAM ロール、および AWS IoT ロールエイリアスをプロビジョニングします (オプション）。詳細については、「[自動リソースプロビジョニングを使用して Docker コンテナ AWS IoT Greengrass で を実行する](run-greengrass-docker-automatic-provisioning.md)」を参照してください。
+ を指定する場合は`false`、手動で作成した AWS リソースと証明書を使用するように指定する設定ファイルを AWS IoT Greengrass Core インストーラに提供する必要があります。詳細については、「[手動リソースプロビジョニングを使用して Docker コンテナ AWS IoT Greengrass で を実行する](run-greengrass-docker-manual-provisioning.md)」を参照してください。
デフォルト: `false`

`AWS_REGION`  
(オプション) AWS IoT Greengrass Core ソフトウェア AWS リージョン が必要な AWS リソースを取得または作成するために使用する 。  
デフォルト: `us-east-1`。

`THING_NAME`  
(オプション) このコアデバイスとして登録する AWS IoT モノの名前。この名前のモノが に存在しない場合 AWS アカウント、 AWS IoT Greengrass Core ソフトウェアによって作成されます。  
この引数を適用するには、`PROVISION=true` を指定する必要があります。  
デフォルト: `GreengrassV2IotThing_` とランダムな UUID。

`THING_GROUP_NAME`  
(オプション) このコアデバイスの AWS IoT を追加する AWS IoT モノのグループの名前 デプロイがこのモノのグループをターゲットにしている場合、このグループとそのグループの他のコアデバイスは、接続時にそのデプロイを受け取ります AWS IoT Greengrass。この名前のモノのグループが に存在しない場合 AWS アカウント、 AWS IoT Greengrass Core ソフトウェアによって作成されます。  
この引数を適用するには、`PROVISION=true` を指定する必要があります。

`TES_ROLE_NAME`  
(オプション) Greengrass コアデバイスが AWS サービスとやり取りできるようにする AWS 認証情報を取得するために使用する IAM ロールの名前。この名前のロールが に存在しない場合 AWS アカウント、 AWS IoT Greengrass Core ソフトウェアはそれを `GreengrassV2TokenExchangeRoleAccess`ポリシーで作成します。このロールは、コンポーネントのアーティファクトをホストする S3 バケットにはアクセスできません。そのため、コンポーネントを作成するときに、アーティファクトの S3 バケットとオブジェクトへのアクセス許可を追加する必要があります。詳細については、「[コアデバイスが AWS サービスとやり取りできるように認可する](device-service-role.md)」を参照してください。  
デフォルト: `GreengrassV2TokenExchangeRole`

`TES_ROLE_ALIAS_NAME`  
(オプション) Greengrass コアデバイスの AWS 認証情報を提供する AWS IoT IAM ロールを指すロールエイリアスの名前。この名前のロールエイリアスが に存在しない場合 AWS アカウント、 AWS IoT Greengrass Core ソフトウェアによって作成され、指定した IAM ロールにポイントされます。  
デフォルト: `GreengrassV2TokenExchangeRoleAlias`

`COMPONENT_DEFAULT_USER`  
(オプション) AWS IoT Greengrass Core ソフトウェアがコンポーネントの実行に使用するシステムユーザーとグループの名前または ID。ユーザーとグループは、コロンで区切って指定します。グループはオプションです。たとえば、**ggc\$1user:ggc\$1group** や **ggc\$1user** と指定することができます。  
+ root として実行した場合、設定ファイルで定義したユーザーとグループがデフォルトとなります。設定ファイルでユーザーとグループが定義されていない場合、デフォルトは `ggc_user:ggc_group` になります。もし `ggc_user` または `ggc_group` が存在しない場合は、ソフトウェアが作成します。
+ ルート以外のユーザーとして を実行すると、 AWS IoT Greengrass Core ソフトウェアはそのユーザーを使用してコンポーネントを実行します。
+ グループを指定しない場合、 AWS IoT Greengrass Core ソフトウェアはシステムユーザーのプライマリグループを使用します。
詳細については、「[コンポーネントを実行するユーザーを設定する](configure-greengrass-core-v2.md#configure-component-user)」を参照してください。

`DEPLOY_DEV_TOOLS`  
[Greengrass CLI コンポーネント](greengrass-cli-component.md)をコンテナイメージにダウンロードし、デプロイするかどうかを定義します。Greengrass CLI を使用して、コンポーネントをローカルで開発およびデバッグすることができます。  
 <a name="local-dev-tools-production-environment-warning"></a>このコンポーネントは、本番環境ではなく、開発環境でのみで使用することをお勧めします。このコンポーネントは、通常、本番環境では必要とされない情報や操作へのアクセスを提供します。このコンポーネントを必要なコアデバイスにのみデプロイして、最小特権の原則に従います。
デフォルト: `false`

`INIT_CONFIG`  
(オプション) AWS IoT Greengrass Core ソフトウェアのインストールに使用する設定ファイルへのパス。このオプションを使用して、特定の nucleus 設定で新しい Greengrass コアデバイスをセットアップしたり、手動でプロビジョニングされたリソースを指定したりできます。設定ファイルは、この引数で指定したパスにマウントする必要があります。

`TRUSTED_PLUGIN`  
この機能は、[Greengrass nucleus コンポーネント](greengrass-nucleus-component.md)の v2.4.0 以降に利用できます。  
(オプション) 信頼されたプラグインとして読み込む JAR ファイルへのパス。[フリートプロビジョニング](fleet-provisioning.md)や[カスタムプロビジョニング](custom-provisioning.md)でインストールする場合など、プロビジョニングプラグインの JAR ファイルを提供する場合にこのオプションを使用します。

`THING_POLICY_NAME`  
この機能は、[Greengrass nucleus コンポーネント](greengrass-nucleus-component.md)の v2.4.0 以降に利用できます。  
(オプション) このコアデバイスの AWS IoT モノ証明書にアタッチする AWS IoT ポリシーの名前。この名前の AWS IoT ポリシーが AWS IoT Greengrass Core ソフトウェアに存在しない場合は AWS アカウント 、作成します。  
この引数を適用するには、`PROVISION=true` を指定する必要があります。  
 AWS IoT Greengrass Core ソフトウェアは、デフォルトで許可 AWS IoT ポリシーを作成します。このポリシーの範囲を絞り込むか、ユースケースに応じた権限に制限するカスタムポリシーを作成することができます。詳細については、「[AWS IoT Greengrass V2 コアデバイスの最小 AWS IoT ポリシー](device-auth.md#greengrass-core-minimal-iot-policy)」を参照してください。

## インストールする依存関係を指定する
<a name="dockerfile-run-instruction"></a>

Dockerfile の RUN AWS IoT Greengrass 命令は、 AWS IoT Greengrass Core ソフトウェアインストーラを実行するコンテナ環境を準備します。Docker コンテナで AWS IoT Greengrass Core ソフトウェアのインストーラを実行する前に、インストールされる依存関係をカスタマイズできます。

## AWS IoT Greengrass イメージの構築
<a name="build-greengrass-docker-image"></a>

 AWS IoT Greengrass Dockerfile を使用して AWS IoT Greengrass コンテナイメージを構築します。Docker CLI または Docker Compose CLI を使用してイメージを構築し、コンテナを開始することができます。また、Docker CLI を使用してイメージを構築し、その後 Docker Compose を使用してそのイメージからコンテナを開始することもできます。

------
#### [ Docker ]

1. ホストマシンで次のコマンドを実行し、設定した Dockerfile が含まれるディレクトリに切り替えます。

   ```
   cd download-directory/aws-greengrass-docker-nucleus-version
   ```

1. 次のコマンドを実行して、Dockerfile から AWS IoT Greengrass コンテナイメージを構築します。

   ```
   sudo docker build -t "platform/aws-iot-greengrass:nucleus-version" ./
   ```

------
#### [ Docker Compose ]

1. ホストマシンで次のコマンドを実行し、Dockerfile ファイルと Compose ファイルが含まれてるディレクトリに切り替えます。

   ```
   cd download-directory/aws-greengrass-docker-nucleus-version
   ```

1. 次のコマンドを実行して、Compose ファイルを使用して AWS IoT Greengrass コンテナイメージを構築します。

   ```
   docker-compose -f docker-compose.yml build
   ```

------

 AWS IoT Greengrass コンテナイメージが正常に作成されました。Docker イメージには AWS IoT Greengrass Core ソフトウェアがインストールされています。Core AWS IoT Greengrass ソフトウェアを Docker コンテナで実行できるようになりました。

# 自動リソースプロビジョニングを使用して Docker コンテナ AWS IoT Greengrass で を実行する
<a name="run-greengrass-docker-automatic-provisioning"></a>

このチュートリアルでは、自動的にプロビジョニングされた AWS リソースとローカル開発ツールを使用して、Docker コンテナに AWS IoT Greengrass Core ソフトウェアをインストールして実行する方法について説明します。この開発環境を使用して、Docker コンテナ AWS IoT Greengrass の機能を調べることができます。ソフトウェアには、これらのリソースをプロビジョニングし、ローカル開発ツールをデプロイするための AWS 認証情報が必要です。

コンテナに AWS 認証情報を提供できない場合は、コアデバイスが動作するために必要なリソースをプロビジョニング AWS できます。開発ツールをコアデバイスにデプロイして、開発デバイスとして使用することもできます。これにより、コンテナの実行時にデバイスに付与するアクセス許可を減らすことができます。詳細については、「[手動リソースプロビジョニングを使用して Docker コンテナ AWS IoT Greengrass で を実行する](run-greengrass-docker-manual-provisioning.md)」を参照してください。



## 前提条件
<a name="docker-automatic-provisioning-prereqs"></a>

このチュートリアルを完了するには、以下が必要です。
+  AWS アカウント。アカウントをお持ちでない場合は、「[のセットアップ AWS アカウント](setting-up.md#set-up-aws-account)」を参照してください。
+ Greengrass AWS コアデバイスの AWS IoT および IAM リソースをプロビジョニングするアクセス許可を持つ IAM ユーザー。 AWS IoT Greengrass Core ソフトウェアインストーラは、認証情報 AWS を使用してこれらのリソースを自動的にプロビジョニングします。リソースを自動的にプロビジョニングする最小の IAM ポリシーの詳細については、「[インストーラがリソースをプロビジョニングするための最小限の IAM ポリシー](provision-minimal-iam-policy.md)」を参照してください。
+ Docker AWS IoT Greengrass イメージ。[Dockerfile AWS IoT Greengrass からイメージを構築](build-greengrass-dockerfile.md)できます。
+ Docker コンテナを実行するホストコンピュータは、以下の要件を満たしている必要があります。
  + <a name="docker-host-reqs"></a>インターネットに接続された Linux ベースのオペレーティングシステム。
  + <a name="docker-engine-reqs"></a>[Docker Engine](https://docs.docker.com/engine/install/) バージョン 18.09 以降。
  + <a name="docker-compose-reqs"></a>(オプション) [Docker Compose](https://docs.docker.com/compose/install/) バージョン 1.22 以降。Docker Compose は、Docker Compose CLI を使用して Docker イメージを実行する場合のみ必要です。

## AWS 認証情報を設定する
<a name="configure-aws-credentials-for-docker"></a>

このステップでは、 AWS セキュリティ認証情報を含む認証情報ファイルをホストコンピュータに作成します。 AWS IoT Greengrass Docker イメージを実行するときは、この認証情報ファイルを含むフォルダを Docker コンテナ`/root/.aws/`の にマウントする必要があります。 AWS IoT Greengrass インストーラは、これらの認証情報を使用して のリソースをプロビジョニングします AWS アカウント。インストーラがリソースを自動的にプロビジョニングするために必要な最小 IAM ポリシーについては、「[インストーラがリソースをプロビジョニングするための最小限の IAM ポリシー](provision-minimal-iam-policy.md)」を参照してください。

1. 次のいずれかを取得します。
   + IAM ユーザーの長期的な認証情報。長期認証情報を取得する方法については、「*IAM ユーザーガイド*」の「[IAM ユーザーのアクセスキーを管理します。](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html)」を参照してください。
   + (推奨) IAM ロールの一時的な認証情報。一時的な認証情報を取得する方法については、「*IAM ユーザーガイド*」の「[AWS CLIで一時的なセキュリティ認証情報を使用する](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_use-resources.html#using-temp-creds-sdk-cli)」を参照してください。

1. 認証情報ファイルを配置するフォルダを作成します。

   ```
   mkdir ./greengrass-v2-credentials
   ```

1. テキストエディタを使用して、`./greengrass-v2-credentials` フォルダに `credentials` という名前の設定ファイルを作成します。

   例えば、次のコマンドを実行し、GNU nano を使用して `credentials` ファイルを作成できます。

   ```
   nano ./greengrass-v2-credentials/credentials
   ```

1. 次の形式で AWS 認証情報を `credentials` ファイルに追加します。

   ```
   [default]
   aws_access_key_id = AKIAIOSFODNN7EXAMPLE
   aws_secret_access_key = wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
   aws_session_token = AQoEXAMPLEH4aoAH0gNCAPy...truncated...zrkuWJOgQs8IZZaIv2BXIa2R4Olgk
   ```

   一時的な認証情報の場合のみ `aws_session_token` を含めます。

**重要**  
 AWS IoT Greengrass コンテナを起動したら、ホストコンピュータから認証情報ファイルを削除します。認証情報ファイルを削除しない場合、 AWS 認証情報はコンテナ内にマウントされたままになります。詳細については、「[コンテナで AWS IoT Greengrass Core ソフトウェアを実行する](#run-greengrass-image-automatic-provisioning)」を参照してください。

## 環境ファイルを作成する
<a name="create-env-file-automatic-provisioning"></a>

このチュートリアルでは、環境ファイルを使用して、Docker コンテナ内の AWS IoT Greengrass Core ソフトウェアインストーラに渡される環境変数を設定します。また、`docker run` コマンドで [`-e` または `--env` 引数](https://docs.docker.com/engine/reference/commandline/run/#env)を使用して、Docker コンテナに環境変数を設定する、または `docker-compose.yml` ファイルの [`environment` ブロック](https://docs.docker.com/compose/compose-file/compose-file-v3/#environment)で変数を設定することもできます。

1. テキストエディタを使用して、`.env` という名前の環境ファイルを作成します。

   例えば、Linux ベースのシステムでは、次のコマンドを実行し、GNU nano を使用して現在のディレクトリに `.env` を作成できます。

   ```
   nano .env
   ```

1. 次の内容をファイルにコピーします。

   ```
   GGC_ROOT_PATH=/greengrass/v2
   AWS_REGION=region
   PROVISION=true
   THING_NAME=MyGreengrassCore
   THING_GROUP_NAME=MyGreengrassCoreGroup
   TES_ROLE_NAME=GreengrassV2TokenExchangeRole
   TES_ROLE_ALIAS_NAME=GreengrassCoreTokenExchangeRoleAlias
   COMPONENT_DEFAULT_USER=ggc_user:ggc_group
   ```

   次に、以下の値を置き換えます。
   + `/greengrass/v2`。インストールに使用する Greengrass ルートフォルダ。`GGC_ROOT` 環境変数を使用して、この値を設定します。
   + *リージョン*。リソースを作成した AWS リージョン 。
   + *MyGreengrassCore*。 AWS IoT モノの名前。モノが存在しない場合、インストーラによって作成されます。インストーラは証明書をダウンロードして AWS IoT 、モノとして認証します。
   + *MyGreengrassCoreGroup*。 AWS IoT モノのグループの名前。モノグループが存在しない場合、インストーラはそのグループを作成してモノを追加します。モノグループが存在してアクティブなデプロイがある場合、コアデバイスはデプロイで指定されたソフトウェアをダウンロードして実行します。
   +  *GreengrassV2TokenExchangeRole*。Greengrass コアデバイスが一時的な AWS 認証情報を取得できるようにする IAM トークン交換ロールの名前に置き換えます。ロールが存在しない場合、インストーラがロールを作成し、*GreengrassV2TokenExchangeRole* という名前のポリシーを作成してアタッチします。詳細については、「[コアデバイスが AWS サービスとやり取りできるように認可する](device-service-role.md)」を参照してください。
   + *GreengrassCoreTokenExchangeRoleAlias*。トークン交換ロールエイリアス。ロールエイリアスが存在しない場合、インストーラがロールエイリアスを作成し、指定した IAM トークン交換ロールを指します。詳細については、以下を参照してください。
**注記**  <a name="docker-local-dev-tools-production-environment-warning"></a>
`DEPLOY_DEV_TOOLS` 環境変数を `true` に設定して、[[Greengrass CLI component]](greengrass-cli-component.md) (Greengrass CLI コンポーネント) をデプロイできます。これにより、Docker コンテナ内でカスタムコンポーネントを開発できます。<a name="local-dev-tools-production-environment-warning"></a>このコンポーネントは、本番環境ではなく、開発環境でのみで使用することをお勧めします。このコンポーネントは、通常、本番環境では必要とされない情報や操作へのアクセスを提供します。このコンポーネントを必要なコアデバイスにのみデプロイして、最小特権の原則に従います。

## コンテナで AWS IoT Greengrass Core ソフトウェアを実行する
<a name="run-greengrass-image-automatic-provisioning"></a>

このチュートリアルでは、Docker コンテナでビルドした Docker イメージを起動する方法を説明します。Docker CLI または Docker Compose CLI を使用して、Docker コンテナで AWS IoT Greengrass Core ソフトウェアイメージを実行できます。

------
#### [ Docker ]

1. 次のコマンドを実行して Docker コンテナを起動します。

   ```
   docker run --rm --init -it --name docker-image \
    -v path/to/greengrass-v2-credentials:/root/.aws/:ro \
    --env-file .env \
    -p 8883 \
    your-container-image:version
   ```

   このコマンド例は、[docker run](https://docs.docker.com/engine/reference/commandline/run/) に次の引数を使用します。
   + <a name="docker-run-rm"></a>[https://docs.docker.com/engine/reference/run/#clean-up---rm](https://docs.docker.com/engine/reference/run/#clean-up---rm): コンテナの終了時にクリーンアップを実行します。
   + <a name="docker-run-init"></a>[https://docs.docker.com/engine/reference/run/#specify-an-init-process](https://docs.docker.com/engine/reference/run/#specify-an-init-process): コンテナで init プロセスを使用します。
**注記**  
Docker コンテナを停止するときに AWS IoT Greengrass Core ソフトウェアをシャットダウンするには、 `--init`引数が必要です。
   + <a name="docker-run-it"></a>[https://docs.docker.com/engine/reference/run/#foreground](https://docs.docker.com/engine/reference/run/#foreground): (オプション) Docker コンテナを対話型プロセスとしてフォアグラウンドで実行します。これを `-d` 引数に置き換えて、代わりに Docker コンテナをデタッチモードで実行できます。詳細については、「Docker ドキュメント」の「[デタッチ vs フォアグラウンド](https://docs.docker.com/engine/reference/run/#detached-vs-foreground)」を参照してください。
   + <a name="docker-run-name"></a>[https://docs.docker.com/engine/reference/run/#name---name](https://docs.docker.com/engine/reference/run/#name---name): `aws-iot-greengrass` という名前のコンテナを実行します。
   + <a name="docker-run-v"></a>[https://docs.docker.com/storage/volumes/](https://docs.docker.com/storage/volumes/)。 ボリュームを Docker コンテナにマウントして、設定ファイルと証明書ファイルをコンテナ内で AWS IoT Greengrass 実行できるようにします。
   + <a name="docker-run-env-file"></a>[https://docs.docker.com/engine/reference/commandline/run/#env](https://docs.docker.com/engine/reference/commandline/run/#env)。 (オプション) Docker コンテナ内の AWS IoT Greengrass Core ソフトウェアインストーラに渡される環境変数を設定する環境ファイルを指定します。この引数は、環境変数を設定するための [[environment file]](run-greengrass-docker-manual-provisioning.md#create-env-file-manual-provisioning) (環境ファイル) を作成した場合にのみ必要です。環境ファイルを作成していない場合は、`--env` 引数を使用して、「Docker 実行コマンド」で環境変数を直接設定できます。
   + <a name="docker-run-p"></a>[https://docs.docker.com/engine/reference/commandline/run/#publish](https://docs.docker.com/engine/reference/commandline/run/#publish): (オプション) 8883 コンテナポートをホストマシンに公開します。 AWS IoT Greengrass は MQTT トラフィックにポート 8883 を使用するため、MQTT を介して接続および通信する場合は、この引数が必要です。他のポートを開くには、追加の `-p` 引数を使用します。
**注記**  <a name="docker-run-cap-drop"></a>
セキュリティを強化して Docker コンテナを実行するには、`--cap-drop` 引数および `--cap-add` 引数を使用して、コンテナの Linux 機能を選択的に有効にします。詳細については、「Docker ドキュメント」の「[[Runtime privilege and Linux capabilities]](https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities) (ランタイム特権と Linux 機能)」を参照してください。

1. <a name="docker-automatic-provisioning-remove-credentials-file"></a>ホストデバイスで `./greengrass-v2-credentials` から認証情報を削除します。

   ```
   rm -rf ./greengrass-v2-credentials
   ```
**重要**  
これらの認証情報は、コアデバイスがセットアップ時にのみ必要とする広範なアクセス許可を提供するため、削除します。これらの認証情報を削除しないと、Greengrass コンポーネントとコンテナで実行されている他のプロセスがそれらにアクセスできます。Greengrass コンポーネントに AWS 認証情報を指定する必要がある場合は、トークン交換サービスを使用します。詳細については、「[AWS サービスとやり取り](interact-with-aws-services.md)」を参照してください。

------
#### [ Docker Compose ]

1. テキストエディタを使用して、`docker-compose.yml` という名前の Docker Compose ファイルを作成します。

   例えば、Linux ベースのシステムでは、次のコマンドを実行し、GNU nano を使用して現在のディレクトリに `docker-compose.yml` を作成できます。

   ```
   nano docker-compose.yml
   ```
**注記**  
 AWSが提供する Compose ファイルの最新バージョンを [GitHub](https://github.com/aws-greengrass/aws-greengrass-docker/releases/) からダウンロードして使用することもできます。

1. Compose ファイルに以下の内容を追加します。ファイルは次の例のようになります。*docker-image* をお使いの Docker イメージの名前に置き換えます。

   ```
   version: '3.7'
    
   services:
     greengrass:
       init: true
       container_name: aws-iot-greengrass
       image: docker-image
       volumes:
         - ./greengrass-v2-credentials:/root/.aws/:ro 
       env_file: .env
       ports:
         - "8883:8883"
   ```<a name="docker-compose-optional-params"></a>

   この例の Compose ファイルでは、以下のパラメータはオプションです。
   + `ports` - 8883 コンテナポートをホストマシンに公開します。は MQTT トラフィックにポート 8883 AWS IoT Greengrass を使用するため、このパラメータは MQTT 経由で接続および通信する場合に必要です。
   + `env_file`— Docker コンテナ内の AWS IoT Greengrass Core ソフトウェアインストーラに渡される環境変数を設定する環境ファイルを指定します。このパラメータは、環境変数を設定するための [[environment file]](run-greengrass-docker-manual-provisioning.md#create-env-file-manual-provisioning) (環境ファイル) を作成した場合にのみ必要です。環境ファイルを作成していない場合は、[[environment]](https://docs.docker.com/compose/compose-file/compose-file-v3/#environment) (環境) パラメータを使用して、Compose ファイルで環境変数を直接設定できます。
**注記**  <a name="docker-compose-cap-drop"></a>
セキュリティを強化して Docker コンテナを実行するには、Compose ファイルで `cap_drop` および `cap_add` を使用して、コンテナの Linux 機能を選択的に有効にします。詳細については、「Docker ドキュメント」の「[[Runtime privilege and Linux capabilities]](https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities) (ランタイム特権と Linux 機能)」を参照してください。

1. 次のコマンドを実行して Docker コンテナを起動します。

   ```
   docker-compose -f docker-compose.yml up
   ```

1. <a name="docker-automatic-provisioning-remove-credentials-file"></a>ホストデバイスで `./greengrass-v2-credentials` から認証情報を削除します。

   ```
   rm -rf ./greengrass-v2-credentials
   ```
**重要**  
これらの認証情報は、コアデバイスがセットアップ時にのみ必要とする広範なアクセス許可を提供するため、削除します。これらの認証情報を削除しないと、Greengrass コンポーネントとコンテナで実行されている他のプロセスがそれらにアクセスできます。Greengrass コンポーネントに AWS 認証情報を指定する必要がある場合は、トークン交換サービスを使用します。詳細については、「[AWS サービスとやり取り](interact-with-aws-services.md)」を参照してください。

------

## 次の手順
<a name="run-greengrass-docker-next-steps"></a>

<a name="run-greengrass-docker-success"></a>AWS IoT Greengrass Core ソフトウェアが Docker コンテナで実行されています。次のコマンドを実行して、現在実行中のコンテナのコンテナ ID を取得します。

```
docker ps
```

その後、次のコマンドを実行してコンテナにアクセスし、コンテナ内で実行されている AWS IoT Greengrass Core ソフトウェアを調べることができます。

```
docker exec -it container-id /bin/bash
```

単純なコンポーネントの作成については、「[チュートリアル: AWS IoT Greengrass V2 の開始方法](getting-started.md)」の「[ステップ 4: デバイス上でコンポーネントを開発およびテストする](create-first-component.md)」を参照してください。

**注記**  <a name="run-greengrass-commands-in-docker-note"></a>
`docker exec` を使用して Docker コンテナ内でコマンドを実行すると、これらのコマンドは Docker ログに記録されません。Docker ログにコマンドを記録するには、Docker コンテナに対話型シェルをアタッチします。詳細については、「[インタラクティブシェルを Docker コンテナにアタッチする](docker-troubleshooting.md#debugging-docker-attach-shell)」を参照してください。

 AWS IoT Greengrass Core ログファイルは と呼ばれ`greengrass.log`、 にあります`/greengrass/v2/logs`。コンポーネントログファイルも同じディレクトリにあります。Greengrass ログをホストの一時ディレクトリにコピーするには、次のコマンドを実行します。

```
docker cp container-id:/greengrass/v2/logs /tmp/logs
```

コンテナの終了後、または削除後もログを保持する場合は、Greengrass ディレクトリ全体をマウントするのではなく、`/greengrass/v2/logs` ディレクトリのみをホストの一時ログディレクトリにバインドマウントすることをお勧めします。詳細については、「[Docker コンテナの外部で Greengrass ログを永続化する](docker-troubleshooting.md#debugging-docker-persist-logs)」を参照してください。

<a name="greengrass-docker-stop"></a>実行中の Docker AWS IoT Greengrass コンテナを停止するには、 `docker stop`または を実行します`docker-compose -f docker-compose.yml stop`。このアクションは、`SIGTERM` を Greengrass プロセスに送信し、コンテナで開始されたすべての関連プロセスをシャットダウンします。Docker コンテナは、プロセス PID 1 として `docker-init` の実行可能ファイルで初期化されます。これは、残っているゾンビプロセスを削除するのに役立ちます。詳細については、Docker ドキュメントの「[Specify an init process](https://docs.docker.com/engine/reference/run/#specify-an-init-process)」を参照してください。

<a name="see-docker-troubleshooting"></a>Docker コンテナで AWS IoT Greengrass を実行する際の問題のトラブルシューティングについては、「[Docker コンテナ AWS IoT Greengrass でのトラブルシューティング](docker-troubleshooting.md)」を参照してください。

# 手動リソースプロビジョニングを使用して Docker コンテナ AWS IoT Greengrass で を実行する
<a name="run-greengrass-docker-manual-provisioning"></a>

このチュートリアルでは、手動でプロビジョニングされた AWS リソースを使用して Docker コンテナに AWS IoT Greengrass Core ソフトウェアをインストールして実行する方法について説明します。

**Topics**
+ [前提条件](#docker-manual-provisioning-prereqs)
+ [AWS IoT エンドポイントを取得する](#retrieve-iot-endpoints)
+ [AWS IoT モノを作成する](#create-iot-thing)
+ [モノの証明書を作成する](#create-thing-certificate-mp)
+ [トークン交換ロールを作成する](#create-token-exchange-role)
+ [デバイスに証明書をダウンロードする](#download-thing-certificates)
+ [設定ファイルを作成する](#create-docker-install-configuration-file)
+ [環境ファイルを作成する](#create-env-file-manual-provisioning)
+ [コンテナで AWS IoT Greengrass Core ソフトウェアを実行する](#run-greengrass-image-manual-provisioning)
+ [次の手順](#run-greengrass-docker-next-steps)

## 前提条件
<a name="docker-manual-provisioning-prereqs"></a>

このチュートリアルを完了するには、以下が必要です。
+  AWS アカウント。アカウントをお持ちでない場合は、「[のセットアップ AWS アカウント](setting-up.md#set-up-aws-account)」を参照してください。
+ Docker AWS IoT Greengrass イメージ。[Dockerfile AWS IoT Greengrass からイメージを構築](build-greengrass-dockerfile.md)できます。
+ Docker コンテナを実行するホストコンピュータは、以下の要件を満たしている必要があります。
  + <a name="docker-host-reqs"></a>インターネットに接続された Linux ベースのオペレーティングシステム。
  + <a name="docker-engine-reqs"></a>[Docker Engine](https://docs.docker.com/engine/install/) バージョン 18.09 以降。
  + <a name="docker-compose-reqs"></a>(オプション) [Docker Compose](https://docs.docker.com/compose/install/) バージョン 1.22 以降。Docker Compose は、Docker Compose CLI を使用して Docker イメージを実行する場合のみ必要です。

## AWS IoT エンドポイントを取得する
<a name="retrieve-iot-endpoints"></a>

の AWS IoT エンドポイントを取得し AWS アカウント、後で使用するために保存します。デバイスはこれらのエンドポイントを使用して AWS IoTに接続します。以下の操作を実行します。

1.  AWS IoT のデータエンドポイントを取得します AWS アカウント。

   ```
   aws iot describe-endpoint --endpoint-type iot:Data-ATS
   ```

   要求が正常に処理された場合、レスポンスは次の例のようになります。

   ```
   {
     "endpointAddress": "device-data-prefix-ats.iot.us-west-2.amazonaws.com"
   }
   ```

1. の AWS IoT 認証情報エンドポイントを取得します AWS アカウント。

   ```
   aws iot describe-endpoint --endpoint-type iot:CredentialProvider
   ```

   要求が正常に処理された場合、レスポンスは次の例のようになります。

   ```
   {
     "endpointAddress": "device-credentials-prefix.credentials.iot.us-west-2.amazonaws.com"
   }
   ```

## AWS IoT モノを作成する
<a name="create-iot-thing"></a>

AWS IoT *モノ*は、 に接続するデバイスと論理エンティティを表します AWS IoT。Greengrass コアデバイスは AWS IoT モノです。デバイスを AWS IoT モノとして登録すると、そのデバイスはデジタル証明書を使用して認証できます AWS。

このセクションでは、デバイスを表す AWS IoT モノを作成します。

**AWS IoT モノを作成するには**

1. デバイスの AWS IoT モノを作成します。開発用コンピュータに次のコマンドを実行します。
   + *MyGreengrassCore* を使用するモノの名前に置き換えます。この名前は Greengrass コアデバイスの名前でもあります。
**注記**  <a name="install-argument-thing-name-constraint"></a>
モノの名前にコロン (`:`) 記号を含むことができません。

   ```
   aws iot create-thing --thing-name MyGreengrassCore
   ```

   要求が正常に処理された場合、レスポンスは次の例のようになります。

   ```
   {
     "thingName": "MyGreengrassCore",
     "thingArn": "arn:aws:iot:us-west-2:123456789012:thing/MyGreengrassCore",
     "thingId": "8cb4b6cd-268e-495d-b5b9-1713d71dbf42"
   }
   ```

1. (オプション) AWS IoT モノを新規または既存のモノグループに追加します。モノグループを使用して Greengrass コアデバイスのフリートを管理します。ソフトウェアコンポーネントをデバイスにデプロイするとき、個々のデバイスまたはデバイスのグループを対象にできます。アクティブな Greengrass デプロイを持つモノグループにデバイスを追加して、そのモノグループのソフトウェアコンポーネントをデバイスにデプロイできます。以下の操作を実行します。

   1. (オプション) AWS IoT モノのグループを作成します。
      + *MyGreengrassCoreGroup* を作成するモノグループの名前に置き換えます。
**注記**  <a name="install-argument-thing-group-name-constraint"></a>
モノグループ名にコロン (`:`) 記号を含めることはできません。

      ```
      aws iot create-thing-group --thing-group-name MyGreengrassCoreGroup
      ```

      要求が正常に処理された場合、レスポンスは次の例のようになります。

      ```
      {
        "thingGroupName": "MyGreengrassCoreGroup",
        "thingGroupArn": "arn:aws:iot:us-west-2:123456789012:thinggroup/MyGreengrassCoreGroup",
        "thingGroupId": "4df721e1-ff9f-4f97-92dd-02db4e3f03aa"
      }
      ```

   1.  AWS IoT モノをモノのグループに追加します。
      + *MyGreengrassCore* を AWS IoT モノの名前に置き換えます。
      + *MyGreengrassCoreGroup* をモノグループの名前に置き換えます。

      ```
      aws iot add-thing-to-thing-group --thing-name MyGreengrassCore --thing-group-name MyGreengrassCoreGroup
      ```

      要求が正常に処理された場合、コマンドは出力されません。

## モノの証明書を作成する
<a name="create-thing-certificate-mp"></a>

<a name="create-thing-certificate-intro-1"></a>デバイスを AWS IoT モノとして登録すると、そのデバイスはデジタル証明書を使用して認証できます AWS。この証明書により、デバイスは AWS IoT および と通信できます AWS IoT Greengrass。

<a name="create-thing-certificate-intro-2"></a>このセクションでは、デバイスが AWSに接続する際に使用できる証明書を作成してダウンロードします。<a name="create-thing-certificate-cloud-steps"></a>

**モノの証明書を作成するには**

1.  AWS IoT モノの証明書をダウンロードするフォルダを作成します。

   ```
   mkdir greengrass-v2-certs
   ```

1.  AWS IoT モノの証明書を作成してダウンロードします。

   ```
   aws iot create-keys-and-certificate --set-as-active --certificate-pem-outfile greengrass-v2-certs/device.pem.crt --public-key-outfile greengrass-v2-certs/public.pem.key --private-key-outfile greengrass-v2-certs/private.pem.key
   ```

   要求が正常に処理された場合、レスポンスは次の例のようになります。

   ```
   {
     "certificateArn": "arn:aws:iot:us-west-2:123456789012:cert/aa0b7958770878eabe251d8a7ddd547f4889c524c9b574ab9fbf65f32248b1d4",
     "certificateId": "aa0b7958770878eabe251d8a7ddd547f4889c524c9b574ab9fbf65f32248b1d4",
     "certificatePem": "-----BEGIN CERTIFICATE-----
   MIICiTCCAfICCQD6m7oRw0uXOjANBgkqhkiG9w
    0BAQUFADCBiDELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAldBMRAwDgYDVQQHEwdTZ
    WF0dGxlMQ8wDQYDVQQKEwZBbWF6b24xFDASBgNVBAsTC0lBTSBDb25zb2xlMRIw
    EAYDVQQDEwlUZXN0Q2lsYWMxHzAdBgkqhkiG9w0BCQEWEG5vb25lQGFtYXpvbi5
    jb20wHhcNMTEwNDI1MjA0NTIxWhcNMTIwNDI0MjA0NTIxWjCBiDELMAkGA1UEBh
    MCVVMxCzAJBgNVBAgTAldBMRAwDgYDVQQHEwdTZWF0dGxlMQ8wDQYDVQQKEwZBb
    WF6b24xFDASBgNVBAsTC0lBTSBDb25zb2xlMRIwEAYDVQQDEwlUZXN0Q2lsYWMx
    HzAdBgkqhkiG9w0BCQEWEG5vb25lQGFtYXpvbi5jb20wgZ8wDQYJKoZIhvcNAQE
    BBQADgY0AMIGJAoGBAMaK0dn+a4GmWIWJ21uUSfwfEvySWtC2XADZ4nB+BLYgVI
    k60CpiwsZ3G93vUEIO3IyNoH/f0wYK8m9TrDHudUZg3qX4waLG5M43q7Wgc/MbQ
    ITxOUSQv7c7ugFFDzQGBzZswY6786m86gpEIbb3OhjZnzcvQAaRHhdlQWIMm2nr
    AgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAtCu4nUhVVxYUntneD9+h8Mg9q6q+auN
    KyExzyLwaxlAoo7TJHidbtS4J5iNmZgXL0FkbFFBjvSfpJIlJ00zbhNYS5f6Guo
    EDmFJl0ZxBHjJnyp378OD8uTs7fLvjx79LjSTbNYiytVbZPQUQ5Yaxu2jXnimvw
    3rrszlaEXAMPLE=
   -----END CERTIFICATE-----",
     "keyPair": {
       "PublicKey": "-----BEGIN PUBLIC KEY-----\
   MIIBIjANBgkqhkEXAMPLEQEFAAOCAQ8AMIIBCgKCAQEAEXAMPLE1nnyJwKSMHw4h\
   MMEXAMPLEuuN/dMAS3fyce8DW/4+EXAMPLEyjmoF/YVF/gHr99VEEXAMPLE5VF13\
   59VK7cEXAMPLE67GK+y+jikqXOgHh/xJTwo+sGpWEXAMPLEDz18xOd2ka4tCzuWEXAMPLEahJbYkCPUBSU8opVkR7qkEXAMPLE1DR6sx2HocliOOLtu6Fkw91swQWEXAMPLE\\GB3ZPrNh0PzQYvjUStZeccyNCx2EXAMPLEvp9mQOUXP6plfgxwKRX2fEXAMPLEDa\
   hJLXkX3rHU2xbxJSq7D+XEXAMPLEcw+LyFhI5mgFRl88eGdsAEXAMPLElnI9EesG\
   FQIDAQAB\
   -----END PUBLIC KEY-----\
   ",
       "PrivateKey": "-----BEGIN RSA PRIVATE KEY-----\
   key omitted for security reasons\
   -----END RSA PRIVATE KEY-----\
   "
     }
   }
   ```

   後で証明書を設定するために使用する証明書の Amazon リソースネーム (ARN) を保存します。

次に、モノの証明書を設定します。詳細については、「[モノの証明書を設定する](manual-installation.md#configure-thing-certificate)」を参照してください。

## トークン交換ロールを作成する
<a name="create-token-exchange-role"></a>

<a name="installation-create-token-exchange-role-intro"></a>Greengrass コアデバイスは、*トークン交換ロールと呼ばれる IAM サービスロール*を使用して、 AWS サービスへの呼び出しを承認します。デバイスは認証情報 AWS IoT プロバイダーを使用して、このロールの一時的な AWS 認証情報を取得します。これにより、デバイスは Amazon CloudWatch Logs とやり取り AWS IoTしたり、Amazon CloudWatch Logs にログを送信したり、Amazon S3 からカスタムコンポーネントアーティファクトをダウンロードしたりできます。 Amazon CloudWatch 詳細については、「[コアデバイスが AWS サービスとやり取りできるように認可する](device-service-role.md)」を参照してください。

<a name="installation-create-token-exchange-role-alias-intro"></a> AWS IoT *ロールエイリアス*を使用して、Greengrass コアデバイスのトークン交換ロールを設定します。ロールエイリアスは、デバイスのトークン交換ロールを変更できるようにしますが、デバイス設定は同じ内容に保たれます。詳細については、「*AWS IoT Core デベロッパーガイド*」の「[Authorizing direct calls to AWS services](https://docs.aws.amazon.com/iot/latest/developerguide/authorizing-direct-aws.html)」を参照してください。

このセクションでは、トークン交換 IAM ロールと AWS IoT 、ロールを指すロールエイリアスを作成します。Greengrass コアデバイスを既に設定している場合、新しく作成せず、トークン交換ロールとロールエイリアスを使用できます。次に、デバイスの AWS IoT モノを設定してそのロールとエイリアスを使用します。

**トークン交換 IAM ロールを作成するには**

1. <a name="create-token-exchange-role-create-iam-role"></a>デバイスがトークン交換ロールとして使用できる IAM ロールを作成します。以下の操作を実行します。

   1. トークン交換ロールが必要とする、信頼できるポリシードキュメントが含まれるファイルを作成します。

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

      ```
      nano device-role-trust-policy.json
      ```

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

      ```
      {
        "Version": "2012-10-17",		 	 	 
        "Statement": [
          {
            "Effect": "Allow",
            "Principal": {
              "Service": "credentials.iot.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
          }
        ]
      }
      ```

   1. 信頼ポリシードキュメントでトークン交換ロールを作成します。
      + *GreengrassV2TokenExchangeRole* を、作成する IAM ロールの名前に置き換えます。

      ```
      aws iam create-role --role-name GreengrassV2TokenExchangeRole --assume-role-policy-document file://device-role-trust-policy.json
      ```

      要求が正常に処理された場合、レスポンスは次の例のようになります。

      ```
      {
        "Role": {
          "Path": "/",
          "RoleName": "GreengrassV2TokenExchangeRole",
          "RoleId": "AROAZ2YMUHYHK5OKM77FB",
          "Arn": "arn:aws:iam::123456789012:role/GreengrassV2TokenExchangeRole",
          "CreateDate": "2021-02-06T00:13:29+00:00",
          "AssumeRolePolicyDocument": {
            "Version": "2012-10-17",		 	 	 
            "Statement": [
              {
                "Effect": "Allow",
                "Principal": {
                  "Service": "credentials.iot.amazonaws.com"
                },
                "Action": "sts:AssumeRole"
              }
            ]
          }
        }
      ```

   1. トークン交換ロールが必要なアクセスポリシードキュメントを含むファイルを作成します。

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

      ```
      nano device-role-access-policy.json
      ```

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

      ```
      {
        "Version": "2012-10-17",		 	 	 
        "Statement": [
          {
            "Effect": "Allow",
            "Action": [
              "logs:CreateLogGroup",
              "logs:CreateLogStream",
              "logs:PutLogEvents",
              "logs:DescribeLogStreams",
              "s3:GetBucketLocation"
            ],
            "Resource": "*"
          }
        ]
      }
      ```
**注記**  
このアクセスポリシーでは、S3 バケットのコンポーネントアーティファクトへのアクセスが許可されていません。Amazon S3 でアーティファクトを定義するカスタムコンポーネントをデプロイするには、コアデバイスがコンポーネントアーティファクトを取得できるようにする許可をロールに追加する必要があります。詳細については、「[コンポーネントのアーティファクトの S3 バケットへのアクセスを許可する](device-service-role.md#device-service-role-access-s3-bucket)」を参照してください。  
コンポーネントアーティファクトに S3 バケットをまだ持っていない場合、バケットを作成した後でこれらのアクセス許可を追加できます。

   1. ポリシードキュメントから IAM ポリシーを作成します。
      + *GreengrassV2TokenExchangeRoleAccess* を作成する IAM ポリシーの名前に置き換えます。

      ```
      aws iam create-policy --policy-name GreengrassV2TokenExchangeRoleAccess --policy-document file://device-role-access-policy.json
      ```

      要求が正常に処理された場合、レスポンスは次の例のようになります。

      ```
      {
        "Policy": {
          "PolicyName": "GreengrassV2TokenExchangeRoleAccess",
          "PolicyId": "ANPAZ2YMUHYHACI7C5Z66",
          "Arn": "arn:aws:iam::123456789012:policy/GreengrassV2TokenExchangeRoleAccess",
          "Path": "/",
          "DefaultVersionId": "v1",
          "AttachmentCount": 0,
          "PermissionsBoundaryUsageCount": 0,
          "IsAttachable": true,
          "CreateDate": "2021-02-06T00:37:17+00:00",
          "UpdateDate": "2021-02-06T00:37:17+00:00"
        }
      }
      ```

   1. IAM ポリシーをトークン交換ロールにアタッチします。
      + *GreengrassV2TokenExchangeRole* を、IAM ロールの名前に置き換えます。
      + ポリシー ARN を前のステップで作成した IAM ポリシーの ARN に置き換えます。

      ```
      aws iam attach-role-policy --role-name GreengrassV2TokenExchangeRole --policy-arn arn:aws:iam::123456789012:policy/GreengrassV2TokenExchangeRoleAccess
      ```

      要求が正常に処理された場合、コマンドは出力されません。

1. <a name="create-token-exchange-role-create-iot-role-alias"></a>トークン交換 AWS IoT ロールを指すロールエイリアスを作成します。
   + *GreengrassCoreTokenExchangeRoleAlias* を作成するロールエイリアスの名前に置き換えます。
   + ロール ARN を前のステップで作成した IAM ロールの ARN に置き換えます。

   ```
   aws iot create-role-alias --role-alias GreengrassCoreTokenExchangeRoleAlias --role-arn arn:aws:iam::123456789012:role/GreengrassV2TokenExchangeRole
   ```

   要求が正常に処理された場合、レスポンスは次の例のようになります。

   ```
   {
     "roleAlias": "GreengrassCoreTokenExchangeRoleAlias",
     "roleAliasArn": "arn:aws:iot:us-west-2:123456789012:rolealias/GreengrassCoreTokenExchangeRoleAlias"
   }
   ```
**注記**  
ロールエイリアスを作成するには、トークン交換 IAM ロールを AWS IoTに渡す許可が必要です。ロールエイリアスを作成しようとしたときにエラーメッセージが表示された場合は、 AWS ユーザーにこのアクセス許可があることを確認してください。詳細については、「 *AWS Identity and Access Management ユーザーガイド*[」の「 AWS サービスにロールを渡すアクセス許可をユーザーに付与](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_passrole.html)する」を参照してください。

1. Greengrass コアデバイスがロールエイリアスを使用してトークン交換ロールを引き受けることを許可する AWS IoT ポリシーを作成してアタッチします。Greengrass コアデバイスを以前にセットアップしたことがある場合は、新しいロールエイリアスポリシーを作成する代わりに、そのロールエイリアス AWS IoT ポリシーをアタッチできます。以下の操作を実行します。

   1. (オプション) ロールエイリアスに必要な AWS IoT ポリシードキュメントを含むファイルを作成します。

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

      ```
      nano greengrass-v2-iot-role-alias-policy.json
      ```

      次の JSON をファイルにコピーします。
      + リソース ARN をロールエイリアスの ARN に置き換えます。

      ```
      {
        "Version":"2012-10-17",		 	 	 
        "Statement": [
          {
            "Effect": "Allow",
            "Action": "iot:AssumeRoleWithCertificate",
            "Resource": "arn:aws:iot:us-west-2:123456789012:rolealias/GreengrassCoreTokenExchangeRoleAlias"
          }
        ]
      }
      ```

   1.  AWS IoT ポリシードキュメントから ポリシーを作成します。
      + *GreengrassCoreTokenExchangeRoleAliasPolicy* を、作成する AWS IoT ポリシーの名前に置き換えます。

      ```
      aws iot create-policy --policy-name GreengrassCoreTokenExchangeRoleAliasPolicy --policy-document file://greengrass-v2-iot-role-alias-policy.json
      ```

      要求が正常に処理された場合、レスポンスは次の例のようになります。

      ```
      {
        "policyName": "GreengrassCoreTokenExchangeRoleAliasPolicy",
        "policyArn": "arn:aws:iot:us-west-2:123456789012:policy/GreengrassCoreTokenExchangeRoleAliasPolicy",
        "policyDocument": "{
          \\"Version\\":\\"2012-10-17		 	 	 \\",
          \\"Statement\\": [
            {
              \\"Effect\\": \\"Allow\\",
              \\"Action\\": \\"iot:AssumeRoleWithCertificate\\",
              \\"Resource\\": \\"arn:aws:iot:us-west-2:123456789012:rolealias/GreengrassCoreTokenExchangeRoleAlias\\"
            }
          ]
        }",
        "policyVersionId": "1"
      }
      ```

   1.  AWS IoT モノの証明書に AWS IoT ポリシーをアタッチします。
      + *GreengrassCoreTokenExchangeRoleAliasPolicy* をロールエイリアス AWS IoT ポリシーの名前に置き換えます。
      + ターゲット ARN を AWS IoT モノの証明書の ARN に置き換えます。

      ```
      aws iot attach-policy --policy-name GreengrassCoreTokenExchangeRoleAliasPolicy --target arn:aws:iot:us-west-2:123456789012:cert/aa0b7958770878eabe251d8a7ddd547f4889c524c9b574ab9fbf65f32248b1d4
      ```

      要求が正常に処理された場合、コマンドは出力されません。

## デバイスに証明書をダウンロードする
<a name="download-thing-certificates"></a>

以前に、デバイスの証明書を開発用コンピュータにダウンロードしました。このセクションでは、Amazon ルート認証局 (CA) の証明書もダウンロードします。次に、開発用コンピュータとは異なるコンピュータで Docker で AWS IoT Greengrass Core ソフトウェアを実行する場合は、証明書をそのホストコンピュータにコピーします。 AWS IoT Greengrass Core ソフトウェアは、これらの証明書を使用して AWS IoT クラウドサービスに接続します。

**証明書をデバイスにダウンロードするには**

1. 開発用コンピュータで、Amazon ルート認証局 (CA) 証明書をダウンロードします。 AWS IoT 証明書は、デフォルトで Amazon のルート CA 証明書に関連付けられています。

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

   ```
   sudo curl -o ./greengrass-v2-certs/AmazonRootCA1.pem https://www.amazontrust.com/repository/AmazonRootCA1.pem
   ```

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

   ```
   curl -o .\greengrass-v2-certs\AmazonRootCA1.pem https://www.amazontrust.com/repository/AmazonRootCA1.pem
   ```

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

   ```
   iwr -Uri https://www.amazontrust.com/repository/AmazonRootCA1.pem -OutFile .\greengrass-v2-certs\AmazonRootCA1.pem
   ```

------

1. 開発用コンピュータとは異なるデバイスで Docker で AWS IoT Greengrass Core ソフトウェアを実行する場合は、証明書をホストコンピュータにコピーします。開発用コンピュータとホストコンピュータで SSH と SCP が有効になっている場合、開発用コンピュータの `scp` コマンドを実行して、証明書を転送できます。*device-ip-address* をホストコンピュータの IP アドレスに置き換えます。

   ```
   scp -r greengrass-v2-certs/ device-ip-address:~
   ```

## 設定ファイルを作成する
<a name="create-docker-install-configuration-file"></a>

1. ホストコンピュータで、設定ファイルを配置するフォルダを作成します。

   ```
   mkdir ./greengrass-v2-config
   ```

1. テキストエディタを使用して、`./greengrass-v2-config` フォルダに `config.yaml` という名前の設定ファイルを作成します。

   例えば、次のコマンドを実行し、GNU nano を使用して `config.yaml` を作成できます。

   ```
   nano ./greengrass-v2-config/config.yaml
   ```

1. 次の YAML コンテンツをファイルにコピーします。この部分設定ファイルは、システムパラメータと Greengrass nucleus パラメータを指定します。

   ```
   ---
   system:
     certificateFilePath: "/tmp/certs/device.pem.crt"
     privateKeyPath: "/tmp/certs/private.pem.key"
     rootCaPath: "/tmp/certs/AmazonRootCA1.pem"
     rootpath: "/greengrass/v2"
     thingName: "MyGreengrassCore"
   services:
     aws.greengrass.Nucleus:
       componentType: "NUCLEUS"
       version: "nucleus-version"
       configuration:
         awsRegion: "region"
         iotRoleAlias: "GreengrassCoreTokenExchangeRoleAlias"
         iotDataEndpoint: "device-data-prefix-ats.iot.region.amazonaws.com"
         iotCredEndpoint: "device-credentials-prefix.credentials.region.amazonaws.com"
   ```

   次に、以下の値を置き換えます。
   + */tmp/certs*。コンテナの起動時にダウンロードした証明書をマウントする Docker コンテナ内のディレクトリ。
   + `/greengrass/v2`。インストールに使用する Greengrass ルートフォルダ。`GGC_ROOT` 環境変数を使用して、この値を設定します。
   + *MyGreengrassCore*。 AWS IoT モノの名前。
   + *nucleus バージョン*。インストールする AWS IoT Greengrass Core ソフトウェアのバージョン。この値は、ダウンロードした Docker イメージまたは Dockerfile のバージョンと一致する必要があります。`latest` タグ付きの Greengrass Docker イメージをダウンロードした場合は、****docker inspect *image-id***** を使用してイメージのバージョンを確認してください。
   + *リージョン*。 AWS IoT リソースを作成した AWS リージョン 。また、[環境ファイル](#create-env-file-manual-provisioning)の `AWS_REGION` 環境変数に同じ値を指定する必要があります。
   + *GreengrassCoreTokenExchangeRoleAlias*。トークン交換ロールエイリアス。
   + *デバイスデータプレフィックス*。 AWS IoT データエンドポイントのプレフィックス。
   + *device-credentials-prefix*。 AWS IoT 認証情報エンドポイントのプレフィックス。

## 環境ファイルを作成する
<a name="create-env-file-manual-provisioning"></a>

このチュートリアルでは、環境ファイルを使用して、Docker コンテナ内の AWS IoT Greengrass Core ソフトウェアインストーラに渡される環境変数を設定します。また、`docker run` コマンドで [`-e` または `--env` 引数](https://docs.docker.com/engine/reference/commandline/run/#env)を使用して、Docker コンテナに環境変数を設定する、または `docker-compose.yml` ファイルの [`environment` ブロック](https://docs.docker.com/compose/compose-file/compose-file-v3/#environment)で変数を設定することもできます。

1. テキストエディタを使用して、`.env` という名前の環境ファイルを作成します。

   例えば、Linux ベースのシステムでは、次のコマンドを実行し、GNU nano を使用して現在のディレクトリに `.env` を作成できます。

   ```
   nano .env
   ```

1. 次の内容をファイルにコピーします。

   ```
   GGC_ROOT_PATH=/greengrass/v2
   AWS_REGION=region
   PROVISION=false
   COMPONENT_DEFAULT_USER=ggc_user:ggc_group
   INIT_CONFIG=/tmp/config/config.yaml
   ```

   次に、以下の値を置き換えます。
   + `/greengrass/v2`。 AWS IoT Greengrass Core ソフトウェアのインストールに使用するルートフォルダへのパス。
   + *リージョン*。 AWS IoT リソースを作成した AWS リージョン 。[[configuration file]](#create-docker-install-configuration-file) (設定ファイル) の `awsRegion` 設定パラメータに同じ値を指定する必要があります。
   + */tmp/config/*。Docker コンテナの起動時に設定ファイルをマウントするフォルダ。
**注記**  <a name="docker-local-dev-tools-production-environment-warning"></a>
`DEPLOY_DEV_TOOLS` 環境変数を `true` に設定して、[[Greengrass CLI component]](greengrass-cli-component.md) (Greengrass CLI コンポーネント) をデプロイできます。これにより、Docker コンテナ内でカスタムコンポーネントを開発できます。<a name="local-dev-tools-production-environment-warning"></a>このコンポーネントは、本番環境ではなく、開発環境でのみで使用することをお勧めします。このコンポーネントは、通常、本番環境では必要とされない情報や操作へのアクセスを提供します。このコンポーネントを必要なコアデバイスにのみデプロイして、最小特権の原則に従います。

## コンテナで AWS IoT Greengrass Core ソフトウェアを実行する
<a name="run-greengrass-image-manual-provisioning"></a>

このチュートリアルでは、Docker コンテナでビルドした Docker イメージを起動する方法を説明します。Docker CLI または Docker Compose CLI を使用して、Docker コンテナで AWS IoT Greengrass Core ソフトウェアイメージを実行できます。

------
#### [ Docker ]
+ このチュートリアルでは、Docker コンテナでビルドした Docker イメージを起動する方法を説明します。

  ```
  docker run --rm --init -it --name docker-image \
   -v path/to/greengrass-v2-config:/tmp/config/:ro \
   -v path/to/greengrass-v2-certs:/tmp/certs:ro \ 
   --env-file .env \
   -p 8883 \
   your-container-image:version
  ```

  このコマンド例は、[docker run](https://docs.docker.com/engine/reference/commandline/run/) に次の引数を使用します。
  + <a name="docker-run-rm"></a>[https://docs.docker.com/engine/reference/run/#clean-up---rm](https://docs.docker.com/engine/reference/run/#clean-up---rm): コンテナの終了時にクリーンアップを実行します。
  + <a name="docker-run-init"></a>[https://docs.docker.com/engine/reference/run/#specify-an-init-process](https://docs.docker.com/engine/reference/run/#specify-an-init-process): コンテナで init プロセスを使用します。
**注記**  
Docker コンテナを停止するときに AWS IoT Greengrass Core ソフトウェアをシャットダウンするには、 `--init`引数が必要です。
  + <a name="docker-run-it"></a>[https://docs.docker.com/engine/reference/run/#foreground](https://docs.docker.com/engine/reference/run/#foreground): (オプション) Docker コンテナを対話型プロセスとしてフォアグラウンドで実行します。これを `-d` 引数に置き換えて、代わりに Docker コンテナをデタッチモードで実行できます。詳細については、「Docker ドキュメント」の「[デタッチ vs フォアグラウンド](https://docs.docker.com/engine/reference/run/#detached-vs-foreground)」を参照してください。
  + <a name="docker-run-name"></a>[https://docs.docker.com/engine/reference/run/#name---name](https://docs.docker.com/engine/reference/run/#name---name): `aws-iot-greengrass` という名前のコンテナを実行します。
  + <a name="docker-run-v"></a>[https://docs.docker.com/storage/volumes/](https://docs.docker.com/storage/volumes/)。 ボリュームを Docker コンテナにマウントして、設定ファイルと証明書ファイルをコンテナ内で AWS IoT Greengrass 実行できるようにします。
  + <a name="docker-run-env-file"></a>[https://docs.docker.com/engine/reference/commandline/run/#env](https://docs.docker.com/engine/reference/commandline/run/#env)。 (オプション) Docker コンテナ内の AWS IoT Greengrass Core ソフトウェアインストーラに渡される環境変数を設定する環境ファイルを指定します。この引数は、環境変数を設定するための [[environment file]](#create-env-file-manual-provisioning) (環境ファイル) を作成した場合にのみ必要です。環境ファイルを作成していない場合は、`--env` 引数を使用して、「Docker 実行コマンド」で環境変数を直接設定できます。
  + <a name="docker-run-p"></a>[https://docs.docker.com/engine/reference/commandline/run/#publish](https://docs.docker.com/engine/reference/commandline/run/#publish): (オプション) 8883 コンテナポートをホストマシンに公開します。 AWS IoT Greengrass は MQTT トラフィックにポート 8883 を使用するため、MQTT を介して接続および通信する場合は、この引数が必要です。他のポートを開くには、追加の `-p` 引数を使用します。
**注記**  <a name="docker-run-cap-drop"></a>
セキュリティを強化して Docker コンテナを実行するには、`--cap-drop` 引数および `--cap-add` 引数を使用して、コンテナの Linux 機能を選択的に有効にします。詳細については、「Docker ドキュメント」の「[[Runtime privilege and Linux capabilities]](https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities) (ランタイム特権と Linux 機能)」を参照してください。

------
#### [ Docker Compose ]

1. テキストエディタを使用して、`docker-compose.yml` という名前の Docker Compose ファイルを作成します。

   例えば、Linux ベースのシステムでは、次のコマンドを実行し、GNU nano を使用して現在のディレクトリに `docker-compose.yml` を作成できます。

   ```
   nano docker-compose.yml
   ```
**注記**  
 AWSが提供する Compose ファイルの最新バージョンを [GitHub](https://github.com/aws-greengrass/aws-greengrass-docker/releases/) からダウンロードして使用することもできます。

1. Compose ファイルに以下の内容を追加します。ファイルは次の例のようになります。*コンテナ名:バージョン*を Docker イメージの名前に置き換えます。

   ```
   version: '3.7'
    
   services:
     greengrass:
       init: true
       build:
         context: .
       container_name: aws-iot-greengrass
       image: your-container-name:version
       volumes:
         - /path/to/greengrass-v2-config:/tmp/config/:ro
         - /path/to/greengrass-v2-certs:/tmp/certs:ro 
       env_file: .env
       ports:
         - "8883:8883"
   ```<a name="docker-compose-optional-params"></a>

   この例の Compose ファイルでは、以下のパラメータはオプションです。
   + `ports` - 8883 コンテナポートをホストマシンに公開します。は MQTT トラフィックにポート 8883 AWS IoT Greengrass を使用するため、このパラメータは MQTT 経由で接続および通信する場合に必要です。
   + `env_file`— Docker コンテナ内の AWS IoT Greengrass Core ソフトウェアインストーラに渡される環境変数を設定する環境ファイルを指定します。このパラメータは、環境変数を設定するための [[environment file]](#create-env-file-manual-provisioning) (環境ファイル) を作成した場合にのみ必要です。環境ファイルを作成していない場合は、[[environment]](https://docs.docker.com/compose/compose-file/compose-file-v3/#environment) (環境) パラメータを使用して、Compose ファイルで環境変数を直接設定できます。
**注記**  <a name="docker-compose-cap-drop"></a>
セキュリティを強化して Docker コンテナを実行するには、Compose ファイルで `cap_drop` および `cap_add` を使用して、コンテナの Linux 機能を選択的に有効にします。詳細については、「Docker ドキュメント」の「[[Runtime privilege and Linux capabilities]](https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities) (ランタイム特権と Linux 機能)」を参照してください。

1. 次のコマンドを実行して、コンテナを起動します。

   ```
   docker-compose -f docker-compose.yml up
   ```

------

## 次の手順
<a name="run-greengrass-docker-next-steps"></a>

<a name="run-greengrass-docker-success"></a>AWS IoT Greengrass Core ソフトウェアが Docker コンテナで実行されています。次のコマンドを実行して、現在実行中のコンテナのコンテナ ID を取得します。

```
docker ps
```

その後、次のコマンドを実行してコンテナにアクセスし、コンテナ内で実行されている AWS IoT Greengrass Core ソフトウェアを調べることができます。

```
docker exec -it container-id /bin/bash
```

単純なコンポーネントの作成については、「[チュートリアル: AWS IoT Greengrass V2 の開始方法](getting-started.md)」の「[ステップ 4: デバイス上でコンポーネントを開発およびテストする](create-first-component.md)」を参照してください。

**注記**  <a name="run-greengrass-commands-in-docker-note"></a>
`docker exec` を使用して Docker コンテナ内でコマンドを実行すると、これらのコマンドは Docker ログに記録されません。Docker ログにコマンドを記録するには、Docker コンテナに対話型シェルをアタッチします。詳細については、「[インタラクティブシェルを Docker コンテナにアタッチする](docker-troubleshooting.md#debugging-docker-attach-shell)」を参照してください。

 AWS IoT Greengrass Core ログファイルは と呼ばれ`greengrass.log`、 にあります`/greengrass/v2/logs`。コンポーネントログファイルも同じディレクトリにあります。Greengrass ログをホストの一時ディレクトリにコピーするには、次のコマンドを実行します。

```
docker cp container-id:/greengrass/v2/logs /tmp/logs
```

コンテナの終了後、または削除後もログを保持する場合は、Greengrass ディレクトリ全体をマウントするのではなく、`/greengrass/v2/logs` ディレクトリのみをホストの一時ログディレクトリにバインドマウントすることをお勧めします。詳細については、「[Docker コンテナの外部で Greengrass ログを永続化する](docker-troubleshooting.md#debugging-docker-persist-logs)」を参照してください。

<a name="greengrass-docker-stop"></a>実行中の Docker AWS IoT Greengrass コンテナを停止するには、 `docker stop`または を実行します`docker-compose -f docker-compose.yml stop`。このアクションは、`SIGTERM` を Greengrass プロセスに送信し、コンテナで開始されたすべての関連プロセスをシャットダウンします。Docker コンテナは、プロセス PID 1 として `docker-init` の実行可能ファイルで初期化されます。これは、残っているゾンビプロセスを削除するのに役立ちます。詳細については、Docker ドキュメントの「[Specify an init process](https://docs.docker.com/engine/reference/run/#specify-an-init-process)」を参照してください。

<a name="see-docker-troubleshooting"></a>Docker コンテナで AWS IoT Greengrass を実行する際の問題のトラブルシューティングについては、「[Docker コンテナ AWS IoT Greengrass でのトラブルシューティング](docker-troubleshooting.md)」を参照してください。

# Docker コンテナ AWS IoT Greengrass でのトラブルシューティング
<a name="docker-troubleshooting"></a>

以下の情報は、Docker コンテナ AWS IoT Greengrass で を実行する際の問題のトラブルシューティングや、Docker コンテナ AWS IoT Greengrass での に関する問題のデバッグに役立ちます。

**Topics**
+ [Docker コンテナを実行する際に生じる問題のトラブルシューティング](#troubleshooting-container-errors)
+ [Docker コンテナ AWS IoT Greengrass でのデバッグ](#debugging-greengrass-in-docker)

## Docker コンテナを実行する際に生じる問題のトラブルシューティング
<a name="troubleshooting-container-errors"></a>

以下の情報は、Docker コンテナ AWS IoT Greengrass で を実行する際の問題のトラブルシューティングに役立ちます。

**Topics**
+ [エラー: Cannot perform an interactive login from a non TTY device (TTY 以外のデバイスから対話型ログインを実行できません)](#docker-troubleshootin-ecr-get-login-password)
+ [エラー: Unknown options: -no-include-email (不明なオプション: -含めない-電子メール)](#docker-troubleshooting-cli-version)
+ [エラー: A firewall is blocking file Sharing between windows and the containers. (ファイアウォールが、ウィンドウとコンテナー間のファイル共有をブロックしています。)](#docker-troubleshooting-firewall)
+ [エラー: An error occurred (AccessDeniedException) when calling the GetAuthorizationToken operation: User: arn:aws:iam::*account-id*:user/<user-name> is not authorized to perform: ecr:GetAuthorizationToken on resource: \$1 (GetAuthorizationToken 操作の呼び出し中にエラーが発生しました (AccessDeniedException): ユーザー arn:aws:iam::account-id:user/<user-name> には、リソースに対して ecr:GetAuthorizationToken を実行する権限がありません: \$1)](#docker-troubleshooting-ecr-perms)
+ [エラー: You have reached your pull rate limit (プルレート制限に達しました)](#docker-troubleshooting-too-many-requests)

### エラー: Cannot perform an interactive login from a non TTY device (TTY 以外のデバイスから対話型ログインを実行できません)
<a name="docker-troubleshootin-ecr-get-login-password"></a>

`aws ecr get-login-password` コマンドを実行すると、このエラーが発生することがあります。 AWS CLI 最新バージョン 2 またはバージョン 1 がインストールされていることを確認します。 AWS CLI バージョン 2 を使用することをお勧めします。詳細については、「*AWS Command Line Interface ユーザーガイド*」の「[Installing the AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html)」を参照してください。

### エラー: Unknown options: -no-include-email (不明なオプション: -含めない-電子メール)
<a name="docker-troubleshooting-cli-version"></a>

`aws ecr get-login` コマンドを実行すると、このエラーが発生することがあります。 AWS CLI 最新バージョンがインストールされていることを確認します (例: Run: `pip install awscli --upgrade --user`)。詳細については、「 *AWS Command Line Interface ユーザーガイド*[」の「Microsoft Windows AWS Command Line Interface での](https://docs.aws.amazon.com/cli/latest/userguide/awscli-install-windows.html) のインストール」を参照してください。

### エラー: A firewall is blocking file Sharing between windows and the containers. (ファイアウォールが、ウィンドウとコンテナー間のファイル共有をブロックしています。)
<a name="docker-troubleshooting-firewall"></a>

Windows コンピュータで Docker を実行すると、このエラーまたは `Firewall Detected` メッセージが表示されることがあります。このエラーは、仮想プライベートネットワーク (VPN) にサインインしていて、ネットワーク設定が原因で共有ドライブをマウントできない場合にも発生することがあります。このような場合は、VPN をオフにし、Docker コンテナを再実行します。

### エラー: An error occurred (AccessDeniedException) when calling the GetAuthorizationToken operation: User: arn:aws:iam::*account-id*:user/<user-name> is not authorized to perform: ecr:GetAuthorizationToken on resource: \$1 (GetAuthorizationToken 操作の呼び出し中にエラーが発生しました (AccessDeniedException): ユーザー arn:aws:iam::account-id:user/<user-name> には、リソースに対して ecr:GetAuthorizationToken を実行する権限がありません: \$1)
<a name="docker-troubleshooting-ecr-perms"></a>

このエラーは、Amazon ECR リポジトリにアクセスするための十分な権限がない状態で `aws ecr get-login-password` コマンドを実行したときに表示されることがあります。詳細については、「Amazon ECR ユーザーガイド」の「[Amazon ECR リポジトリポリシーの例](https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-policy-examples.html)」および「[1 つの Amazon ECR リポジトリにアクセスする](https://docs.aws.amazon.com/AmazonECR/latest/userguide/security_iam_id-based-policy-examples.html)」を参照してください。

### エラー: You have reached your pull rate limit (プルレート制限に達しました)
<a name="docker-troubleshooting-too-many-requests"></a>

Docker Hub は、匿名ユーザーと無料の Docker Hub ユーザーが行うことができるプルリクエストの数を制限します。匿名ユーザーまたは無料のユーザーのプルリクエストの上限に達すると、次のいずれかのエラーが表示されます。

  

```
ERROR: toomanyrequests: Too Many Requests.
```

  

```
You have reached your pull rate limit.
```

これらのエラーを解決するには、別のプルリクエストを試行する前に数時間を置いてください。多数のプルリクエストを継続的に送信する予定がある場合は、[Docker Hub ウェブサイト](https://www.docker.com/increase-rate-limits)にある制限数に関する情報と、Docker アカウントの認証とアップグレードのオプションに関する情報を参照してください。

## Docker コンテナ AWS IoT Greengrass でのデバッグ
<a name="debugging-greengrass-in-docker"></a>

Docker コンテナの問題をデバッグするには、Greengrass ランタイムログを維持するか、Docker コンテナにインタラクティブシェルをアタッチすることができます。

### Docker コンテナの外部で Greengrass ログを永続化する
<a name="debugging-docker-persist-logs"></a>

 AWS IoT Greengrass コンテナを停止したら、次の`docker cp `コマンドを使用して Greengrass ログを Docker コンテナから一時ログディレクトリにコピーできます。

```
docker cp container-id:/greengrass/v2/logs /tmp/logs
```

コンテナが終了または削除された後もログを保持するには、`/greengrass/v2/logs`ディレクトリをバインドマウントした後に AWS IoT Greengrass Docker コンテナを実行する必要があります。

`/greengrass/v2/logs` ディレクトリをバインドマウントするには、新しい Docker AWS IoT Greengrass コンテナを実行するときに次のいずれかを実行します。
+ `docker run` コマンドに `-v /tmp/logs:/greengrass/v2/logs:ro` を含めます。

  設定ファイル内の `volumes` ブロックを編集して、`docker-compose up` コマンドを実行する前に次の行を含めます。

  ```
  volumes:
   - /tmp/logs:/greengrass/v2/logs:ro
  ```

その後、 AWS IoT Greengrass が Docker コンテナ内で実行されている間に、ホスト`/tmp/logs`の でログをチェックして Greengrass ログを確認できます。

Greengrass Docker コンテナを実行するための情報については、「[手動プロビジョニングを使用して Docker AWS IoT Greengrass で を実行する](run-greengrass-docker-manual-provisioning.md)」および「[自動プロビジョニングを使用して Docker AWS IoT Greengrass で を実行する](run-greengrass-docker-automatic-provisioning.md)」を参照してください。

### インタラクティブシェルを Docker コンテナにアタッチする
<a name="debugging-docker-attach-shell"></a>

Docker コンテナ内でコマンドを実行するにあたり `docker exec` を使用する場合、これらのコマンドは Docker ログにキャプチャされません。コマンドを Docker ログに記録すると、Greengrass Docker コンテナの状態を調査する際に役立ちます。次のいずれかを行います。
+ 別のターミナルで次のコマンドを実行して、ターミナルの標準入力、出力、およびエラーを実行中のコンテナにアタッチします。これにより、現在のターミナルから Docker コンテナを表示して、制御することができます。

  ```
  docker attach container-id
  ```
+ 別のターミナルで次のコマンドを実行します。これにより、コンテナがアタッチされていない場合でも、コマンドをインタラクティブモードで実行できるようになります。

  ```
  docker exec -it container-id sh -c "command > /proc/1/fd/1"
  ```

一般的な AWS IoT Greengrass トラブルシューティングについては、「」を参照してください[トラブルシューティング AWS IoT Greengrass V2](troubleshooting.md)。