AWS IoT Greengrass Version 1 は、2023 年 6 月 30 日に延長ライフフェーズに入りました。詳細については、「AWS IoT Greengrass V1 メンテナンスポリシー」を参照してください。この日以降、 AWS IoT Greengrass V1 は機能、機能強化、バグ修正、またはセキュリティパッチを提供する更新をリリースしません。で実行されるデバイスは中断 AWS IoT Greengrass V1 されず、引き続き運用され、クラウドに接続されます。への移行 AWS IoT Greengrass Version 2を強くお勧めします。これにより、重要な新機能が追加され、追加のプラットフォーム がサポートされます。
翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
Docker アプリケーションのデプロイコネクタ
Greengrass Docker アプリケーションデプロイコネクタを使用すると、AWS IoT Greengrass Core での Docker イメージの実行が容易になります。コネクタは、Docker Compose を使用して、docker-compose.yml
ファイルからマルチコンテナ Docker アプリケーションを起動します。具体的には、コネクタは、単一のコアデバイス上の Docker コンテナを管理する docker-compose
コマンドを実行します。詳細については、Docker ドキュメントの「Docker 作成の概要
Greengrass グループをデプロイすると、コネクタによって最新のイメージがプルされて Docker コンテナが起動します。実行されるコマンドは docker-compose pull
と docker-compose
up
です。コネクタは次にそのコマンドのステータスを、出力 MQTT トピックに発行します。また、Docker コンテナの実行に関するステータス情報をログに記録します。これにより、Amazon でアプリケーションログをモニタリングできます CloudWatch。詳細については、「AWS IoT Greengrass ログでのモニタリング」を参照してください。このコネクタは、Greengrass デーモンが再起動するたびに Docker コンテナも起動します。コアで実行できる Docker コンテナの数は、ハードウェアによって異なります。
Docker コンテナはコアデバイス上の Greengrass ドメインの外部で実行されるため、コアのプロセス間通信 (IPC) にアクセスできません。ただし、ローカル Lambda 関数など、一部の通信チャネルを Greengrass コンポーネントで構成できます。詳細については、「Docker コンテナとの通信」を参照してください。
コネクタは、コアデバイスで Web サーバーや MySQL サーバーをホストするなどのシナリオに使用できます。Docker アプリケーションのローカルサービスは、相互に、ローカル環境内の他のプロセス、およびクラウドサービスと通信できます。例えば、Lambda 関数からクラウド内の Web サービスにリクエストを送信する Web サーバーをコアで実行できます。
このコネクタは、コンテナなしモードで実行されるため、Greengrass コンテナ化なしで実行される Greengrass グループにデプロイできます。
このコネクタには、次のバージョンがあります。
バージョン |
ARN |
---|---|
7 |
|
6 |
|
5 |
|
4 |
|
3 |
|
2 |
|
1 |
|
バージョンの変更については、「Changelog」を参照してください。
要件
このコネクタには以下の要件があります。
-
AWS IoT Greengrass Core ソフトウェア v1.10 以降。
注記
このコネクタは OpenWrt ディストリビューションではサポートされていません。
-
Python
バージョン 3.7 または 3.8 が Core デバイスにインストールされ、PATH 環境変数に追加されている。 注記
Python 3.8 を使用するには、次のコマンドを実行して、Python 3.7 のデフォルトのインストールフォルダからインストール済みの Python 3.8 バイナリへのシンボリックリンクを作成します。
sudo ln -s
path-to-python-3.8
/python3.8 /usr/bin/python3.7これにより、AWS IoT Greengrass の Python 要件を満たすようにデバイスが設定されます。
-
Docker コンテナの実行を監視するためのコネクタ用の Greengrass コアには、最低 36 MB の RAM が必要です。総メモリ要件は、コアで実行される Docker コンテナの数によって異なります。
-
Docker Engine
1.9.1 以降は Greengrass コアにインストールされています。バージョン 19.0.3 は、コネクタで動作することが確認された最新バージョンです。 docker
実行可能ファイルは、/usr/bin
ディレクトリまたは/usr/local/bin
ディレクトリにある必要があります。重要
Docker 認証情報のローカルコピーを保護するために、認証情報ストアをインストールすることをお勧めします。詳細については、「セキュリティ上の考慮事項」を参照してください。
Amazon Linux ディストリビューションに Docker をインストールする方法については、「Amazon Elastic Container Service デベロッパーガイド」の「Amazon ECS で使用するコンテナイメージの作成」を参照してください。
-
Docker Compose
は、Greengrass のコアにインストールされています。 docker-compose
実行可能ファイルは、/usr/bin
ディレクトリまたは/usr/local/bin
ディレクトリにある必要があります。次の Docker Compose のバージョンは、コネクタで動作することが確認されています。
コネクタのバージョン
検証済みの Docker Compose バージョン
7
1.25.4
6
1.25.4
5
1.25.4
4
1.25.4
3
1.25.4
2
1.25.1
1
1.24.1
-
1 つの Docker Compose ファイル (例えば、
docker-compose.yml
) が、Amazon Simple Storage Service (Amazon S3) に格納されている。フォーマットは、コアにインストールされている Docker Compose のバージョンと互換性がある必要があります。コアで使用する前に、ファイルをテストする必要があります。Greengrass グループのデプロイ後にファイルを編集する場合は、グループを再デプロイして、コア上のローカルコピーを更新する必要があります。 -
ローカルの Docker デーモンを呼び出し、Compose ファイルのローカルコピーを格納するディレクトリに書き込む権限を持つ Linux ユーザー。詳細については、「コアでの Docker ユーザーの設定」を参照してください。
-
Compose ファイルを含む S3 バケットでの
s3:GetObject
アクションを許可する Greengrass グループロール。このアクセス許可は、次の IAM ポリシーの例に示されています。{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowAccessToComposeFileS3Bucket", "Action": [ "s3:GetObject", "s3:GetObjectVersion" ], "Effect": "Allow", "Resource": "arn:aws:s3:::
bucket-name
/*" } ] }注記
S3 バケットでバージョニングが有効になっている場合は、ロールについても
s3:GetObjectVersion
アクションを許可するように設定されている必要があります。詳細については、「Amazon Simple Storage Service ユーザーガイド」の「Using versioning」(バージョニングの使用) を参照してください。グループロール要件では、必要なアクセス許可を付与するようにロールを設定し、ロールがグループに追加されていることを確認する必要があります。詳細については、Greengrass グループロールの管理 (コンソール)またはGreengrass グループロールの管理 (CLI)を参照してください。
-
Docker Compose ファイルが Amazon ECR に保存されている Docker イメージを参照する場合、Greengrass グループロールは次のことを許可するように設定されています。
-
ecr:GetDownloadUrlForLayer
およびecr:BatchGetImage
は、Docker イメージを含む Amazon ECR リポジトリで実行します。 -
ecr:GetAuthorizationToken
は、リソースを実行します。
リポジトリは、コネクタと同じ AWS アカウント と AWS リージョン に存在する必要があります。
重要
グループロールのアクセス許可は、Greengrass グループ内のすべての Lambda 関数とコネクタによって引き継ぐことができます。詳細については、「セキュリティ上の考慮事項」を参照してください。
これらのアクセス許可は、次のポリシーの例に示されています。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowGetEcrRepositories", "Effect": "Allow", "Action": [ "ecr:GetDownloadUrlForLayer", "ecr:BatchGetImage" ], "Resource": [ "arn:aws:ecr:
region
:account-id
:repository/repository-name
" ] }, { "Sid": "AllowGetEcrAuthToken", "Effect": "Allow", "Action": "ecr:GetAuthorizationToken", "Resource": "*" } ] }詳細については、「Amazon ECR ユーザーガイド」の「Amazon ECR Repository Policy Examples」(Amazon ECR リポジトリポリシーの例) を参照してください。
グループロール要件では、必要なアクセス許可を付与するようにロールを設定し、ロールがグループに追加されていることを確認する必要があります。詳細については、Greengrass グループロールの管理 (コンソール)またはGreengrass グループロールの管理 (CLI)を参照してください。
-
-
Docker Compose ファイルが AWS Marketplace
から Docker イメージを参照する場合、コネクタには次の要件もあります。 -
AWS Marketplace コンテナ製品にサブスクライブする必要があります。詳細については、「AWS Marketplace 購入者ガイド」の「Finding and subscribing to container products」(コンテナ製品の検索とサブスクライブ) を参照してください。
-
シークレットの要件で説明されているように、AWS IoT Greengrass はローカルシークレットをサポートするように設定する必要があります。コネクタは、シークレットを AWS Secrets Manager から取り出すためにのみこの機能を使用します。シークレットは格納されません。
-
Compose ファイルで参照される Docker イメージを格納する AWS Marketplace レジストリごとに、Secrets Manager にシークレットを作成する必要があります。詳細については、「プライベートリポジトリからの Docker イメージへのアクセス」を参照してください。
-
-
Docker Compose ファイルが Amazon ECR レジストリ以外のレジストリ (Docker Hub など) のプライベートリポジトリから Docker イメージを参照する場合、コネクタには次の要件もあります。
-
シークレットの要件で説明されているように、AWS IoT Greengrass はローカルシークレットをサポートするように設定する必要があります。コネクタは、シークレットを AWS Secrets Manager から取り出すためにのみこの機能を使用します。シークレットは格納されません。
-
Compose ファイルで参照される Docker イメージの格納先プライベートリポジトリごとに、Secrets Manager にシークレットを作成する必要があります。詳細については、「プライベートリポジトリからの Docker イメージへのアクセス」を参照してください。
-
-
このコネクタを含む Greengrass グループをデプロイするときは、Docker デーモンが実行されている必要があります。
プライベートリポジトリからの Docker イメージへのアクセス
認証情報を使用して Docker イメージにアクセスする場合は、コネクタがイメージにアクセスできるようにする必要があります。これを行う方法は、Docker イメージの場所によって異なります。
Amazon ECR に保存された Docker イメージの場合 、Greengrass グループロールで認証トークンを取得する権限を付与します。詳細については、「要件」を参照してください。
他のプライベートリポジトリまたはレジストリに保存された Docker イメージの場合、ログイン情報を格納するために AWS Secrets Manager にシークレットを作成する必要があります。これには、AWS Marketplace で購読した Docker イメージも含まれます。リポジトリごとに 1 つのシークレットを作成します。Secrets Manager でシークレットを更新すると、その変更は次にグループをデプロイするときにコアに伝達されます。
注記
Secrets Manager は、認証情報、キー、およびその他のシークレットを AWS クラウド に安全に保存および管理するために使用できるサービスです。詳細については、『AWS Secrets Manager ユーザーガイド』の「What is AWS Secrets Manager? ( とは?)」 を参照してください。
各シークレットには、次のキーが含まれている必要があります。
キー |
値 |
---|---|
|
リポジトリまたはレジストリへのアクセスに使用するユーザー名。 |
|
リポジトリまたはレジストリへのアクセスに使用するパスワード。 |
|
レジストリのエンドポイント。これは、Compose ファイル内の対応するレジストリ URL と一致する必要があります。 |
注記
デフォルトでシークレットにアクセス AWS IoT Greengrass できるようにするには、シークレットの名前が greengrass- で始まる必要があります。それ以外の場合、Greengrass サービスロールはアクセスを許可する必要があります。詳細については、「シークレットの値を取得することを AWS IoT Greengrass に許可する」を参照してください。
- Docker イメージのログイン情報を取得するには AWS Marketplace
-
-
aws ecr get-login-password
コマンドを使用して、AWS Marketplace から Docker イメージのパスワードを取得します。詳細については、AWS CLI コマンドリファレンスの get-login-password を参照してください。aws ecr get-login-password
-
Docker イメージのレジストリ URL を取得します。AWS Marketplace ウェブサイトを開き、コンテナ製品の起動ページを開きます。[Container Images] (コンテナイメージ) で、[View container image details] (コンテナイメージの詳細を表示) をクリックして、ユーザー名とレジストリ URL を検索します。
取得したユーザー名、パスワード、レジストリ URL を使用して、Compose ファイルで参照される Docker イメージの格納先となるそれぞれの AWS Marketplace レジストリ用にシークレットを作成します。
-
- シークレットを作成するには (コンソール)
-
AWS Secrets Manager コンソールで、[その他の種類のシークレット] を選択します。[ このシークレットに保存するキーと値のペアを指定します ] で以下の操作を行い、
username
、password
およびregistryUrl
の行を追加します。詳細については、「AWS Secrets Manager ユーザーガイド」の「Creating a basic secret」(基本的なシークレットの作成) を参照してください。 - シークレットを作成するには (CLI)
-
AWS CLI で、次の例のように Secrets Manager の
create-secret
コマンドを実行します。詳細については、「AWS CLI コマンドリファレンス」の「create-secret」を参照してください。aws secretsmanager create-secret --name greengrass-MySecret --secret-string [{"username":"Mary_Major"},{"password":"abc123xyz456"},{"registryUrl":"https://docker.io"}]
重要
Docker Compose ファイルを格納する DockerComposeFileDestinationPath
ディレクトリと、Docker イメージの資格情報をプライベートリポジトリから保護するのはユーザーの責任です。詳細については、「セキュリティ上の考慮事項」を参照してください。
パラメータ
このコネクタには、以下のパラメータが用意されています。
サンプルコネクタを作成する (AWS CLI)
以下の CLI コマンドは、Greengrass Docker アプリケーションデプロイコネクタを含む初期バージョンで ConnectorDefinition
を作成します。
aws greengrass create-connector-definition --name MyGreengrassConnectors --initial-version '{ "Connectors": [ { "Id": "MyDockerAppplicationDeploymentConnector", "ConnectorArn": "arn:aws:greengrass:
region
::/connectors/DockerApplicationDeployment/versions/5", "Parameters": { "DockerComposeFileS3Bucket": "myS3Bucket", "DockerComposeFileS3Key": "production-docker-compose.yml", "DockerComposeFileS3Version": "123", "DockerComposeFileDestinationPath": "/home/username/myCompose", "DockerUserId": "1000", "AWSSecretsArnList": "[\"arn:aws:secretsmanager:region
:account-id
:secret:greengrass-secret1-hash
\",\"arn:aws:secretsmanager:region
:account-id
:secret:greengrass-secret2-hash
\"]", "DockerContainerStatusLogFrequency": "30", "ForceDeploy": "True", "DockerPullBeforeUp": "True" } } ] }'
注記
このコネクタの Lambda 関数には存続期間の長いライフサイクルがあります。
入力データ
このコネクタは入力データを必要としません。
出力データ
このコネクタは、docker-compose up
コマンドのステータスを出力データとして公開します。
- サブスクリプションのトピックフィルター
-
dockerapplicationdeploymentconnector/message/status
- 出力例: 成功
-
{ "status":"success", "GreengrassDockerApplicationDeploymentStatus":"Successfully triggered docker-compose up", "S3Bucket":"myS3Bucket", "ComposeFileName":"production-docker-compose.yml", "ComposeFileVersion":"123" }
- 出力例: 失敗
-
{ "status":"fail", "error_message":"
description of error
", "error":"InvalidParameter" }エラーの種類は
InvalidParameter
またはInternalError
です。
AWS IoT Greengrass コアでの Docker ユーザーの設定
Greengrass Docker アプリケーションデプロイコネクタは、DockerUserId
パラメータで指定したユーザーを実行者として実行されます。値を指定しない場合、コネクタは ggc_user
として実行されます。これは、デフォルトの Greengrass アクセス ID です。
コネクタが Docker デーモンと対話できるようにするには、Docker ユーザーがコアの docker
Linux グループに属している必要があります。Docker ユーザーには、DockerComposeFileDestinationPath
ディレクトリへの書き込み権限も必要です。これは、コネクタがローカル docker-compose.yml
ファイルと Docker の資格情報を格納する場所です。
注記
-
デフォルト
ggc_user
を使用する代わりに、Linux ユーザーを作成することをお勧めします。それ以外の場合は、Greengrass グループの任意の Lambda 関数が Compose ファイルと Docker の認証情報にアクセスできます。 -
やむを得ない場合を除き、root として実行することは避けてください。ルートユーザーを指定する場合は、AWS IoT Greengrass Core で Lambda 関数をルートとして実行できるようにする必要があります。詳細については、「root としての Lambda 関数の実行」を参照してください。
-
ユーザーを作成します。
useradd
コマンドを実行し、UID を割り当てる任意の-u
オプションを含めることができます。例:sudo useradd -u
1234
user-name
-
コア上の
docker
グループにユーザーを追加します。例:sudo usermod -aG docker
user-name
docker
グループの作成方法などの詳細については、Docker のドキュメントの「Docker を非ルートユーザーとして管理する」を参照してください。 -
DockerComposeFileDestinationPath
パラメータに指定されたディレクトリへの書き込み権限をユーザーに付与します。例:-
ユーザーをディレクトリの所有者として設定します。この例では、手順 1 の UID を使用します。
chown
1234
docker-compose-file-destination-path
-
所有者に読み取りおよび書き込み権限を与えます。
chmod 700
docker-compose-file-destination-path
詳細については、Linux Foundation のドキュメントの「Linux でファイルとフォルダのアクセス許可を管理する方法
」を参照してください。 -
ユーザーの作成時に UID を割り当てなかった場合、または既存のユーザーを使用している場合は、
id
コマンドを実行して UID を検索します。id -u
user-name
UID を使用して、コネクタの
DockerUserId
パラメータを構成します。
-
使用状況の情報
Greengrass Docker アプリケーションデプロイコネクタを使用する時は、次の実装固有の使用状況の情報に注意する必要があります。
-
プロジェクト名の固定プレフィックス。コネクタは、開始する Docker コンテナの名前の前に
greengrassdockerapplicationdeployment
プレフィックスを追加します。コネクタは、実行するdocker-compose
コマンドで、このプレフィックスをプロジェクト名として使用します。 -
ログ記録の動作。コネクタは、ステータス情報とトラブルシューティング情報をログファイルに書き込みます。ログAWS IoT Greengrassを CloudWatch Logs に送信し、ログをローカルに書き込むように を設定できます。詳細については、「コネクタのログ記録」を参照してください。これは、コネクタのローカルログへのパスです。
/
greengrass-root
/ggc/var/log/user/region
/aws/DockerApplicationDeployment.logローカルログにアクセスするには、root 権限が必要です。
-
Docker イメージの更新。Docker はコアデバイスにイメージをキャッシュします。Docker イメージを更新し、変更をコアデバイスに伝播する場合は、Compose ファイルでイメージのタグを変更してください。変更は、Greengrass グループがデプロイされた後に有効になります。
-
クリーンアップ操作の 10 分タイムアウト。Greengrass デーモンが再起動中に停止すると、
docker-compose down
コマンドが開始されます。すべての Docker コンテナには、docker-compose down
が開始されてからクリーンアップ操作を実行するために 最大 10 分の時間が与えられます。10 分以内にクリーンアップが完了しない場合は、残りのコンテナを手動でクリーンアップする必要があります。詳細については、Docker CLI ドキュメントの「docker rm」を参照してください。 -
Docker コマンドの実行。問題のトラブルシューティングを行うには、コアデバイスのターミナルウィンドウで Docker コマンドを実行します。例えば、次のコマンドを実行して、コネクタによって起動された Docker コンテナを表示します。
docker ps --filter name="greengrassdockerapplicationdeployment"
-
予約済みリソース ID。コネクタは、Greengrass グループで作成した Greengrass リソースの
DOCKER_DEPLOYER_SECRET_RESOURCE_RESERVED_ID_
ID を使用します。リソース ID はグループ内で一意である必要があるため、この予約済みリソース ID と競合する可能性のあるリソース ID を割り当てないでください。index
-
オフラインモード。
DockerOfflineMode
設定パラメータをTrue
に設定すると、Docker コネクタはオフラインモードで動作します。これは、コアデバイスがオフラインの時に Greengrass グループのデプロイが再起動し、コネクタが Amazon S3 または Amazon ECR への接続を確立できず Docker Compose ファイルを取得できない場合に発生します。オフラインモードを有効にすると、コネクタは Compose ファイルのダウンロードを試み、通常の再起動の時と同じように
docker login
コマンドを実行します。ダウンロードに失敗すると、コネクタはDockerComposeFileDestinationPath
パラメータで指定されたローカルのフォルダに保存されている Compose ファイルを検索します。ローカルの Compose ファイルが存在する場合、コネクタはdocker-compose
コマンドの通常処理に沿って動作し、ローカルのイメージからプルを実行します。Compose ファイルまたはローカルイメージが存在しない場合は、コネクタは失敗します。ForceDeploy
とStopContainersOnNewDeployment
パラメータの動作はオフラインモードでも変わりません。
Docker コンテナとの通信
AWS IoT Greengrass は、Greengrass コンポーネントと Docker コンテナ間の以下の通信チャネルをサポートしています。
-
Greengrass Lambda 関数は、REST API を使用して Docker コンテナ内のプロセスと通信できます。Docker コンテナ内に、ポートを開くサーバーを設定できます。Lambda 関数はこのポートを介してコンテナと通信できます。
-
Docker コンテナ内のプロセスは、ローカルの Greengrass メッセージブローカーを介して MQTT メッセージを交換することができます。Docker コンテナを Greengrass グループのクライアントデバイスとして設定し、サブスクリプションを作成して、コンテナがグループ内の Greengrass Lambda 関数、クライアントデバイス、その他のコネクタ、または AWS IoT やローカルシャドウサービスと通信できるようにします。詳細については、「Docker コンテナを使用した MQTT 通信の設定」を参照してください。
-
Greengrass Lambda 関数は、共有ファイルを更新して Docker コンテナに情報を渡すことができます。Compose ファイルを使用して、Docker コンテナの共有ファイルパスをバインドできます。
Docker コンテナを使用した MQTT 通信の設定
Docker コンテナを Greengrass デバイスとして設定し、クライアントグループに追加することができます。次に、Docker コンテナと Greengrass コンポーネントまたは AWS IoT の間の MQTT 通信を許可するサブスクリプションを作成できます。次の手順では、Docker コンテナデバイスがローカルのシャドウサービスからシャドウ更新メッセージを受信できるようにするサブスクリプションを作成します。このパターンに従って、他のサブスクリプションを作成できます。
注記
この手順では、Greengrass グループと Greengrass Core (v1.10 以降) が既に作成されていることを前提としています。Greengrass グループと Core の作成の詳細については、「の開始方法 AWS IoT Greengrass」を参照してください。
Docker コンテナをクライアントデバイスとして設定し、それを Greengrass グループに追加するには
-
コアデバイス上にフォルダを作成し、Greengrass デバイスの認証に使用する証明書とキーを保存します。
ファイルパスは、起動する Docker コンテナにマウントする必要があります。次のスニペットは、Compose ファイルにファイルパスをマウントする方法を示しています。この例では、 はこのステップで作成したフォルダ
path-to-device-certs
を表します。version: '3.3' services: myService: image:
user-name
/repo
:image-tag
volumes: - /path-to-device-certs
/:/path-accessible-in-container
AWS IoT コンソールのナビゲーションペインの [Manage](管理)で、[Greengrass devices](Greengrass デバイス)を展開して、[Group (V1)](グループ (V1))を選択します。
ターゲットグループを選択します。
-
グループの設定ページで、[Client device] (クライアントデバイス)、[Associate] (アソシエイト) の順に選択します。
-
[クライアントデバイスをこのグループに関連付ける] モーダルで、[新しい AWS IoT モノの作成] を選択します。
新しいタブに [Create things] (モノの作成) ページが開きます。
-
[Creating things] (モノを作成する) ページで、[Create a single thing] (単一のモノを作成する) を選択し、[Next] (次へ) を選択します。
-
[Specify thing properties] (モノのプロパティを指定する) ページで、デバイスの名前を入力し、[Next] (次へ) を選択します。
-
[Configure device certificate] (デバイス証明書の設定) ページで [Next] (次へ) を選択します。
-
[Attach policies to certificate] (証明書へのポリシーのアタッチ) を選択し、次のいずれかを実行します。
-
クライアントデバイスが必要とする権限をグラントする既存のポリシーを選択し、[Create thing] (モノを作成する) を選択します。
モーダルが開き、デバイスが AWS クラウド とコアとの接続に使用する証明書とキーをダウンロードできます。
-
クライアントデバイスにアクセス許可を付与する新しいポリシーを作成してアタッチします。以下の操作を実行します。
-
[ポリシーの作成] を選択します。
新しいタブで ポリシーの作成 ページが開きます。
-
[ポリシーの作成] ページで、次の操作を行います。
-
[Policy name] (ポリシー名) には、
GreengrassV1ClientDevicePolicy
など、ポリシーを説明する名前を入力します。 -
[Policy statements] (ポリシーステートメント) タブの [Policy document] (ポリシードキュメント) で、[JSON] を選択します。
-
次のポリシードキュメントを入力します。このポリシーにより、クライアントデバイスは Greengrass コアを検出し、すべての MQTT トピックで通信できます。このポリシーのアクセスを制限する方法については、「AWS IoT Greengrass のデバイス認証と認可」を参照してください。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iot:Publish", "iot:Subscribe", "iot:Connect", "iot:Receive" ], "Resource": [ "*" ] }, { "Effect": "Allow", "Action": [ "greengrass:*" ], "Resource": [ "*" ] } ] }
-
[Create] (作成) を選択して、ポリシーを作成します。
-
-
[Attach policies to certificate] (証明書にポリシーをアタッチ) ページを開き、ブラウザタブに戻ります。以下の操作を実行します。
-
[Policies] (ポリシー) 一覧で、[GreengrassV1ClientDevicePolicy] など、作成したポリシーを選択します。
新しいポリシーが表示されない場合は、更新ボタンを押します。
-
[モノを作成する] を選択します。
モーダルが開き、デバイスが AWS クラウド とコアとの接続に使用する証明書とキーをダウンロードできます。
-
-
-
-
[Download certificates and keys] (証明書と鍵をダウンロードする) モーダルで、デバイスの証明書をダウンロードします。
重要
[Done] (完了) を選択する前に、セキュリティリソースをダウンロードします。
以下の操作を実行します。
-
[Device certificate] (デバイス証明書) には、[Download] (ダウンロード) を選択してデバイス証明書をダウンロードします。
-
[Public key file] (パブリックキーファイル) には、[Download] (ダウンロード) を選択して証明書のパブリックキーをダウンロードします。
-
[Private key file] (プライベートキーファイル) には、[Download] (ダウンロード) を選択して証明書のプライベートキーファイルをダウンロードします。
-
「AWS IoT デベロッパーガイド」の「サーバー認証」を確認して、適切なルート CA 証明書を選択します。Amazon Trust Services (ATS) エンドポイントと ATS ルート CA 証明書の使用をお勧めします。[Root CA certificates] (ルート CA 証明書)から、ルート CA 証明書の[Download] を選択します。
-
[完了] を選択します。
デバイス証明書とキーのファイル名に含まれる共通の証明書 ID を書き留めます。これは、後で必要になります。
-
-
ステップ 1 で作成したフォルダに、証明書とキーをコピーします。
次に、グループにサブスクリプションを作成します。この例では、Docker コンテナデバイスがローカルシャドウサービスから MQTT メッセージを受信できるようにするサブスクリプションを作成します。
注記
シャドウドキュメントの最大サイズは 8 KB です。詳細については、「AWS IoT デベロッパーガイド」の「AWS IoT のクォータ」を参照してください。
Docker コンテナデバイスがローカルシャドウサービスから MQTT メッセージを受信できるようにするサブスクリプションを作成するには
-
[ソースとターゲットの選択] ページで、ソースおよびターゲットを次のように設定します。
-
[ソースの選択] で、[サービス]、[Local Shadow Service (ローカルシャドウサービス)] の順に選択します。
-
[ターゲットの選択] で [デバイス] を選択し、あなたのデバイスを選択します。
-
[次へ] をクリックします。
-
[Filter your data with a topic] (トピックでデータをフィルタリングする) ページで、[Topic filter] (トピックのフィルター) に「
$aws/things/
」と入力し、[Next] (次へ) を選択します。を、前に作成したデバイスの名前MyDockerDevice
/shadow/update/acceptedMyDockerDevice
に置き換えます。 -
[終了] を選択します。
-
Compose ファイルで参照する Docker イメージに次のコードスニペットを含めます。これは Greengrass のデバイスコードです。また、コンテナ内で Greengrass デバイスを起動する Docker コンテナにコードを追加します。イメージ内の別のプロセスとして、または別のスレッドで実行できます。
import os import sys import time import uuid from AWSIoTPythonSDK.core.greengrass.discovery.providers import DiscoveryInfoProvider from AWSIoTPythonSDK.exception.AWSIoTExceptions import DiscoveryInvalidRequestException from AWSIoTPythonSDK.MQTTLib import AWSIoTMQTTClient # Replace thingName with the name you registered for the Docker device. thingName = "MyDockerDevice" clientId = thingName # Replace host with the IoT endpoint for your &AWS-account;. host = "myPrefix.iot.region.amazonaws.com" # Replace topic with the topic where the Docker container subscribes. topic = "$aws/things/MyDockerDevice/shadow/update/accepted" # Replace these paths based on the download location of the certificates for the Docker container. rootCAPath = "/path-accessible-in-container/AmazonRootCA1.pem" certificatePath = "/path-accessible-in-container/certId-certificate.pem.crt" privateKeyPath = "/path-accessible-in-container/certId-private.pem.key" # Discover Greengrass cores. discoveryInfoProvider = DiscoveryInfoProvider() discoveryInfoProvider.configureEndpoint(host) discoveryInfoProvider.configureCredentials(rootCAPath, certificatePath, privateKeyPath) discoveryInfoProvider.configureTimeout(10) # 10 seconds. GROUP_CA_PATH = "./groupCA/" MQTT_QOS = 1 discovered = False groupCA = None coreInfo = None try: # Get discovery info from AWS IoT. discoveryInfo = discoveryInfoProvider.discover(thingName) caList = discoveryInfo.getAllCas() coreList = discoveryInfo.getAllCores() # Use first discovery result. groupId, ca = caList[0] coreInfo = coreList[0] # Save the group CA to a local file. groupCA = GROUP_CA_PATH + groupId + "_CA_" + str(uuid.uuid4()) + ".crt" if not os.path.exists(GROUP_CA_PATH): os.makedirs(GROUP_CA_PATH) groupCAFile = open(groupCA, "w") groupCAFile.write(ca) groupCAFile.close() discovered = True except DiscoveryInvalidRequestException as e: print("Invalid discovery request detected!") print("Type: %s" % str(type(e))) print("Error message: %s" % str(e)) print("Stopping...") except BaseException as e: print("Error in discovery!") print("Type: %s" % str(type(e))) print("Error message: %s" % str(e)) print("Stopping...") myAWSIoTMQTTClient = AWSIoTMQTTClient(clientId) myAWSIoTMQTTClient.configureCredentials(groupCA, privateKeyPath, certificatePath) # Try to connect to the Greengrass core. connected = False for connectivityInfo in coreInfo.connectivityInfoList: currentHost = connectivityInfo.host currentPort = connectivityInfo.port myAWSIoTMQTTClient.configureEndpoint(currentHost, currentPort) try: myAWSIoTMQTTClient.connect() connected = True except BaseException as e: print("Error in connect!") print("Type: %s" % str(type(e))) print("Error message: %s" % str(e)) if connected: break if not connected: print("Cannot connect to core %s. Exiting..." % coreInfo.coreThingArn) sys.exit(-2) # Handle the MQTT message received from GGShadowService. def customCallback(client, userdata, message): print("Received an MQTT message") print(message) # Subscribe to the MQTT topic. myAWSIoTMQTTClient.subscribe(topic, MQTT_QOS, customCallback) # Keep the process alive to listen for messages. while True: time.sleep(1)
セキュリティ上の考慮事項
Greengrass Docker アプリケーションデプロイコネクタを使用する場合は、次のセキュリティ上の考慮事項に注意してください。
-
Docker の Compose ファイルのローカルストレージ
コネクタは、
DockerComposeFileDestinationPath
パラメータに指定されたディレクトリに Compose ファイルのコピーを格納します。このディレクトリを保護するのはあなたの責任です。ディレクトリへのアクセスを制限するには、ファイルシステムの権限を使用する必要があります。
-
Docker 認証情報のローカルストレージ
Docker イメージがプライベートリポジトリに格納されている場合、コネクタは、
DockerComposeFileDestinationPath
パラメータに指定されたディレクトリに Docker 認証情報を格納します。これらの認証情報を保護するのはお客様の責任です。例えば、Docker Engine をインストールするときは、コアデバイスで資格情報ヘルパー
を使用する必要があります。 -
信頼できるソースから Docker Engine をインストールする
信頼できるソースから Docker Engine をインストールするのはあなたの責任です。このコネクタは、コアデバイス上の Docker デーモンを使用して、Docker アセットにアクセスし、Docker コンテナを管理します。
-
Greengrass グループの役割権限のスコープ
Greengrass グループロールに追加したアクセス許可は、Greengrass グループのすべての Lambda 関数とコネクタによって引き継ぐことができます。このコネクタには、S3 バケットに格納されている Docker Compose ファイルへのアクセスが必要です。また、Docker イメージが Amazon ECR のプライベートリポジトリに格納されている場合は、Amazon ECR 認証トークンにアクセスする必要があります。
ライセンス
Greengrass Docker アプリケーションデプロイコネクタには、以下のサードパーティーのソフトウェアおよびライセンスが含まれています。
-
AWS SDK for Python (Boto3)
/Apache License 2.0 -
botocore
/Apache License 2.0 -
dateutil
/PSF ライセンス -
docutils
/BSD ライセンス、GNU 一般パブリックライセンス (GPL)、Python Software Foundation ライセンス、パブリックドメイン -
jmespath
/MIT ライセンス -
s3transfer
/Apache License 2.0 -
urllib3
/MIT ライセンス
このコネクタは、Greengrass Core ソフトウェアライセンス契約
変更ログ
次の表に、コネクタの各バージョンにおける変更点を示します。
バージョン |
変更 |
---|---|
7 |
AWS IoT Greengrass がオフラインで起動した時に既存の Docker Compose ファイルを使用する |
6 |
新しいデプロイが行われた時、または GGC が停止した時にコンテナのクリーンアップを上書きする |
5 |
|
4 |
Docker イメージを更新する pull-before-up 動作を追加しました。 |
3 |
環境変数の検索に関する問題が修正されました。 |
2 |
|
1 |
初回リリース。 |
Greengrass グループには、一度に 1 つのバージョンのコネクタしか含めることができません。コネクタのバージョンのアップグレードについては、「コネクタのバージョンのアップグレード」を参照してください。