この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
1 はじめに
IoT事業部の平内(SIN)です。
AWS IoT Greengrass V2(以下、Greengrass V2)は、Greengrass クラシック (V1)とは、まったくの別物だという話を聞いて気になっていたのですが、なかなか触れていませんでした。
今回は、重い腰を上げて、インストールから初めてみました。
使用したデバイスは、RaspberryPi 4B(8G)で、OSは、今年5月の最新版(Raspberry Pi OS (32-bit) with desktop and recommended software)です。
https://www.raspberrypi.org/software/
$ cat /proc/cpuinfo | grep Revision
Revision : d03114
$ lsb_release -a
No LSB modules are available.
Distributor ID: Raspbian
Description: Raspbian GNU/Linux 10 (buster)
Release: 10
Codename: buster
$ uname -a
Linux device-001 5.10.17-v7l+ #1414 SMP Fri Apr 30 13:20:47 BST 2021 armv7l GNU/Linux
2 Javaランタイム
Greengrass V2は、Javaで作成されているため、ランタイムのインストールが必要です。
$ sudo apt install default-jdk
今回、使用した、RasPIイメージには、既にインストールされているため、この作業は必要ありませんでした。
$ java -version
openjdk version "11.0.11" 2021-04-20
OpenJDK Runtime Environment (build 11.0.11+9-post-Raspbian-1deb10u1)
OpenJDK Server VM (build 11.0.11+9-post-Raspbian-1deb10u1, mixed mode)
3 セットアップ
2021/08/12 更新
インストールコマンドで使用しているjarファイルは、Greengrassそのものでした。
以下、一部、内容を修正しました。
-rw-r--r-- 1 pi pi 51383591 Aug 3 05:59 /home/pi/GreengrassCore/lib/Greengrass.jar
-r-xr-xr-x 1 pi pi 51383591 Aug 3 05:59 /greengrass/v2/packages/artifacts-unarchived/aws.greengrass.Nucleus/2.4.0/aws.greengrass.nucleus/lib/Greengrass.jar
Greengrassのセットアップは、AWSコンソールに表示されるコマンドをコピーするだけで簡単に行うことができます。
- コアデバイス名とグループ名の決定
- AWS認証情報の設定
- Greegrassのダウンロード
- インストール実行
(1) コアデバイス名とグループ名の決定
AWS IoTコンソールで、Greegrass - コアデバイス - 1 つの Greengrass コアデバイスをセットアップ と辿ります。
表示された画面で、「コアデバイス名」と、所属させる「グループ名」を設定します。(今回は、「gg-device-001」「gg-group」としました)
ここに名前を入力する事で、下(ステップ3.3)に表示されている「インストーラの実行」のコマンドが変更されます。事後、そのままコピーして、デバイス上実行することで、この名前が利用されます。
(2) AWS認証情報の設定
「インストーラの実行」のために、AWSの認証情報が必要です。下記では、インストーラーを実行するシェルで環境変数に認証情報をセットしています。
$ export AWS_DEFAULT_REGION=ap-northeast-1
$ export AWS_ACCESS_KEY_ID=xxxxxx
$ export AWS_SECRET_ACCESS_KEY=xxxxxx
$ export AWS_SESSION_TOKEN=xxxxxx
必要なポリシーについては、下記に記載されていました。
参考:インストーラーがリソースをプロビジョニングするための最小限の IAM ポリシー
(3) Greegrassのダウンロード
下記のコマンドで、Greegrassをデバイス上にダウンロードして展開します。
$ curl -s https://d2s8p88vqu9w66.cloudfront.net/releases/greengrass-nucleus-latest.zip > greengrass-nucleus-latest.zip && unzip greengrass-nucleus-latest.zip -d GreengrassCore
展開されるファイルは、以下のようになっていました。lib/Greengrass.jarが、Greegrass本体です。
$ tree ./GreengrassCore
./GreengrassCore
├── bin
│ ├── greengrass.service.template
│ ├── loader
│ └── loader.cmd
├── conf
│ └── recipe.yaml
├── lib
│ └── Greengrass.jar
├── LICENSE
├── NOTICE
├── README.md
└── THIRD-PARTY-LICENSES
(4) インストール実行
Greegrassは、インストール機能もあり、その実行コマンドが、IoT Coreコンソールで表示されているので、これをコピーしてそのまま利用できます。 表示されているコマンドは、設定したコアデバイス名とグループ名が反映されています。
$ sudo -E java -Droot="/greengrass/v2" -Dlog.store=FILE -jar ./GreengrassCore/lib/Greengrass.jar --aws-region ap-northeast-1 --thing-name gg-device-001 --thing-group-name gg-group --component-default-user ggc_user:ggc_group --provision true --setup-system-service true --deploy-dev-tools true
Successfullyが表示されて、インストーラの実行はすぐに完了しますが、実際にコアデバイスの登録や、コンポーネントのインストールが完了するまでは、しばらく待つ必要があります。
Successfully set up Nucleus as a system service
4 確認
(1) コアデバイス
コアデバイスの登録が完了すると、AWSコンソールから確認できます。
(2) コンポーネント
また、「コンポーネント」タブで、Greengrass コマンドラインインターフェイス (CLI) も確認できます。
Greengrass CLI は、AWS IoT Greengrassデバイスのコアを使用して、ローカルでコンポーネントを開発するために利用されるパブリックコンポーネントの1つですが、インストーラのパラメータで --deploy-dev-tools true が指定されているためインストールされたものです。
参考:Greengrass コマンドラインインターフェイス
デバイス上では、下記のパスから利用できます。
$ /greengrass/v2/bin/greengrass-cli -V
Greengrass CLI Version: 2.4.0
※ ローカル開発を行わない場合は、インストールの必要はありません。
(3) モノ
コアデバイスは、モノとしても登録されます。
指定したグループに所属していることも確認できます。
(4) 証明書
モノには、証明書が紐づいています。
デバイス上では、証明書(秘密鍵)は、/greengrass/v2に配置されています。
$ ls -al /greengrass/v2
total 60
drwxr-xr-x 12 root root 4096 Aug 10 19:14 .
drwxr-xr-x 3 root root 4096 Aug 10 19:14 ..
drwx------ 3 root root 4096 Aug 10 19:14 alts
drwxr-xr-x 2 root root 4096 Aug 10 19:21 bin
drwxr-xr-x 2 root root 4096 Aug 10 19:21 cli_ipc_info
drwx------ 2 root root 4096 Aug 10 19:14 config
drwx------ 3 root root 4096 Aug 10 19:21 deployments
srw-rw-rw- 1 root root 0 Aug 10 19:14 ipc.socket
drwx------ 2 root root 4096 Aug 10 19:14 logs
drwxr-xr-x 5 root root 4096 Aug 10 19:14 packages
drwx------ 4 root root 4096 Aug 10 19:14 plugins
-rw-r--r-- 1 root root 1675 Aug 10 19:14 privKey.key
-rw-r--r-- 1 root root 1188 Aug 10 19:14 rootCA.pem
drwxr-xr-x 2 root root 4096 Aug 10 19:14 telemetry
-rw-r--r-- 1 root root 1224 Aug 10 19:14 thingCert.crt
drwxr-xr-x 2 root root 4096 Aug 10 19:14 work
SHA256のフィンガープリントを見ると、AWSコンソール上の「証明書ID」と一致していることが確認できます。
$ openssl x509 -noout -fingerprint -sha256 -in thingCert.crt
SHA256 Fingerprint=2C:AD:81:CB:BD:2A:5B:5D:13:39:D3:5E:69:0E:06:46:75:EB:04:E2:CA:D6:8C:FF:A3:85:A6:A5:57:42:F3:08
(5) ポリシー
証明書に紐づいたポリシーは、以下の2つです。
- GreengrassV2IoTThingPolicy
- GreengrassTESCertificatePolicyGreengrassV2TokenExchangeRoleAlias
GreengrassV2IoTThingPolicy
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"iot:Connect",
"iot:Publish",
"iot:Subscribe",
"iot:Receive",
"greengrass:*"
],
"Resource": "*"
}
]
}
GreengrassTESCertificatePolicyGreengrassV2TokenExchangeRoleAlias
{
"Version": "2012-10-17",
"Statement": {
"Effect": "Allow",
"Action": "iot:AssumeRoleWithCertificate",
"Resource": "arn:aws:iot:ap-northeast-1:xxxxxxxxxxxx:rolealias/GreengrassV2TokenExchangeRoleAlias"
}
}
(6) ロールエリアス
ポリシーで許可されているロールエリアスは、GreengrassV2TokenExchangeRoleAliasです。
エリアス元のIAMポリシーは、以下の通りでした。
GreengrassV2TokenExchangeRoleAccess
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"iot:DescribeCertificate",
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents",
"logs:DescribeLogStreams",
"s3:GetBucketLocation"
],
"Resource": "*"
}
]
}
(7) サービス
インストーラーのパラメータで、--setup-system-service true が指定されているので、コアは、デバイス上でサービスとして起動しています。
$ sudo systemctl status greengrass.service
● greengrass.service - Greengrass Core
Loaded: loaded (/etc/systemd/system/greengrass.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2021-08-10 19:14:50 BST; 46min ago
Main PID: 5646 (sh)
Tasks: 45 (limit: 4915)
CGroup: /system.slice/greengrass.service
├─5646 /bin/sh /greengrass/v2/alts/current/distro/bin/loader
└─5651 java -Dlog.store=FILE -Dlog.store=FILE -Droot=/greengrass/v2 -jar /greengrass/v2/alts/current/distro/lib/Gree
Aug 10 19:14:50 device-001 sh[5646]: JVM options: -Dlog.store=FILE -Droot=/greengrass/v2
Aug 10 19:14:50 device-001 sh[5646]: Nucleus options: --setup-system-service false
Aug 10 19:14:54 device-001 sh[5646]: SLF4J: Failed to load class "org.slf4j.impl.StaticMDCBinder".
Aug 10 19:14:54 device-001 sh[5646]: SLF4J: Defaulting to no-operation MDCAdapter implementation.
Aug 10 19:14:54 device-001 sh[5646]: SLF4J: See http://www.slf4j.org/codes.html#no_static_mdc_binder for further details.
Aug 10 19:14:55 device-001 sh[5646]: Launching Nucleus...
Aug 10 19:14:55 device-001 sh[5646]: AWS libcrypto resolve: searching process and loaded modules
Aug 10 19:14:55 device-001 sh[5646]: AWS libcrypto resolve: found static aws-lc HMAC symbols
Aug 10 19:14:55 device-001 sh[5646]: AWS libcrypto resolve: found static aws-lc libcrypto 1.1.1 EVP_MD symbols
Aug 10 19:14:59 device-001 sh[5646]: Launched Nucleus successfully.
(8) ログ
コアデバイスのログは、/greengrass/v2/logs/greengrass.logとなっています。
$ sudo tail -f /greengrass/v2/logs/greengrass.log
2021-08-10T18:21:15.892Z [INFO] (pool-2-thread-11) com.aws.greengrass.deployment.DeploymentDirectoryManager: Persist link to last deployment. {link=/greengrass/v2/deployments/previous-success}
2021-08-10T18:21:16.514Z [INFO] (Thread-3) com.aws.greengrass.deployment.IotJobsHelper: Received empty jobs in notification . {ThingName=gg-device-001}
また、コンポーネントのログもこのディレクトリに生成されるとのことです。
$ sudo ls -la /greengrass/v2/logs
total 56
drwx------ 2 root root 4096 Aug 10 19:14 .
drwxr-xr-x 12 root root 4096 Aug 10 19:14 ..
-rw-r--r-- 1 root root 0 Aug 10 19:14 aws.greengrass.Nucleus.log
-rw-r--r-- 1 root root 47398 Aug 10 19:21 greengrass.log
-rw-r--r-- 1 root root 0 Aug 10 19:14 main.log
5 最後に
今回は、Greengrass V2をRasberryPiにインストールしてみました。
まだ、インストールしただけですが、Dockerで構成されたGreengrass クラシック (V1)より、ぐっとシンプルな構成になっているように感じています。
6 参考リンク
[AWS IoT Greengrass V2] RaspberryPIにインストールしてみました
[AWS IoT Greengrass V2] RaspberryPIでコンポーネントを作成してみました
[AWS IoT Greengrass V2] クラウド側から複数のコアデバイスにコンポーネントをデプロイしてみました
[AWS IoT Greengrass V2] クラウド側からコンポーネントを削除してみました
[AWS IoT Greengrass V2] ローカルデバッグコンソール(aws.greengrass.LocalDebugConsole)を使用してみました
[AWS IoT Greengrass V2] Lambda関数(コンポーネント)をデプロイしてみました
[AWS IoT Greengrass V2] コンポーネントからIoT CoreのメッセージブローカーにPublish/Subscribeしてみました
[AWS IoT Greengrass V2] コンポーネントからシークレットマネージャにアクセスしてみました