[AWS IoT Greengrass V2] RaspberryPIにインストールしてみました

2021.08.11

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] コンポーネントからシークレットマネージャにアクセスしてみました