2023 年 6 月 30 日に AWS IoT Greengrass Version 1 は延長ライフサイクルフェーズに入りました。詳細については、「AWS IoT Greengrass V1 メンテナンスポリシー」を参照してください。この日付以降、AWS IoT Greengrass V1 の機能、拡張機能、バグ修正、またはセキュリティパッチを提供するアップデートはリリースされません。AWS IoT Greengrass V1 で稼働中のデバイスは中断されず、引き続き動作し、クラウドに接続できます。重要な新機能や新たなプラットフォームのサポートが追加された AWS IoT Greengrass Version 2 への移行を強くお勧めします。
Docker コンテナでの AWS IoT Greengrass の実行
AWS IoT Greengrass は Docker
AWS IoT Greengrass Core ソフトウェアと依存関係がインストールされた Amazon CloudFront から、Dockerfile をダウンロードできます。Docker イメージを変更してさまざまなプラットフォームアーキテクチャで実行するか、Docker イメージのサイズを小さくするには、Docker パッケージダウンロードの README
ファイルを参照してください。
AWS IoT Greengrass の試用を開始しやすいように、AWS には、AWS IoT Greengrass Core ソフトウェアと依存関係がインストールされた Docker イメージもすでに構築されています。イメージは、Docker Hub
重要
2022 年 6 月 30 日、AWS IoT Greengrass は Amazon Elastic Container Registry (Amazon ECR) と Docker Hub に公開されている AWS IoT Greengrass Core ソフトウェア v1.x Docker イメージのメンテナンスを終了します。これらの Docker イメージは、メンテナンス終了から 1 年後の 2023 年 6 月 30 日まで、Amazon ECR および Docker Hub から引き続きダウンロードすることができます。ただし、AWS IoT Greengrass Core ソフトウェア v1.x Docker イメージでは、2022 年 6 月 30 日のメンテナンス終了後、セキュリティパッチやバグ修正が提供されなくなります。これらの Docker イメージに依存する本番ワークロードを実行する場合は、AWS IoT Greengrass が提供する Dockerfiles を使用して、独自の Docker イメージを構築することをお勧めします。詳細については、「AWS IoT Greengrass Docker ソフトウェア」を参照してください。
このトピックでは、AWS IoT Greengrass Docker イメージを Amazon ECR からダウンロードして Windows、macOS、または Linux (x86_64) プラットフォームで実行する方法について説明します。以下の各ステップを示します。
Docker コンテナで AWS IoT Greengrass を実行する場合、次の機能はサポートされません。
[Greengrass container] (Greengrass コンテナ) モードで実行されるコネクタ。Docker コンテナでコネクタを実行するには、コネクタをコンテナなしモードで実行する必要があります。コンテナなしモードをサポートするコネクタを検索するには、「AWS が提供する Greengrass コネクタ」を参照してください。これらのコネクタの一部では、分離モードパラメータを使用されており、[コンテナなし] に設定する必要があります。
ローカルデバイスおよびボリュームリソース。Docker コンテナで実行されるユーザー定義 Lambda 関数は、コア上のデバイスとボリュームに直接アクセスする必要があります。
これらの機能は、Greengrass グループの Lambda ランタイム環境が [No container] (コンテナなし) に設定されている場合はサポートされません。この場合、AWS IoT Greengrass を Docker コンテナで実行する必要があります。
前提条件
このチュートリアルを開始する前に、以下を実行する必要があります。
-
次のソフトウェアおよびバージョンを、選択した AWS Command Line Interface (AWS CLI) バージョンに基づいてホストコンピュータにインストールする必要があります。
-
ユーザーが Amazon Elastic Container Registry (Amazon ECR) のリソースにアクセスできるようにするには、次のアクセス権限を付与する必要があります。
-
Amazon ECR ユーザーがレジストリで認証され、Amazon ECR リポジトリでのイメージのプッシュまたはプルを行えるようにするには、AWS Identity and Access Management(IAM) ポリシーを介して
ecr:GetAuthorizationToken
権限を付与する必要があります。詳細については、「Amazon ECR ユーザーガイド」の「Amazon ECR Repository Policy Examples」(Amazon ECR リポジトリポリシーの例) および「1 つの Amazon ECR リポジトリにアクセスする」を参照してください。
-
ステップ 1: Amazon ECR から AWS IoT Greengrass コンテナイメージを取得する
AWS には AWS IoT Greengrass Core ソフトウェアがインストールされた Docker イメージが用意されています。
警告
v1.11.6 以降の AWS IoT Greengrass Core ソフトウェアでは、Greengrass Docker イメージに Python 2.7 が含まれていません。これは、Python 2.7 のサポートが 2020 年に終了し、セキュリティ更新プログラムを取得できなくなったためです。これらの Docker イメージに更新する場合は、アプリケーションが新しい Docker イメージで動作することを検証した後に、アップデートを本番デバイスに展開することをお勧めします。Greengrass Docker イメージを使用するアプリケーションに Python 2.7 が必要な場合は、Greengrass Dockerfile を変更して、アプリケーションに Python 2.7 を含めることができます。
Amazon ECR から latest
イメージをプルする方法については、お使いのオペレーティングシステムを選択してください。
コンピュータのターミナルで以下のコマンドを実行します。
Amazon ECR の AWS IoT Greengrass レジストリにログインします。
aws ecr get-login-password --region us-west-2 | docker login --username AWS --password-stdin https://216483018798.dkr.ecr.us-west-2.amazonaws.com
成功すると、
Login Succeeded
が出力されます。AWS IoT Greengrass コンテナイメージを取得します。
docker pull 216483018798.dkr.ecr.us-west-2.amazonaws.com/aws-iot-greengrass:latest
注記
latest
イメージには、Amazon Linux 2 ベースイメージにインストールされた最新の安定バージョンの AWS IoT Greengrass Core ソフトウェアが含まれています。他のイメージをリポジトリからプルすることもできます。使用可能なすべてのイメージを確認するには、Docker Hubの [Tags] (タグ) ページを確認するか、aws ecr list-images コマンドを使用してください。例: aws ecr list-images --region us-west-2 --registry-id 216483018798 --repository-name aws-iot-greengrass
シンボリックリンクとハードリンクの保護を有効にします。コンテナでの AWS IoT Greengrass の実行を試用している場合は、現在のブートに対してのみ設定を有効にできます。
注記
これらのコマンドを実行するには、sudo を使用することが必要な場合があります。
-
現在のブートに対してのみ設定を有効にするには、以下のコマンドを使用します。
echo 1 > /proc/sys/fs/protected_hardlinks echo 1 > /proc/sys/fs/protected_symlinks
-
再起動しても維持される設定を有効にするには、以下のコマンドを使用します。
echo '# AWS IoT Greengrass' >> /etc/sysctl.conf echo 'fs.protected_hardlinks = 1' >> /etc/sysctl.conf echo 'fs.protected_symlinks = 1' >> /etc/sysctl.conf sysctl -p
-
IPv4 ネットワーク転送を有効にします。これは、AWS IoT Greengrass クラウドデプロイと MQTT 通信が Linux で機能するために必要です。
/etc/sysctl.conf
ファイルで、net.ipv4.ip_forward
を 1 に設定して、sysctls
を再ロードします。sudo nano /etc/sysctl.conf # set this net.ipv4.ip_forward = 1 sudo sysctl -p
注記
nano の代わりに任意のエディタを使用できます。
コンピュータのターミナルで以下のコマンドを実行します。
Amazon ECR の AWS IoT Greengrass レジストリにログインします。
aws ecr get-login-password --region us-west-2 | docker login --username AWS --password-stdin https://216483018798.dkr.ecr.us-west-2.amazonaws.com
成功すると、
Login Succeeded
が出力されます。AWS IoT Greengrass コンテナイメージを取得します。
docker pull 216483018798.dkr.ecr.us-west-2.amazonaws.com/aws-iot-greengrass:latest
注記
latest
イメージには、Amazon Linux 2 ベースイメージにインストールされた最新の安定バージョンの AWS IoT Greengrass Core ソフトウェアが含まれています。他のイメージをリポジトリからプルすることもできます。使用可能なすべてのイメージを確認するには、Docker Hubの [Tags] (タグ) ページを確認するか、aws ecr list-images コマンドを使用してください。例: aws ecr list-images --region us-west-2 --registry-id 216483018798 --repository-name aws-iot-greengrass
コマンドプロンプトで次のコマンドを実行します。Windows で Docker コマンドを使用する前に、Docker デスクトップが実行されている必要があります。
Amazon ECR の AWS IoT Greengrass レジストリにログインします。
aws ecr get-login-password --region us-west-2 | docker login --username AWS --password-stdin https://216483018798.dkr.ecr.us-west-2.amazonaws.com
成功すると、
Login Succeeded
が出力されます。AWS IoT Greengrass コンテナイメージを取得します。
docker pull 216483018798.dkr.ecr.us-west-2.amazonaws.com/aws-iot-greengrass:latest
注記
latest
イメージには、Amazon Linux 2 ベースイメージにインストールされた最新の安定バージョンの AWS IoT Greengrass Core ソフトウェアが含まれています。他のイメージをリポジトリからプルすることもできます。使用可能なすべてのイメージを確認するには、Docker Hubの [Tags] (タグ) ページを確認するか、aws ecr list-images コマンドを使用してください。例: aws ecr list-images --region us-west-2 --registry-id 216483018798 --repository-name aws-iot-greengrass
ステップ 2: Greengrass のグループとコアを作成して設定する
Docker イメージには AWS IoT Greengrass Core ソフトウェアがインストールされていますが、Greengrass のグループとコアを作成する必要があります。これには、証明書とコア設定ファイルのダウンロードが含まれます。
-
「モジュール 2: AWS IoT Greengrass Core ソフトウェアのインストール」の手順を実行します。AWS IoT Greengrass Core ソフトウェアをダウンロードして、実行するステップはスキップしてください。このソフトウェアとその実行時の依存関係は、Docker イメージにセットアップ済みです。
ステップ 3: AWS IoT Greengrass をローカルで実行する
グループの設定が完了したら、コアを設定して開始する準備ができました。これを実行する方法を示す手順については、以下でオペレーティングシステムを選択します。
コンピュータのターミナルで以下のコマンドを実行します。
-
デバイスのセキュリティリソース用のフォルダを作成し、証明書とキーをそのフォルダに移動します。以下のコマンドを実行します。
path-to-security-files
(セキュリティファイルへのパス) をセキュリティリソースへのパスに置き換え、certificateId
をファイル名に含まれる証明書 ID に置き換えます。mkdir /tmp/certs mv
path-to-security-files
/certificateId
-certificate.pem.crt /tmp/certs mvpath-to-security-files
/certificateId
-public.pem.key /tmp/certs mvpath-to-security-files
/certificateId
-private.pem.key /tmp/certs mvpath-to-security-files
/AmazonRootCA1.pem /tmp/certs -
デバイスの設定用のフォルダを作成し、AWS IoT Greengrass Core 設定ファイルをそのフォルダに移動します。以下のコマンドを実行します。
configuration-file-path
を、設定ファイルへのパスに置き換えます。mkdir /tmp/config mv
path-to-config-file
/config.json /tmp/config AWS IoT Greengrass を開始して、証明書と設定ファイルを Docker コンテナにバインドマウントします。
/tmp
は、証明書と設定ファイルを解凍したパスに置き換えてください。docker run --rm --init -it --name aws-iot-greengrass \ --entrypoint /greengrass-entrypoint.sh \ -v /tmp/certs:/greengrass/certs \ -v /tmp/config:/greengrass/config \ -p 8883:8883 \ 216483018798.dkr.ecr.us-west-2.amazonaws.com/aws-iot-greengrass:latest
出力は、次の例のようになります。
Setting up greengrass daemon Validating hardlink/softlink protection Waiting for up to 30s for Daemon to start Greengrass successfully started with PID: 10
コンピュータのターミナルで以下のコマンドを実行します。
-
デバイスのセキュリティリソース用のフォルダを作成し、証明書とキーをそのフォルダに移動します。以下のコマンドを実行します。
path-to-security-files
(セキュリティファイルへのパス) をセキュリティリソースへのパスに置き換え、certificateId
をファイル名に含まれる証明書 ID に置き換えます。mkdir /tmp/certs mv
path-to-security-files
/certificateId
-certificate.pem.crt /tmp/certs mvpath-to-security-files
/certificateId
-public.pem.key /tmp/certs mvpath-to-security-files
/certificateId
-private.pem.key /tmp/certs mvpath-to-security-files
/AmazonRootCA1.pem /tmp/certs -
デバイスの設定用のフォルダを作成し、AWS IoT Greengrass Core 設定ファイルをそのフォルダに移動します。以下のコマンドを実行します。
configuration-file-path
を、設定ファイルへのパスに置き換えます。mkdir /tmp/config mv
path-to-config-file
/config.json /tmp/config AWS IoT Greengrass を開始して、証明書と設定ファイルを Docker コンテナにバインドマウントします。
/tmp
は、証明書と設定ファイルを解凍したパスに置き換えてください。docker run --rm --init -it --name aws-iot-greengrass \ --entrypoint /greengrass-entrypoint.sh \ -v /tmp/certs:/greengrass/certs \ -v /tmp/config:/greengrass/config \ -p 8883:8883 \ 216483018798.dkr.ecr.us-west-2.amazonaws.com/aws-iot-greengrass:latest
出力は、次の例のようになります。
Setting up greengrass daemon Validating hardlink/softlink protection Waiting for up to 30s for Daemon to start Greengrass successfully started with PID: 10
-
デバイスのセキュリティリソース用のフォルダを作成し、証明書とキーをそのフォルダに移動します。コマンドプロンプトで次のコマンドを実行します。
path-to-security-files
(セキュリティファイルへのパス) をセキュリティリソースへのパスに置き換え、certificateId
をファイル名に含まれる証明書 ID に置き換えます。mkdir C:\Users\%USERNAME%\Downloads\certs move
path-to-security-files
\certificateId
-certificate.pem.crt C:\Users\%USERNAME%\Downloads\certs movepath-to-security-files
\certificateId
-public.pem.key C:\Users\%USERNAME%\Downloads\certs movepath-to-security-files
\certificateId
-private.pem.key C:\Users\%USERNAME%\Downloads\certs movepath-to-security-files
\AmazonRootCA1.pem C:\Users\%USERNAME%\Downloads\certs -
デバイスの設定用のフォルダを作成し、AWS IoT Greengrass Core 設定ファイルをそのフォルダに移動します。コマンドプロンプトで次のコマンドを実行します。
configuration-file-path
を、設定ファイルへのパスに置き換えます。mkdir C:\Users\%USERNAME%\Downloads\config move
path-to-config-file
\config.json C:\Users\%USERNAME%\Downloads\config -
AWS IoT Greengrass を開始して、証明書と設定ファイルを Docker コンテナにバインドマウントします。コマンドプロンプトで次のコマンドを実行します。
docker run --rm --init -it --name aws-iot-greengrass --entrypoint /greengrass-entrypoint.sh -v c:/Users/%USERNAME%/Downloads/certs:/greengrass/certs -v c:/Users/%USERNAME%/Downloads/config:/greengrass/config -p 8883:8883 216483018798.dkr.ecr.us-west-2.amazonaws.com/aws-iot-greengrass:latest
Docker で
C:\
ドライブを Docker デーモンと共有するように要求されたら、Docker コンテナ内でC:\
ディレクトリをバインドマウントすることを許可します。詳細については、Docker ドキュメントの「共有ドライブ」を参照してください。 出力は、次の例のようになります。
Setting up greengrass daemon Validating hardlink/softlink protection Waiting for up to 30s for Daemon to start Greengrass successfully started with PID: 10
注記
コンテナがシェルを開かずにすぐに終了する場合は、イメージを起動したときに Greengrass ランタイムログをバインドマウントすることで問題をデバッグできます。詳細については、「Docker コンテナの外部で Greengrass ランタイムログを永続化する」を参照してください。
ステップ 4: Greengrass グループの「コンテナなし」コンテナ化を設定する
Docker コンテナで AWS IoT Greengrass を実行する場合、すべての Lambda 関数はコンテナ化を使用しないで実行する必要があります。このステップでは、グループのデフォルトのコンテナ化を [No container (コンテナなし)] に設定します。グループを初めてデプロイする前に行う必要があります。
AWS IoT コンソールのナビゲーションペインの [Manage] (管理) で、[Greengrass devices] (Greengrass デバイス) を展開して、[Groups (V1)] (グループ (V1))を選択します。
設定を変更するグループを選択します。
-
[Lambda functions] (Lambda 関数) タブを選択します。
-
[Default Lambda function runtime environment] (デフォルトの Lambda 関数ランタイム環境) から、[Edit] (編集) を選択します。
-
[Edit default Lambda function runtime environment] (デフォルトの Lambda 関数ランタイム環境を編集する) の、[Default Lambda function containerization] (デフォルトの Lambda 関数のコンテナ化) でコンテナ化の設定を変更します。
[Save] を選択します。
変更は、グループのデプロイ時に反映されます。
詳細については、「グループ内の Lambda 関数のコンテナ化のデフォルト設定」を参照してください。
注記
デフォルトでは、Lambda 関数はグループコンテナ化設定を使用します。AWS IoT Greengrass を Docker コンテナで実行しているときに、Lambda 関数の [No container] (コンテナなし) 設定を上書きすると、デプロイは失敗します。
ステップ 5: Lambda 関数を AWS IoT Greengrass Docker コンテナにデプロイする
存続期間の長い Lambda 関数を Greengrass Docker コンテナにデプロイできます。
-
「モジュール 3 (パート 1): AWS IoT Greengrass での Lambda 関数」の手順に従って、存続期間の長い Hello World Lambda 関数をコンテナにデプロイします。
ステップ 6: (オプション) Docker コンテナで実行中の Greengrass を操作するクライアントデバイスをデプロイする
Docker コンテナで実行中の AWS IoT Greengrass を操作するクライアントデバイスをデプロイすることもできます。
-
「モジュール 4: AWS IoT Greengrass グループでのクライアントデバイスの操作」の手順に従って、コアに接続するクライアントデバイスをデプロイして、MQTT メッセージを送信します。
AWS IoT Greengrass Docker コンテナの停止
AWS IoT Greengrass Docker コンテナを停止するには、ターミナルまたはコマンドプロンプトで Ctrl+C を押します。このアクションにより、SIGTERM
が Greengrass デーモンプロセスに送信され、Greengrass デーモンプロセスとデーモンプロセスで開始されたすべての Lambda プロセスが破棄されます。Docker コンテナは /dev/init
プロセスで PID 1 として初期化されます。これにより、残存するゾンビ状態のプロセスが削除されます。詳細については、Docker run リファレンス
Docker コンテナでの AWS IoT Greengrass のトラブルシューティング
以下の情報は、Docker コンテナでの AWS IoT Greengrass の実行に関する問題のトラブルシューティングに役立ちます。
次のエラーが発生する。Cannot perform an interactive login from a non TTY device。
解決策: aws ecr get-login-password
コマンドを実行すると、このエラーが発生することがあります。最新の AWS CLI バージョン 2 またはバージョン 1 がインストールされていることを確認してください。AWS CLI バージョン 2 を使用することをお勧めします。詳細については、「AWS Command Line Interface ユーザーガイド」の「AWS CLI のインストール」を参照してください。
エラー「Unknown options: -no-include-email」が発生する。
解決策: aws ecr get-login
コマンドを実行すると、このエラーが発生することがあります。最新の AWS CLI バージョンがインストールされていることを確認します (例えば、pip install awscli --upgrade --user
を実行します)。Windows を使用していて、MSI インストーラを使用して CLI をインストールした場合、インストールプロセスを繰り返す必要があります。詳細については、「AWS Command Line Interface ユーザーガイド」の「Installing the AWS Command Line Interface on Microsoft Windows 」(Microsoft Windows に - をインストールする) を参照してください。
次の警告が表示される。IPv4 is disabled。ネットワークは機能しません。
解決策: Linux コンピュータで AWS IoT Greengrass を実行すると、この警告または類似のメッセージが表示されることがあります。このステップで説明しているように、IPv4 ネットワーク転送を有効にします。IPv4 転送が有効ではない場合、AWS IoT Greengrass クラウドデプロイと MQTT 通信は機能しません。詳細については、Docker ドキュメントの「Configure namespaced kernel parameters (sysctls) at runtime
エラー: A firewall is blocking file Sharing between windows and the containers. (ファイアウォールが、ウィンドウとコンテナー間のファイル共有をブロックしています。)
解決策: 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: *
このエラーは、Amazon ECR リポジトリにアクセスするための十分な権限がない場合、aws ecr get-login-password
コマンドの実行時に表示されることがあります。詳細については、「Amazon ECR ユーザーガイド」の「Amazon ECR Repository Policy Examples」(Amazon ECR リポジトリポリシーの例) および「1 つの Amazon ECR リポジトリにアクセスする」を参照してください。
一般的な AWS IoT Greengrass のトラブルシューティングヘルプについては、「AWS IoT Greengrass のトラブルシューティング」を参照してください。
Docker コンテナでの AWS IoT Greengrass のデバッグ
Docker コンテナの問題をデバッグするには、Greengrass ランタイムログを維持するか、Docker コンテナにインタラクティブシェルをアタッチすることができます。
Docker コンテナの外部で Greengrass ランタイムログを永続化する
/greengrass/ggc/var/log
ディレクトリをバインドマウントした後で、AWS IoT Greengrass Docker コンテナを実行できます。ログは、コンテナが終了した後または削除された後も保持されます。
- Linux または macOS の場合
-
ホスト上で実行されている Greengrass Docker コンテナを停止してから、ターミナルで次のコマンドを実行します。これは Greengrass の
log
ディレクトリをバインドマウントして Docker イメージを起動します。/tmp
は、証明書と設定ファイルを解凍したパスに置き換えてください。docker run --rm --init -it --name aws-iot-greengrass \ --entrypoint /greengrass-entrypoint.sh \ -v /tmp/certs:/greengrass/certs \ -v /tmp/config:/greengrass/config \ -v /tmp/log:/greengrass/ggc/var/log \ -p 8883:8883 \ 216483018798.dkr.ecr.us-west-2.amazonaws.com/aws-iot-greengrass:latest
次に、ホストの
/tmp/log
でログを確認して、Greengrass が Docker コンテナ内で実行されている間に何が起こったのかを確認できます。 - Windows の場合
-
ホスト上で実行されている Greengrass Docker コンテナを停止してから、コマンドプロンプトで次のコマンドを実行します。これは Greengrass の
log
ディレクトリをバインドマウントして Docker イメージを起動します。cd C:\Users\%USERNAME%\Downloads mkdir log docker run --rm --init -it --name aws-iot-greengrass --entrypoint /greengrass-entrypoint.sh -v c:/Users/%USERNAME%/Downloads/certs:/greengrass/certs -v c:/Users/%USERNAME%/Downloads/config:/greengrass/config -v c:/Users/%USERNAME%/Downloads/log:/greengrass/ggc/var/log -p 8883:8883 216483018798.dkr.ecr.us-west-2.amazonaws.com/aws-iot-greengrass:latest
次に、ホストの
C:/Users/%USERNAME%/Downloads/log
でログを確認して、Greengrass が Docker コンテナ内で実行されている間に何が起こったのかを確認できます。
インタラクティブシェルを Docker コンテナにアタッチするには
インタラクティブシェルをアタッチして、AWS IoT Greengrass Docker コンテナを実行できます。これは、Greengrass Docker コンテナの状態を調査するのに役立ちます。
- Linux または macOS の場合
-
Greengrass Docker コンテナの実行中に、別の端末で次のコマンドを実行してください。
docker exec -it $(docker ps -a -q -f "name=aws-iot-greengrass") /bin/bash
- Windows の場合
-
Greengrass Docker コンテナの実行中に、別のコマンドプロンプトで次のコマンドを実行してください。
docker ps -a -q -f "name=aws-iot-greengrass"
gg-container-id
を、前のコマンドから得られたcontainer_id
の結果に置き換えます。docker exec -it
gg-container-id
/bin/bash