Docker コンテナの実行
AWS IoT Greengrass コンポーネントが、次の場所に保存されているイメージの Docker
-
Amazon Elastic Container Registry (Amazon ECR) のパブリックイメージリポジトリおよびプライベートイメージリポジトリ
-
パブリック Docker Hub リポジトリ
-
パブリック Docker の信頼レジストリ
-
S3 バケット
カスタムコンポーネントで、Docker イメージ URI をアーティファクトとして含めて、イメージを取得してコアデバイスに実行します。Amazon ECR と Docker Hub イメージの場合、Docker アプリケーションマネージャーコンポーネントを使用して、プライベート Amazon ECR リポジトリ用にイメージのダウンロードと認証情報の管理ができます。
トピック
要件
コンポーネントの Docker コンテナを実行するには、次のものが必要です:
-
Greengrass コアデバイス。アカウントをお持ちでない場合は、「チュートリアル: AWS IoT Greengrass V2 の開始方法」を参照してください。
-
Docker Engine
1.9.1 以降が Greengrass コアにインストールされていいること。バージョン 20.10 は、AWS IoT Greengrass Core ソフトウェアとの動作が確認されている最新バージョンです。Docker コンテナを実行するコンポーネントをデプロイする前に、コアデバイスに直接、Docker をインストールしておく必要があります。 ヒント
コンポーネントのインストール時に、Docker Engine をインストールするようにコアデバイスを設定することもできます。例えば、次のインストールスクリプトは、Docker イメージをロードする前に Docker Engine をインストールします。このインストールスクリプトは、Ubuntu など、 Debian ベースの Linux ディストリビューションに動作します。このコマンドで Docker Engine をインストールするようにコンポーネントを設定する場合、ライフサイクルスクリプトに
RequiresPrivilege
をtrue
に設定して、インストールとdocker
コマンドを実行する必要があります。詳細については、「AWS IoT Greengrass コンポーネントレシピのリファレンス」を参照してください。apt-get install docker-ce docker-ce-cli containerd.io && docker load -i {artifacts:path}/
hello-world.tar
-
Docker コンテナコンポーネントを実行するシステムユーザーには、ルート権限または管理者権限が必要です。権限がない場合は、ルート権限または管理者権限を持たないユーザーとして実行されるように Docker を設定する必要があります。
-
Linux デバイスでは、ユーザーを
docker
グループに追加することで、sudo
のないdocker
コマンドを呼び出せます。 -
Windows デバイスでは、ユーザーを
docker-users
グループ に追加することで、管理者の権限のないdocker
コマンドを呼び出せます。
-
-
Docker コンテナ内にある Docker コンテナコンポーネントによってアクセスされるボリュームとしてマウントされた
ファイル。 -
AWS IoT Greengrass Core ソフトウェアがネットワークプロキシを使用するように設定している場合、Docker が同じプロキシサーバーを使用するように設定
する必要があります。
これらの要件に加えて、環境に該当する場合、次の要件も満たす必要があります:
-
Docker Compose
を使用して Docker コンテナを作成して起動するには、Greengrass コアデバイスに Docker Compose をインストールして、Docker Compose ファイルを S3 バケットにアップロードします。Compose ファイルは、コンポーネントと同じ AWS アカウント と AWS リージョン の S3 バケットに保存する必要があります。カスタムコンポーネントに docker-compose up
コマンドを使用する例については、「Amazon ECR または Docker Hub のパブリックイメージから Docker コンテナを実行する」を参照してください。 -
AWS IoT Greengrass をネットワークプロキシの背後で実行する場合、Docker デーモンがプロキシサーバー
を使用するように設定してください。 -
Docker イメージが Amazon ECR または Docker Hub に保存されている場合、Docker コンポーネントマネージャーコンポーネントを Docker コンテナコンポーネントの従属関係として含めます。コンポーネントをデプロイする前に、コアデバイスの Docker デーモンを起動する必要があります。
また、イメージ URI をコンポーネントアーティファクトとして含めます。イメージ URI は、次の例で示すように、形式
docker:
である必要があります。registry
/image
[:tag|@digest
]-
プライベート Amazon ECR イメージ:
docker:
account-id
.dkr.ecr.region
.amazonaws.com/repository
/image
[:tag|@digest
] -
パブリック Amazon ECR イメージ:
docker:public.ecr.aws/
repository
/image
[:tag|@digest
] -
パブリック Docker Hub イメージ:
docker:
name
[:tag|@digest
]
パブリックリポジトリに格納されているイメージから Docker コンテナを実行する方法の詳細については、「Amazon ECR または Docker Hub のパブリックイメージから Docker コンテナを実行する」を参照してください。
-
-
Docker イメージが Amazon ECR プライベートリポジトリに格納されている場合、トークン交換のサービスコンポーネントを従属関係として Docker コンテナコンポーネントに含める必要があります。また、Greengrass デバイスのロールは、以下の IAM ポリシー例で示されているように、
ecr:GetAuthorizationToken
、ecr:BatchGetImage
、ecr:GetDownloadUrlForLayer
アクションを許可する必要があります。{ "Version": "2012-10-17", "Statement": [ { "Action": [ "ecr:GetAuthorizationToken", "ecr:BatchGetImage", "ecr:GetDownloadUrlForLayer" ], "Resource": [ "*" ], "Effect": "Allow" } ] }
Amazon ECR プライベートリポジトリに格納されているイメージから Docker コンテナを実行する方法の情報については、「Amazon ECR のプライベートイメージから Docker コンテナを実行」を参照してください。
-
Amazon ECR プライベートリポジトリに格納されている Docker イメージを使用するには、プライベートリポジトリがコアデバイスと同じ AWS リージョン にある必要があります。
-
Docker イメージまたは Compose ファイルが S3 バケットに保存されている場合、Greengrass デバイスのロールは
s3:GetObject
許可を付与して、次の IAM ポリシーの例で示すように、コアデバイスがコンポーネントアーティファクトとしてイメージをダウンロードできるようにする必要があります。{ "Version": "2012-10-17", "Statement": [ { "Action": [ "s3:GetObject" ], "Resource": [ "*" ], "Effect": "Allow" } ] }
Amazon S3 に格納されているイメージから Docker コンテナを実行する方法の情報については、「Amazon S3 のイメージから Docker コンテナの実行」を参照してください。
-
Docker コンテナコンポーネントのプロセス間通信 (IPC)、AWS 認証情報、ストリームマネージャーを使用するには、Docker コンテナの実行時に追加のオプションを指定する必要があります。詳細については、次を参照してください:
Amazon ECR または Docker Hub のパブリックイメージから Docker コンテナを実行する
このセクションでは、Docker Compose を使用して Amazon ECR と Docker Hub に格納されている Docker イメージから Docker コンテナを実行するカスタムコンポーネントを作成する方法について説明します。
Docker Compose を使用して Docker コンテナを実行するには
-
Docker Compose ファイルを作成して Amazon S3 バケットにアップロードします。Greengrass デバイスのロール がデバイスが Compose ファイルにアクセスできるようにする
s3:GetObject
許可を付与することを確認します。次の例で示す Compose ファイルの例には、Amazon ECR の Amazon CloudWatch エージェントイメージと、Docker Hub の MySQL イメージが含まれています。version: "3" services: cloudwatchagent: image: "public.ecr.aws/cloudwatch-agent/cloudwatch-agent:latest" mysql: image: "mysql:8.0"
-
AWS IoT Greengrass コアデバイスに カスタムコンポーネントを作成します。次の例に示すレシピの例には、次のプロパティがあります:
-
従属関係としての Docker アプリケーション マネージャー コンポーネント。このコンポーネントは、AWS IoT Greengrass がパブリック Amazon ECR と Docker Hub リポジトリからイメージをダウンロードできるようにします。
-
パブリック Amazon ECR リポジトリの Docker イメージを指定するコンポーネントアーティファクト。
-
パブリック Docker Hub リポジトリの Docker イメージを指定するコンポーネントアーティファクト。
-
実行する Docker イメージのコンテナを含む Docker Compose ファイルを指定するコンポーネントアーティファクト。
-
指定したイメージからコンテナを作成して起動するため、docker-compose up
を使用するライフサイクル実行スクリプト。
注記
Docker コンテナコンポーネントのプロセス間通信 (IPC)、AWS 認証情報、ストリームマネージャーを使用するには、Docker コンテナの実行時に追加のオプションを指定する必要があります。詳細については、次を参照してください:
-
-
コンポーネントをテストしてが正常に作動することを確認します。
重要
コンポーネントをデプロイする前に、Docker デーモンをインストールして起動する必要があります。
コンポーネントをローカルにデプロイした後、Docker コンテナ ls
コマンドを実行してコンテナが実行されていることを確認できます。 docker container ls
-
コンポーネントの準備ができたら、コンポーネントを AWS IoT Greengrass にアップロードして他のコアデバイスにデプロイします。詳細については、「コアデバイスにデプロイするコンポーネントをパブリッシュ」を参照してください。
Amazon ECR のプライベートイメージから Docker コンテナを実行
このセクションでは、Amazon ECR のプライベートリポジトリに格納されている Docker イメージから、Docker コンテナを実行するカスタムコンポーネントを作成する方法について説明します。
Docker コンテナを実行するには
-
AWS IoT Greengrass コアデバイスに カスタムコンポーネントを作成します。次のプロパティが含まれる次のレシピの例を使用します:
-
従属関係としての Docker アプリケーション マネージャー コンポーネント。このコンポーネントは、AWS IoT Greengrass がプライベートリポジトリからイメージをダウンロードするための認証情報を管理できるようにします。
-
従属関係としてのトークン交換のサービスコンポーネント。このコンポーネントは、AWS IoT Greengrass が Amazon ECR とやり取りするための AWS 認証情報を取得できるようにします。
-
プライベート Amazon ECR リポジトリの Docker イメージを指定するコンポーネントアーティファクト。
-
イメージからコンテナを作成して起動するため、docker 実行
を使用するライフサイクル実行スクリプト。
注記
Docker コンテナコンポーネントのプロセス間通信 (IPC)、AWS 認証情報、ストリームマネージャーを使用するには、Docker コンテナの実行時に追加のオプションを指定する必要があります。詳細については、次を参照してください:
-
-
コンポーネントをテストしてが正常に作動することを確認します。
重要
コンポーネントをデプロイする前に、Docker デーモンをインストールして起動する必要があります。
コンポーネントをローカルにデプロイした後、Docker コンテナ ls
コマンドを実行してコンテナが実行されていることを確認できます。 docker container ls
-
コンポーネントを AWS IoT Greengrass にアップロードして、他のコアデバイスにデプロイします。詳細については、「コアデバイスにデプロイするコンポーネントをパブリッシュ」を参照してください。
Amazon S3 のイメージから Docker コンテナの実行
このセクションでは、Amazon S3 に格納されている Docker イメージのコンポーネントに Docker コンテナを実行する方法について説明します。
Amazon S3 のイメージのコンポーネントに Docker コンテナを実行するには
-
docker 保存
コマンドを実行して、Docker コンテナのバックアップを作成します。このバックアップは、AWS IoT Greengrass でコンテナを実行するコンポーネントアーティファクトとして提供します。 hello-world
をイメージの名前に置き換えて、hello-world.tar
を作成するアーカイブファイルの名前に置き換えます。docker save
hello-world
>artifacts/com.example.MyDockerComponent/1.0.0/hello-world.tar
-
AWS IoT Greengrass コアデバイスに カスタムコンポーネントを作成します。次のプロパティが含まれる次のレシピの例を使用します:
-
アーカイブから Docker イメージをロードするため、docker ロード
を使用するライフサイクル インストール スクリプト。 -
イメージからコンテナを作成して起動するため、docker 実行
を使用するライフサイクル実行スクリプト。 --rm
オプションは、コンテナの終了時にコンテナのクリーンアップが実行します。
注記
Docker コンテナコンポーネントのプロセス間通信 (IPC)、AWS 認証情報、ストリームマネージャーを使用するには、Docker コンテナの実行時に追加のオプションを指定する必要があります。詳細については、次を参照してください:
-
-
コンポーネントをテストしてが正常に作動することを確認します。
コンポーネントをローカルにデプロイした後、Docker コンテナ ls
コマンドを実行してコンテナが実行されていることを確認できます。 docker container ls
-
コンポーネントの準備ができたら、S3 バケットに Docker イメージアーカイブをアップロードし、コンポーネントレシピに URI を追加します。次に、コンポーネントを AWS IoT Greengrass にアップロードして他のコアデバイスに展開できます。詳細については、「コアデバイスにデプロイするコンポーネントをパブリッシュ」を参照してください。
完了したら、コンポーネントレシピは次の例のようになります。
Docker コンテナコンポーネントでプロセス間通信の使用
AWS IoT Device SDK で Greengrass プロセス間通信 (IPC) ライブラリを使用して Greengrass nucleus、他の Greengrass コンポーネント、AWS IoT Core と通信できます。詳細については、「AWS IoT Device SDK を使用して Greengrass nucleus、その他のコンポーネント、および AWS IoT Core と通信する」を参照してください。
Docker コンテナコンポーネントで IPC を使用するには、次のパラメータで Docker コンテナを実行する必要があります。
-
IPC ソケットをコンテナに取り付けます。Greengrass nucleus は、
AWS_GG_NUCLEUS_DOMAIN_SOCKET_FILEPATH_FOR_COMPONENT
環境変数で IPC ソケットファイルパスを提供します。 -
SVCUID
とAWS_GG_NUCLEUS_DOMAIN_SOCKET_FILEPATH_FOR_COMPONENT
の環境変数を Greengrass nucleus がコンポーネントに提供する値に設定します。コンポーネントは、これらの環境変数を使用して Greengrass nucleus への接続を認証します。
例 レシピの例: AWS IoT Core (Python) に MQTT メッセージをパブリッシュ
次のレシピは、MQTT メッセージを AWS IoT Core にパブリッシュする Docker コンテナコンポーネントの例を定義します。このレシピには以下のプロパティがあります。
-
accessControl
コンポーネントに対して、すべてのトピックについて MQTT メッセージを AWS IoT Core にパブリッシュすることを許可する承認ポリシー。詳細については、「コンポーネントに IPC オペレーションの実行を許可する」と「AWS IoT Core MQTT IPC 承認」を参照してください。 -
Amazon S3 の Docker イメージを TAR アーカイブとして指定するコンポーネントアーティファクト。
-
TAR アーカイブから Docker イメージをロードするライフサイクル インストール スクリプト。
-
イメージから Docker コンテナを実行するライフサイクル実行スクリプト。Docker 実行
コマンドは次の引数がありります。 -
-v
引数は Greengrass IPC ソケットをコンテナにマウントします。 -
最初の 2 つの
-e
引数は、Docker コンテナに必要な環境変数を設定します。 -
追加の
-e
引数は、この例で使用される環境変数を設定します。 -
--rm
引数は、終了時にコンテナのクリーンアップを実行します。
-
Docker コンテナコンポーネント (Linux) でAWS 認証情報の使用
トークン交換のサービスコンポーネントを使用して Greengrass コンポーネントの AWS サービスとやり取りできます。このコンポーネントは、ローカル コンテナ サーバーを使用してコアデバイスのトークン交換ロールの AWS 認証情報を提供します。詳細については、「AWS サービスとやり取り」を参照してください。
注記
このセクションの例は Linux コアデバイスにのみ使えます。
Docker コンテナコンポーネントのトークン交換サービスの AWS 認証情報を使用するには、次のパラメータで Docker コンテナを実行する必要があります。
-
--network=host
引数を使用して、ホストネットワークへのアクセスを提供します。このオプションは、Docker コンテナがローカルトークン交換サービスに接続して AWS 認証情報を取得できるようにします。この引数は、Linux 用 Docker にのみ機能します。警告
このオプションは、コンテナがホストのすべてのローカル ネットワーク インターフェイスにアクセスできるようにするため、このオプションは、ホストネットワークにこのアクセスなしで Docker コンテナを実行した場合よりも安全性が低くなります。このオプションを使用する Docker コンテナコンポーネントを開発して実行するときに、この点に注意してください。詳細については、「Docker マニュアル」の「ネットワーク: ホスト
」を参照してください。 -
AWS_CONTAINER_CREDENTIALS_FULL_URI
とAWS_CONTAINER_AUTHORIZATION_TOKEN
の環境変数を Greengrass nucleus がコンポーネントに提供する値に設定します。AWSSDK はこれらの環境変数を使用して AWS 認証情報を取得します。
例 レシピの例: Docker コンテナコンポーネント (Python) で S3 バケットを一覧表示
次のレシピは、AWS アカウント の S3 バケットを一覧表示する Docker コンテナコンポーネントの例を定義します。このレシピには以下のプロパティがあります。
-
従属関係としてのトークン交換のサービスコンポーネント。この依存関係は、コンポーネントが AWS 認証情報を取得して他の AWS サービスとやり取りできるようにします。
-
Amazon S3 の Docker イメージを TAR アーカイブとして指定するコンポーネントアーティファクト。
-
TAR アーカイブから Docker イメージをロードするライフサイクル インストール スクリプト。
-
イメージから Docker コンテナを実行するライフサイクル実行スクリプト。Docker 実行
コマンドは次の引数がありります。 -
--network=host
引数は、コンテナがホストネットワークにアクセスを提供するため、コンテナがトークン交換サービスに接続できます。 -
-e
引数は、Docker コンテナの必要な環境変数を設定します。 -
--rm
引数は、終了時にコンテナのクリーンアップを実行します。
-
Docker コンテナコンポーネント (Linux) でストリームマネージャーの使用
ストリーム マネージャー コンポーネント を使用して Greengrass コンポーネントのデータストリームを管理します。このコンポーネントは、データストリーム処理と大量の IoT データを AWS クラウド に転送できるようにします。AWS IoT Greengrass は、ストリームマネージャーコンポーネントとやり取りするために使用するストリームマネージャー SDK を提供します。詳細については、「Greengrass コアデバイスでのデータストリームの管理」を参照してください。
注記
このセクションの例は Linux コアデバイスにのみ使えます。
Docker コンテナコンポーネントでストリームマネージャー SDK を使用するには、次のパラメータで Docker コンテナを実行する必要があります。
-
--network=host
引数を使用して、ホストネットワークへのアクセスを提供します。このオプションは、Docker コンテナがローカル TLS 接続を介してストリームマネージャーコンポーネントとやり取りできるようにします。この引数は Linux 用 Docker にのみ使えます警告
このオプションは、コンテナがホストのすべてのローカル ネットワーク インターフェイスにアクセスできるようにするため、このオプションは、ホストネットワークにこのアクセスなしで Docker コンテナを実行した場合よりも安全性が低くなります。このオプションを使用する Docker コンテナコンポーネントを開発して実行するときに、この点に注意してください。詳細については、「Docker マニュアル」の「ネットワーク: ホスト
」を参照してください。 -
認証を要求する (デフォルト動作) ようにストリーム マネージャー コンポーネントを設定する場合、
AWS_CONTAINER_CREDENTIALS_FULL_URI
環境変数を Greengrass nucleus がコンポーネントに提供する値に設定します。詳細については、「ストリームマネージャーの設定」を参照してください。 -
ストリーム マネージャー コンポーネントがデフォルト以外のポートを使用するように設定する場合は、プロセス間通信 (IPC) を使用してストリーム マネージャー コンポーネント設定からポートを取得します。IPC を使用するには、追加オプションを指定して Docker コンテナを実行する必要があります。詳細については、次を参照してください:
例 レシピの例: Docker コンテナコンポーネント (Python) で S3 バケットにファイルのストリーミング
次のレシピは、ファイルを作成して S3 バケットにストリーミングする Docker コンテナコンポーネントの例を定義します。このレシピには以下のプロパティがあります。
-
従属関係としてのストリーム マネージャー コンポーネント。この依存関係により、コンポーネントはストリームマネージャー SDK を使用してストリームマネージャーコンポーネントとやり取りできます。
-
Amazon S3 の Docker イメージを TAR アーカイブとして指定するコンポーネントアーティファクト。
-
TAR アーカイブから Docker イメージをロードするライフサイクル インストール スクリプト。
-
イメージから Docker コンテナを実行するライフサイクル実行スクリプト。Docker 実行
コマンドは次の引数がありります。 -
--network=host
引数は、コンテナにホストネットワークへのアクセスを提供するため、コンテナがストリームマネージャーコンポーネントに接続できます。 -
最初の
-e
引数は、Docker コンテナの必要なAWS_CONTAINER_AUTHORIZATION_TOKEN
環境変数を設定します。 -
追加の
-e
引数は、この例で使用される環境変数を設定します。 -
-v
引数は、コンポーネントの作業フォルダをコンテナにマウントします。この例では、ストリームマネージャーを使用して、Amazon S3 にアップロードするファイルを作業フォルダに作成します。 -
--rm
引数は、終了時にコンテナのクリーンアップを実行します。
-