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 への移行を強くお勧めします。
AWS IoT Greengrass Core ソフトウェアの OTA 更新
AWS IoT Greengrass Core ソフトウェアパッケージには、AWS IoT Greengrass ソフトウェアの Over-the-air (OTA) 更新を実行できる更新エージェントが含まれています。OTA 更新を使用して、最新バージョンの AWS IoT Greengrass Core ソフトウェアまたは OTA 更新エージェントソフトウェアを 1 つ以上の コアにインストールできます。OTA 更新では、コアデバイスが物理的に存在する必要はありません。
可能であれば、OTA 更新を使用することをお勧めします。これらは、更新ステータスと更新履歴を追跡するために使用できるメカニズムを提供します。更新に失敗すると、OTA 更新エージェントは以前のソフトウェアバージョンにロールバックします。
注記
apt
を使用して AWS IoT Greengrass Core ソフトウェアをインストールする場合、OTA 更新はサポートされません。このようなインストールでは、apt
を使用してソフトウェアをアップグレードすることをお勧めします。詳細については、「APT リポジトリからの AWS IoT Greengrass Core ソフトウェアのインストール」を参照してください。
OTA 更新により、以下の作業の効率が向上します。
-
セキュリティの脆弱性を修正する。
-
ソフトウェアの安定性の問題に対処する。
-
新しい機能や改良された機能をデプロイする。
この機能は、AWS IoT ジョブと統合されています。
要件
AWS IoT Greengrass ソフトウェアの OTA 更新には、以下の要件が適用されます。
-
Greengrass Core はローカルストレージに 400 MB 以上の空き容量が必要です。OTA 更新エージェントは、ランタイム使用要件が AWS IoT Greengrass Core ソフトウェアの約 3 倍です。詳細については、「Amazon Web Services 全般のリファレンス」の Greengrass core の「Service Quotas」を参照してください。
-
Greengrass Core では、AWS クラウド への接続が必要です。
-
Greengrass コアは、AWS IoT Core および AWS IoT Greengrass を使用した認証用の証明書とキーで正しく設定およびプロビジョニングする必要があります。詳細については、「X.509 証明書」を参照してください。
-
Greengrass コアは、ネットワークプロキシを使用するように設定することはできません。
注記
AWS IoT Greengrass v1.9.3 以降、OTA 更新は、デフォルトのポート 8883 ではなくポート 443 を使用するように MQTT トラフィックを設定するコアでサポートされています。ただし、OTA 更新エージェントはネットワークプロキシを介した更新をサポートしていません。詳細については、「ポート 443 での接続またはネットワークプロキシを通じた接続」を参照してください。
-
AWS IoT Greengrass Core ソフトウェアを含むパーティションでは、信頼された起動を有効にできません。
注記
AWS IoT Greengrass Core ソフトウェアは、信頼された起動が有効になっているパーティションにインストールして実行できますが、OTA 更新はサポートされていません。
-
AWS IoT Greengrass には、AWS IoT Greengrass Core ソフトウェアを含むパーティションに対する読み取り/書き込みアクセス許可が必要です。
-
Greengrass コアを管理するために init システムを使用する場合、OTA 更新を init システムと統合するように設定する必要があります。詳細については、「init システムとの統合」を参照してください。
-
AWS IoT Greengrass ソフトウェア更新アーティファクトへの Amazon S3 URL の事前署名に使用されるロールを作成する必要があります。この署名者ロールにより、AWS IoT Core はユーザーに代わって Amazon S3 に保存されているソフトウェア更新アーティファクトにアクセスできるようになります。詳細については、「OTA 更新の IAM アクセス許可」を参照してください。
OTA 更新の IAM アクセス許可
AWS IoT Greengrass が AWS IoT Greengrass Core ソフトウェアの新しいバージョンをリリースすると、AWS IoT Greengrass は、OTA 更新に使用される Amazon S3 に保存されたソフトウェアアーティファクトを更新します。
AWS アカウント には、これらのアーティファクトにアクセスするために使用できる Amazon S3 URL 署名者ロールが含まれている必要があります。ロールには、ターゲット AWS リージョン 内のバケットに対する s3:GetObject
アクションを許可するアクセス許可ポリシーが必要です。ロールには、信頼されたエンティティとしてロールを引き受けることを iot.amazonaws.com
に許可する信頼ポリシーも必要です。
- アクセス許可ポリシー
-
ロールのアクセス許可については、AWS 管理ポリシーを使用することも、カスタムポリシーを作成することもできます。
-
AWS マネージドポリシーの使用
GreengrassOTAUpdateArtifactAccess
管理ポリシーは、AWS IoT Greengrass によって提供されています。現在および将来の両方で AWS IoT Greengrass によりサポートされるすべてのアマゾン ウェブ サービスリージョンでアクセスを許可する場合は、このポリシーを使用します。 -
カスタムポリシーの作成
コアがデプロイされるアマゾン ウェブ サービスリージョンを明示的に指定する場合は、カスタムポリシーを作成する必要があります。以下のポリシー例では、6 つのリージョンでの AWS IoT Greengrass ソフトウェア更新へのアクセスを許可しています。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowAccessToGreengrassOTAUpdateArtifacts", "Effect": "Allow", "Action": [ "s3:GetObject" ], "Resource": [ "arn:aws:s3:::us-east-1-greengrass-updates/*", "arn:aws:s3:::us-west-2-greengrass-updates/*", "arn:aws:s3:::ap-northeast-1-greengrass-updates/*", "arn:aws:s3:::ap-southeast-2-greengrass-updates/*", "arn:aws:s3:::eu-central-1-greengrass-updates/*", "arn:aws:s3:::eu-west-1-greengrass-updates/*" ] } ] }
-
- 信頼ポリシー
-
ロールにアタッチされた信頼ポリシーは、
sts:AssumeRole
アクションを許可し、iot.amazonaws.com
をプリンシパルとして定義する必要があります。これにより、AWS IoT Core は信頼されたエンティティとしてロールを引き受けることができます。ポリシードキュメントの例を次に示します。{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowIotToAssumeRole", "Action": "sts:AssumeRole", "Principal": { "Service": "iot.amazonaws.com" }, "Effect": "Allow" } ] }
さらに、OTA 更新を開始するユーザーには、greengrass:CreateSoftwareUpdateJob
および iot:CreateJob
を使用するアクセス許可と、iam:PassRole
を使用して署名者ロールのアクセス許可を渡すアクセス許可が必要です。IAM ポリシーの例を次に示します。
{ "Version": "2012-10-17", "Statement": [ { "Action": [ "greengrass:CreateSoftwareUpdateJob" ], "Effect": "Allow", "Resource": "*" }, { "Effect": "Allow", "Action": [ "iot:CreateJob" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "iam:PassRole" ], "Resource": "
arn-of-s3-url-signer-role
" } ] }
考慮事項
Greengrass Core ソフトウェアの OTA 更新を開始する前に、Core デバイスと、その Core にローカルに接続されたクライアントデバイスの両方で、Greengrass グループのデバイスへの影響に注意します。
-
Core は更新中にシャットダウンされます。
-
Core で実行されている Lambda 関数はすべてシャットダウンされます。これらの関数がローカルリソースに書き込むと、それらのリソースは適切にシャットダウンされない限り正しい状態にならない場合があります。
-
コアのダウンタイム中は、AWS クラウド とのすべての接続が失われます。クライアントデバイスによって Core 経由でルーティングされたメッセージは失われます。
-
認証情報キャッシュは失われます。
-
Lambda 関数の作業を保留中のキューは失われます。
-
存続期間の長い Lambda 関数は動的な状態情報を失い、保留中の作業はすべて破棄されます。
OTA 更新の実行中、以下の状態情報は保持されます。
-
Core 設定
-
Greengrass グループ設定
-
ローカルシャドウ
-
Greengrass のログ
-
OTA 更新エージェントログ
Greengrass OTA Update Agent
Greengrass OTA 更新エージェントは、クラウドで作成およびデプロイされた更新ジョブを処理する、デバイス上のソフトウェアコンポーネントです。OTA 更新エージェントは、AWS IoT Greengrass Core ソフトウェアと同じソフトウェアパッケージで配布されています。エージェントは /
にあります。ログを greengrass-root
/ota/ota_agent/ggc-ota/var/log/greengrass/ota/ggc_ota.txt
に書き込みます。
注記
greengrass-root
は、デバイスで AWS IoT Greengrass Core ソフトウェアがインストールされているパスを表します。通常、これは /greengrass
ディレクトリです。
OTA 更新エージェントを起動するには、バイナリを手動で実行するか、systemd サービスファイルなどの init スクリプトの一部として統合します。バイナリを手動で実行する場合は、ルートとして実行する必要があります。起動すると、OTA 更新エージェントは AWS IoT Greengrass ソフトウェア更新ジョブを AWS IoT Core からリッスンし、順番に実行します。OTA 更新エージェントは他のすべての AWS IoT ジョブタイプを無視します。
次の抜粋は、OTA 更新エージェントを起動、停止、および再起動する systemd サービスファイルの例を示したものです。
[Unit] Description=Greengrass OTA Daemon [Service] Type=forking Restart=on-failure ExecStart=/greengrass/ota/ota_agent/ggc-ota [Install] WantedBy=multi-user.target
更新のターゲットであるコアは、OTA 更新エージェントの 2 つのインスタンスを実行することはできません。実行すると、2 つのエージェントが同じジョブを処理し、それにより競合が発生します。
init システムとの統合
OTA 更新中に、OTA 更新エージェントは Core デバイスのバイナリを再起動します。バイナリが実行中の場合、更新中に init システムが AWS IoT Greengrass Core ソフトウェアまたはエージェントの状態をモニタリングしているとき、競合が発生する可能性があります。OTA 更新メカニズムを init モニタリング戦略と統合するために、更新の前後に実行するシェルスクリプトを記述できます。例えば、データをバックアップしたり、デバイスをシャットダウンする前にプロセスを停止したりする ggc_pre_update.sh
スクリプトを記述できます。
これらのシェルスクリプトを実行するように OTA 更新エージェントに指示するには、config.json ファイルに "managedRespawn" : true
フラグを含める必要があります。この設定は、次の抜粋に示されています。
{ "coreThing": { … }, "runtime": { … }, "managedRespawn": true … }
OTA 更新による管理された再生成
managedRespawn
を true
に設定した OTA 更新では、以下の要件が適用されます。
-
以下のシェルスクリプトが
/
ディレクトリ内に必要です。greengrass-root
/usr/scripts-
ggc_pre_update.sh
-
ggc_post_update.sh
-
ota_pre_update.sh
-
ota_post_update.sh
-
-
スクリプトは、成功のリターンコードを返す必要があります。
-
スクリプトは root が所有し、root のみが実行できることが必要です。
-
ggc_pre_update.sh
スクリプトで Greengrass デーモンを停止させる必要があります。 -
ggc_post_update.sh
スクリプトで Greengrass デーモンを開始しておく必要があります。
注記
OTA 更新エージェントは自身でプロセスを管理しているため、ota_pre_update.sh
および ota_post_update.sh
スクリプトが OTA サービスの停止と開始に対応する必要はありません。
OTA 更新エージェントは /
にあるスクリプトを実行します。ディレクトリツリーは次のようになります。greengrass-root
/usr/scripts
<greengrass_root> |-- certs |-- config | |-- config.json |-- ggc |-- usr/scripts | |-- ggc_pre_update.sh | |-- ggc_post_update.sh | |-- ota_pre_update.sh | |-- ota_post_update.sh |-- ota
managedRespawn
が true
に設定されている場合、OTA 更新エージェントは、ソフトウェア更新の前後に /
ディレクトリでスクリプトをチェックします。スクリプトがない場合は、更新は失敗します。AWS IoT Greengrass はスクリプトの内容については検証しません。ベストプラクティスとして、スクリプトが正しく機能することを確認した上で、エラーの発生時には適切な終了コードを発行するようにしてください。greengrass-root
/usr/scripts
AWS IoT Greengrass Core ソフトウェアの OTA 更新の場合:
-
更新を開始する前に、エージェントは
ggc_pre_update.sh
スクリプトを実行します。OTA 更新エージェントが AWS IoT Greengrass Core ソフトウェアの更新を開始する前に必要なコマンド (データのバックアップや実行中のプロセスの停止など) を実行するために、このスクリプトを使用します。次の例は、Greengrass デーモンを停止させる単純なスクリプトです。#!/bin/bash set -euo pipefail systemctl stop greengrass
-
更新が完了すると、エージェントは
ggc_post_update.sh
スクリプトを実行します。OTA 更新エージェントが AWS IoT Greengrass Core ソフトウェアの更新を開始した後に必要なコマンド (プロセスの再起動など) を実行するために、このスクリプトを使用します。次の例は、Greengrass デーモンを起動する単純なスクリプトです。#!/bin/bash set -euo pipefail systemctl start greengrass
OTA 更新エージェントの OTA 更新の場合
-
更新を開始する前に、エージェントは
ota_pre_update.sh
スクリプトを実行します。OTA 更新エージェントが自身を更新する前に必要なコマンド (データのバックアップや実行中のプロセスの停止など) を実行するために、このスクリプトを使用します。 -
更新が完了すると、エージェントは
ota_post_update.sh
スクリプトを実行します。OTA 更新エージェントが自身の更新を開始した後に必要なコマンド (プロセスの再起動など) を実行するために、このスクリプトを使用します。
注記
managedRespawn
が false
に設定されている場合、OTA 更新エージェントはスクリプトを実行しません。
OTA 更新の作成
次のステップに従って、1 つ以上のコアで AWS IoT Greengrass ソフトウェアの OTA 更新を実行します。
-
コアが OTA 更新の要件を満たしていることを確認します。
注記
AWS IoT Greengrass Core ソフトウェアまたは OTA 更新エージェントを管理するように init システムを設定した場合、コアで次のことを確認します。
-
config.json ファイルは
"managedRespawn" : true
を指定します。 -
/
greengrass-root
/usr/scripts ディレクトリには、次のスクリプトが含まれています。-
ggc_pre_update.sh
-
ggc_post_update.sh
-
ota_pre_update.sh
-
ota_post_update.sh
-
詳細については、「init システムとの統合」を参照してください。
-
-
Core デバイスターミナルで、OTA 更新エージェントを起動します。
cd /
greengrass-root
/ota/ota_agent sudo ./ggc-ota注記
greengrass-root
は、デバイスで AWS IoT Greengrass Core ソフトウェアがインストールされているパスを表します。通常、これは/greengrass
ディレクトリです。競合の原因となる可能性があるため、コアで OTA 更新エージェントの複数のインスタンスを起動しないでください。
-
または AWS IoT Greengrass API を使用して、ソフトウェア更新ジョブを作成します。
-
CreateSoftwareUpdateJob API を呼び出します。この手順例では、AWS CLI コマンドを使用します。
次のコマンドは、1 つのコアで AWS IoT Greengrass Core ソフトウェアを更新するジョブを作成します。サンプル値を置き換えて、コマンドを実行します。
このコマンドは、次のレスポンスを返します。
{ "IotJobId": "GreengrassUpdateJob_c3bd7f36-ee80-4d42-8321-a1da0EXAMPLE", "IotJobArn": "arn:aws:iot:
region
:123456789012:job/GreengrassUpdateJob_c3bd7f36-ee80-4d42-8321-a1da0EXAMPLE", "PlatformSoftwareVersion": "1.10.1" } -
レスポンスから
IoTJobId
をコピーします。 -
AWS IoT Core API で DescribeJob を呼び出し、ジョブステータスを確認します。サンプル値をジョブ ID に置き換えて、コマンドを実行します。
aws iot describe-job --job-id GreengrassUpdateJob_c3bd7f36-ee80-4d42-8321-a1da0EXAMPLE
コマンドは、ジョブに関する情報(
status
やjobProcessDetails
など) を含むレスポンスオブジェクトを返します。{ "job": { "jobArn": "arn:aws:iot:
region
:123456789012:job/GreengrassUpdateJob_c3bd7f36-ee80-4d42-8321-a1da0EXAMPLE", "jobId": "GreengrassUpdateJob_c3bd7f36-ee80-4d42-8321-a1da0EXAMPLE", "targetSelection": "SNAPSHOT", "status": "IN_PROGRESS", "targets": [ "arn:aws:iot:region
:123456789012:thing/myCoreDevice" ], "description": "This job was created by Greengrass to update the Greengrass Cores in the targets with version 1.10.1 of the core software running on x86_64 architecture.", "presignedUrlConfig": { "roleArn": "arn:aws::iam::123456789012:role/myS3UrlSignerRole", "expiresInSec": 3600 }, "jobExecutionsRolloutConfig": {}, "createdAt": 1588718249.079, "lastUpdatedAt": 1588718253.419, "jobProcessDetails": { "numberOfCanceledThings": 0, "numberOfSucceededThings": 0, "numberOfFailedThings": 0, "numberOfRejectedThings": 0, "numberOfQueuedThings": 1, "numberOfInProgressThings": 0, "numberOfRemovedThings": 0, "numberOfTimedOutThings": 0 }, "timeoutConfig": {} } }
トラブルシューティングヘルプについては、AWS IoT Greengrass のトラブルシューティング を参照してください。
-
CreateSoftwareUpdateJob API
CreateSoftwareUpdateJob
API を使用して、Core デバイスの AWS IoT Greengrass Core ソフトウェアまたは OTA 更新エージェントソフトウェアを更新できます。この API は、更新が利用可能になったときにデバイスに通知する AWS IoT スナップショットジョブを作成します。CreateSoftwareUpdateJob
を呼び出した後は、他の AWS IoT ジョブコマンドを使用して、ソフトウェア更新を追跡できます。詳細については、AWS IoT デベロッパーガイドのジョブを参照してください。
以下の例では、AWS CLI を使用して、コアデバイス上の AWS IoT Greengrass Core ソフトウェアを更新するジョブを作成する方法を示しています。
aws greengrass create-software-update-job \ --update-targets-architecture x86_64 \ --update-targets [\"arn:aws:iot:
region
:123456789012:thing/myCoreDevice\"] \ --update-targets-operating-system ubuntu \ --software-to-update core \ --s3-url-signer-role arn:aws:iam::123456789012:role/myS3UrlSignerRole \ --update-agent-log-level WARN \ --amzn-client-token myClientToken1
create-software-update-job
コマンドは、更新によってインストールされたジョブ ID、ジョブ ARN、およびソフトウェアバージョンを含む JSON レスポンスを返します。
{
"IotJobId": "GreengrassUpdateJob_c3bd7f36-ee80-4d42-8321-a1da0EXAMPLE",
"IotJobArn": "arn:aws:iot:region
:123456789012:job/GreengrassUpdateJob_c3bd7f36-ee80-4d42-8321-a1da0EXAMPLE",
"PlatformSoftwareVersion": "1.9.2"
}
create-software-update-job
を使用してコアデバイスを更新する方法を示す手順については、「OTA 更新の作成」を参照してください。
create-software-update-job
コマンドでは、以下のパラメータを使用します。
--update-targets-architecture
-
Core デバイスのアーキテクチャ。
有効な値:
armv7l
、armv6l
、x86_64
、またはaarch64
--update-targets
-
更新するコア。リストには、個々のコアの ARN と、メンバーがコアであるモノのグループの ARN を含めることができます。モノのグループの詳細については、「AWS IoT デベロッパーガイド」の「モノの静的グループ」を参照してください。
--update-targets-operating-system
-
Core デバイスのオペレーティングシステム。
有効な値:
ubuntu
、amazon_linux
、raspbian
、またはopenwrt
--software-to-update
-
更新するのが Core ソフトウェアであるか OTA 更新エージェントソフトウェアであるかを指定します。
有効な値:
core
またはota_agent
--s3-url-signer-role
-
AWS IoT Greengrass ソフトウェア更新アーティファクトにリンクする Amazon S3 URL の事前署名に使用される IAM ロールの ARN。ロールのアタッチされたアクセス許可ポリシーは、ターゲット AWS リージョン内のバケットに対する
s3:GetObject
アクションを許可する必要があります。ロールは、ロールを信頼されたエンティティとして引き受けることをiot.amazonaws.com
に許可する必要があります。詳細については、「OTA 更新の IAM アクセス許可」を参照してください。 --amzn-client-token
-
(オプション) べき等リクエストを行うために使用されるクライアントトークン。内部再試行のため重複した更新が作成されないようにする一意のトークンを指定します。
--update-agent-log-level
-
(オプション) OTA 更新エージェントによって生成されるログステートメントのログ記録レベル。デフォルト:
ERROR
。有効な値:
NONE
、TRACE
、DEBUG
、VERBOSE
、INFO
、WARN
、ERROR
、またはFATAL
注記
CreateSoftwareUpdateJob
は、次のサポートされているアーキテクチャとオペレーティングシステムの組み合わせに対するリクエストのみを受け入れます。
-
ubuntu/x86_64
-
ubuntu/aarch64
-
amazon_linux/x86_64
-
raspbian/armv7l
-
raspbian/armv6l
-
openwrt/aarch64
-
openwrt/armv7l