AWS IoT Greengrass V1.7をRaspberry Pi3 Model B+で使ってみた

AWS IoT Greengrass V1.6.0まではRaspberry Pi3 Model B+ではうまく動作しませんでした。V1.7.0ではRaspberry Pi3 Mode B+でも動作するRaspbianもサポートされるようになりましたので動作確認してみました。
2018.12.20

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちはさかじです。AWS IoT Greengrass V1.6.0まではRaspberry Pi3 Model B+(以降Raspi)ではうまく動作しませんでした。V1.7.0ではRaspiでも動作するRaspbianもサポートされるようになりましたので動作確認してみました。

設定方法

AWSで提供している以下のドキュメントを参考にして実施しました
https://docs.aws.amazon.com/ja_jp/greengrass/latest/developerguide/module1.html

インストールイメージ

インストールイメージは下記から2018-06-27-raspbian-stretch.zipをダウンロードしました。
https://downloads.raspberrypi.org/raspbian/images/raspbian-2018-06-29/

RaspiのGreengrass Coreセットアップ前準備

SSHや直接Raspiのデスクトップ上で操作してください

$ sudo adduser --system ggc_user
システムユーザ 'ggc_user' (UID 111) を追加しています...
新しいユーザ 'ggc_user' (UID 111) をグループ 'nogroup' に追加しています...
ホームディレクトリ '/home/ggc_user' を作成しています...
$ sudo addgroup --system ggc_group
グループ 'ggc_group' (グループ ID 115) を追加しています...
完了。

以下を実行すると起動しなくなりましたので実行しませんでしたので実施しませんでした。

$ sudo rpi-update b81a11258fc911170b40a0b09bbd63c84bc5ad59

今回使用したイメージのバージョン情報

$ uname -a
Linux raspi3 4.14.79-v7+ #1159 SMP Sun Nov 4 17:50:20 GMT 2018 armv7l GNU/Linux
  • 98-rpi.confへ修正を加えて起動時にハードリンクとソフトリンクの保護を有効にします
$ cd /etc/sysctl.d
$ sudo vim 98-rpi.conf

下記の2行を追記

fs.protected_hardlinks = 1
fs.protected_symlinks = 1
  • 98-rpi.confを保存後Raspiを再起動します
$ sudo reboot

Raspi起動後

$ sudo sysctl -a 2> /dev/null | grep fs.protected

を実行すると下記のよう表示されます

fs.protected_hardlinks = 1
fs.protected_symlinks = 1
$ cd /home/pi/Downloads
$ wget https://github.com/aws-samples/aws-greengrass-samples/raw/master/greengrass-dependency-checker-GGCv1.7.0.zip
$ unzip greengrass-dependency-checker-GGCv1.7.0.zip
$ cd greengrass-dependency-checker-GGCv1.7.0
$ sudo modprobe configs
$ sudo ./check_ggc_dependes | more

AWS IoT Greengrassの設定

AWS IoTのコンソールから操作してください  

  • "Greengrass"-"グループの作成"をクリック

  • ”簡単な作成の使用"をクリック

  • 任意のグループ名をつけて"次へ"をクリック

  • コアの名前は変更せず"次へ"をクリック

  • グループとCoreを作成

  • Coreのセキュリティリソースのダウンロードを行います

  • Raspberry Pi用Coreソフトウェアをダウンロードして"完了"をクリック

  • グループが作成されます

  • 前ステップでダウンロードしたファイルをSCPを使用してRaspiへ転送します
    Windowsの場合にはWinscp等のツールを使用してください。
    ダウンロードしたバージョン等でファイル名は変更になります。今回は以下のファイル名になりました。

$ sudo scp greengrass-linux-armv7l-1.7.0.tar.gz pi@xxx.xxx.xxx.xxx:/home/pi/
$ sudo scp 4437fe9c5f-setup.tar.gz pi@xxx.xxx.xxx.xxx:/home/pi/

RaspiでGrenngrass Coreのセットアップ

SSHや直接Raspiのデスクトップ上で操作してください

  • 転送したファイルを解凍
$ cd
$ sudo tar -xzvf greengrass-linux-armv7l-1.7.0.tar.gz -C /
$ sudo tar -xzvf 4437fe9c5f-setup.tar.gz -C /greengrass
  • ルート証明書をダウンロード
$ cd /greengrass/certs/
$ sudo wget -O root.ca.pem https://www.amazontrust.com/repository/AmazonRootCA1.pem
  • AWS IoT Greengrassを起動
$ cd /greengrass/ggc/core/
$ sudo ./greengrassd start
Setting up greengrass daemon
Validating hardlink/softlink protection
Waiting for up to 40s for Daemon to start

Greengrass successfully started with PID: xxxx
  • 動作状況を確認(今回のPIDは1919だった場合)、デーモンのパスが表示されます
$ ps aux | grep 1919
root      1919  0.3  1.3 908340 12856 pts/1    Sl   18:03   0:00 /greengrass/ggc/packages/1.7.0/bin/daemon -core-dir /greengrass/ggc/packages/1.7.0 -greengrassdPid 1914
pi        1951  0.0  0.0   3852   540 pts/1    S+   18:06   0:00 grep --color=auto 1919

Lambda関数作成

AWS Lambdaのコンソールから操作してください

  • Lambdaコンソール画面から"関数の作成"をクリックします

  • "設計図"をクリックし、設計図のテキストボックスへ"greengrass"と入力し"Enter"を押下します

  • "greengrass-hello-world"をクリックし"設定"ボタンをクリックします

  • 適当な名前をつけ、"カスタムロールの作成"を選択します
    すでにロールがある場合には"既存のロールを選択"を選びますが今回は新規に作成します。

  • IAMロール作成画面へ遷移します。"ロール名"へ適当な名前を入力し"許可"ボタンをクリックすると前の画面に戻ります
    ポリシーはデフォルトを使用しました

  • ロール名が入力されたことを確認して下までスクロールします

  • "関数の作成"をクリックすると作成されます

  • 関数ができましたら"アクション"をクリックし"新しいバージョンを発行"をクリックします

  • 任意のバージョンを入力し"発行"をクリックします

Lambda関数のデプロイ

AWS IoTのコンソールから操作してください

  • "Greengrass" - "グループ"で作成したtestGroupをクリックします

  • "Lambda"をクリックします

  • "最初のLambdaを追加する"をクリックします

  • "既存のLambdaの使用を"をクリックします

  • 作成したLambda関数を選択して"次へ"をクリックします

  • バージョンを選択して"完了"をクリックします

  • "testGroup" - "Lambda" - "作成したLambda関数"をクリックします

  • "編集"をクリックします

  • Lambdaのライフサイクルを"存続期間を長く無制限に稼働する関数にする"を選択します

  • 下へスクロールして"更新"をクリック

  • "testGroup" - "サブスクリプション" - "既存のサブスクリプションの追加"をクリックします

  • ソースの選択で"Lambda"をクリックし使用するLambda関数をクリックします

  • ターゲットの選択で"サービス" - "IoT Cloud"をクリックします

  • "次へ"をクリックします

  • トピックフィルターへ"hello/world"と入力して"次へ"をクリックします

  • "完了"をクリックします

  • "testGroup" - "デプロイ" - "アクション" - "デプロイ"をクリックします

  • "自動検出"をクリックします

  • ”権限の付与"をクリックします

  • 若干時間がかかってデプロイが完了します

RasPi3B+でLambda関数が実行されているか確認

  • "AWS IoT" - "テスト"をクリックして"トピックのサブスクリプション"へ"hello/world"と入力して"トピックへのサブスクライブ"をクリックします

  • 下記のようにRasPi3B+のLambda関数からパブリッシュされたメッセージが表示されます

最後に

これで自宅にあるRaspiへLambda関数をデプロイできるようになりました。年末年始はこれで遊びたいと思います。

参考