【小ネタ】[AWS IoT Greengrass] Jetson Nano でのクイックスタートは、たったの1行だった

Jetson Nanoでは、たったの1行で、Greengrassのセットアップが可能ですが、Pythonのバージョンに少し注意が必要です。
2020.06.12

1 はじめに

CX事業本部の平内(SIN)です。

前回、AWS IoT Greengrass(以下、Greengrass)のクイックスタートを利用すると、たった3行でセットアップが完了することを確認しました。

今回、Jetson Nanoでも試してみた所、再起動の必要がなく、1行で終わってしまったので、ここで纏めさせて下さい。

2 クイックスタート

(1) SD Card Image

Jetson Nanoのセットアップで使用したSDカードのイメージは、最新のJP 4.4DP 2020/04/21です。

https://developer.nvidia.com/embedded/downloads

$ Linux nvidia-desktop 4.9.140-tegra #1 SMP PREEMPT Wed Apr 8 18:10:49 PDT 2020 aarch64 aarch64 aarch64 GNU/Linux

(2) 1行コマンド

下記の設定内容では、コマンドは、次のようになります。

  • グループ名 : JetsonSample
  • リージョン : ap-northeast-1
  • Lambdaサンプル : あり
$ wget -q -O ./gg-device-setup-latest.sh \
https://d1onfpft10uf5o.cloudfront.net/greengrass-device-setup/downloads/gg-device-setup-latest.sh \
&& chmod +x ./gg-device-setup-latest.sh \
&& sudo -E ./gg-device-setup-latest.sh \
bootstrap-greengrass \
--aws-access-key-id XXXXXX \
--aws-secret-access-key XXXXXX \
--region ap-northeast-1 \
--group-name JetsonSample \
--hello-world-lambda \
--verbose

コマンドが終了した時点でGreengrass Coreは、起動しています。

$ ps -aux | grep green.*daemon
root      7148  8.4  0.5 861240 21304 pts/0    Sl   16:50   0:01 \
/greengrass/ggc/packages/1.10.2/bin/daemon \
-core-dir=/greengrass/ggc/packages/1.10.2 -port=8000 \
-connectionManager=true -cloudSpooler=true \
-shadow=true -shadowSync=true -tes=true \
-deviceCertificateManager=true -secretManager=true

※出力結果が長いので、\で折り返して表示しています。

(3) Lambda

Lambda(Greengrass_HelloWorld_OHUG1)は、Python3.7で作成されています。

IoT Coreコンソールのテストでは、LambdaからのMQTTメッセージ(hello/world)が、5秒間間隔で送られてきていることも確認できます。

3 Python3.7

クイックスタートについては、以上なのですが、Pythonのバージョンについての注意を補足させて下さい。

下記は、クイックスタート前の状態です。

  • Jetson Nanoの最新(2020/04/21)イメージでは、Python3系は、3.6.9がインストール済です。
$ ls -la /usr/bin/python3*
lrwxrwxrwx 1 root root       9 10月 25  2018 /usr/bin/python3 -> python3.6
-rwxr-xr-x 2 root root 4509168 11月  7  2019 /usr/bin/python3.6
-rwxr-xr-x 2 root root 4509168 11月  7  2019 /usr/bin/python3.6m
lrwxrwxrwx 1 root root      10 10月 25  2018 /usr/bin/python3m -> python3.6m
  • OpenCV(4.1.1)や、numpy(1.13.3)もあらかじめインストールされています。
$ python3
Python 3.6.9 (default, Nov  7 2019, 10:44:02)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> cv2.__version__
'4.1.1'
>>> import numpy
>>> numpy.__version__
'1.13.3'
>>>

しかし、Greengrassの現在のバージョンは、Python3.7で動作するため、クイックスタートでは、Python3.7が新たにインストールされます。

※ python3のシンボリックリンクは、python3.6のまま変わりません。

$ ls -la /usr/bin/python3*
lrwxrwxrwx 1 root root       9 10月 25  2018 /usr/bin/python3 -> python3.6
-rwxr-xr-x 2 root root 4509168 11月  7  2019 /usr/bin/python3.6
-rwxr-xr-x 2 root root 4509168 11月  7  2019 /usr/bin/python3.6m
-rwxr-xr-x 2 root root 4764112 11月  7  2019 /usr/bin/python3.7
-rwxr-xr-x 2 root root 4764112 11月  7  2019 /usr/bin/python3.7m
lrwxrwxrwx 1 root root      10 10月 25  2018 /usr/bin/python3m -> python3.6m

Greengrassからは、Python3.7が使用されるため、このままでは、既存のライブラリが読めなくなっていることに注意が必要です。

$ sudo -u ggc_user bash -c 'python3.7 -c "import cv2"'
Traceback (most recent call last):
  File "<string>", line 1, in <module>
ModuleNotFoundError: No module named 'cv2'

改めて、Python3.7の環境を整えるのが正攻法だと思いますが、下記のドキュメントにシンボリックリンクで回避する手法が紹介されていますので、それに乗っかるならクイックスタートで入ったPython3.7を削除して、新たにPython3.6へのリンクを作成するのも一つの手段かも知れません。


参考:NVIDIA Jetson TX2 の設定より

作業は、以下のようになると思います。

  • Python3.7の削除
$ sudo apt-get remove python3.7
$ sudo rm /usr/bin/python3.7*
  • Python3.7が無くなていることを確認
$ ls -la /usr/bin/python3*
lrwxrwxrwx 1 root root       9 10月 25  2018 /usr/bin/python3 -> python3.6
-rwxr-xr-x 2 root root 4509168 11月  7  2019 /usr/bin/python3.6
-rwxr-xr-x 2 root root 4509168 11月  7  2019 /usr/bin/python3.6m
lrwxrwxrwx 1 root root      10 10月 25  2018 /usr/bin/python3m -> python3.6m
  • シンボリックリンク作成
$ sudo ln -s /usr/bin/python3.6 /usr/bin/python3.7
$ ls -al /usr/bin/python3*
lrwxrwxrwx 1 root root       9 10月 25  2018 /usr/bin/python3 -> python3.6
-rwxr-xr-x 2 root root 4509168 11月  7  2019 /usr/bin/python3.6
-rwxr-xr-x 2 root root 4509168 11月  7  2019 /usr/bin/python3.6m
lrwxrwxrwx 1 root root      18  6月 11 06:30 /usr/bin/python3.7 -> /usr/bin/python3.6
lrwxrwxrwx 1 root root      10 10月 25  2018 /usr/bin/python3m -> python3.6m

python3.7でcv2がimport出来ていることを確認

$ sudo -u ggc_user bash -c 'python3.7 -c "import cv2"'

4 最後に

↓ RaspberryPi

pi~$ python3 --version
Python 3.7.3

RaspberryPiでは、最近のイメージがPython3.7になっているため、全く気にしてなかったのですが、Jetson Nanoでは、ちょっとライブラリの再セットアップが必要になりそうです。

しかし、クイックスタートは、超快適です。