Atom's tech blog

Raspberry Pi でAWS IoT Greengrassを動かしてみた!(Part1)

f:id:iAtom:20201202140528j:plain

本記事はGreengrass Core = 1.11.0 で実施した情報です。

AWS IoT Greengrassに興味があったので動かしてみました。

主にAWSサイトの手順を参考に環境構築しました。 2回トライして1回目はダメだった。2回目のGreengrassデプロイでやっと通信まで実施できた。

1回目のダメな理由がわからないが、Greengrass Core Deviceにクラウド設定をデプロイするところで正常に終了したが、Raspberry Pi(Greengrass Core Device)側からのメッセージがAWSに届かなかった。(MQTTクライアントのテストで受信できていない......)

今回はRaspberry Piのセットアップで、OSインストールから環境登録まで。

AWS構成図

f:id:iAtom:20201203142522j:plain

AWS IoT Greengrassとは何?

自分もよくわかっていないので、簡易説明を残しておきます。

AWSサイトには、以下の説明で書いていました。(一部抜粋)

クラウドの機能をローカルデバイスに拡張するソフトウェア。 デバイスは情報源に近いデータを収集および分析して、ローカルイベントに自律的に反応し、ローカルネットワークで互いに安全に通信することができる。デバイス上で動作するアプリケーションロジックのクラウドベースの管理が可能。ローカルにデプロイした Lambda 関数とコネクタは、ローカルイベント、クラウドからのメッセージ、またはその他のソースによってトリガーをかけられる

これではよくわからず。なのでもう少し自分が調べた結果で、自分なりにわかりやすい言葉で書くと、

  • AWSで登録したLambda関数(例えば、Pythonスクリプト)をローカルデバイス(今回でいえばRaspberry Pi)へのデプロイ(配置)ができる。要するに Lambda関数のソースコードをデプロイ時にローカルデバイスへ転送される
  • AWSに登録したLambda機能をローカルデバイスに持たせることができる
  • Lambda関数の実行はMQTTメッセージを受けたり定期的に実行させたり、常時起動させることができる

IoTで使用するローカルデバイスは、数個レベルではなく、100や200など多数のローカルデバイスとして配置するので、このLambda関数を使用して一斉にソフトウェアの更新が可能となります。

すなわち Greengrassをインストールすることで、ソースコードクラウド上で修正し、ローカルデバイスへはAWS IoTからデプロイ実施で更新ができます。

それではRaspberry Piのインストールから始めます。

評価環境

Greengrassの環境設定

自分はAWSサイトに沿ってインストールしました。AWSサイトと同じになってしまいますが、簡単に手順を。 ローカルデバイスRaspberry Piにするので、まずはRaspberry Piのインストール。

1. SDカードのフォーマット

自分はSDカードに前に使用したRaspberry PiのOSが入っていたので、手順通りにSDカードをフォーマット。

インストールソフトはこちら

2. Raspberry Pi OSダウンロード

OS:rasbpian-busterをzipファイルとしてダウンロードします。

3. SDカードへの書き込み

SDカード書き込みツールEtherをダウンロードし、rasbpian-busterをSDカードに書き込み(フラッシュ)します。 書き込みが完了したらMACからSDカードを取り出し、microSDカードをRaspberry Pi に挿入します。

4. Raspberry Piに周辺機器を接続

Raspberry Piにあらかじめ「ディスプレイ」「キーボード」「マウス」を接続し、Raspberry Piの電源を入れます。

5. Raspberry Pi 日本語設定

Raspberry PiのOS起動したらデスクトップ画面右上にある Raspberry アイコンを選択し、キーボード設定(日本語)をします。

6. Raspberry Pi ターミナル起動

Raspberry Piのデスクトップ画面左上のメニューにある「ターミナル」を起動します。

7. Raspberry Piのconfigの起動

ターミナル画面からRaspberry Piのconfigの設定を起動します。

   sudo raspi-config

8. Raspberry Pi SSH有効設定

リモート(SSH)接続をしたいので、Raspberry Piのconfigの設定から「SSH有効」をします。まず「5. Interfacing Options」を選択します。


f:id:iAtom:20201125203551j:plain

9. Raspberry Pi SSH有効設定(P2 SSH選択)

「P2 SSH」を選択します。


f:id:iAtom:20201125203612j:plain

10. Raspberry Pi SSH有効設定確認(はい選択)

「はい」を選択します。


f:id:iAtom:20201125203625j:plain

11. Raspberry Pi SSH有効設定最終確認(了解選択)

The SSH server is enable とメッセージが出るので「了解」を選択します。


f:id:iAtom:20201125204931j:plain

12. Raspberry Pi config終了確認(Finish選択)

「了解」を選択すると最初のメニュー画面に戻るので、「Finish」を選択します。選択後再起動します。


f:id:iAtom:20201125205238j:plain

13. Raspberry Pi 再起動しない時の手動設定

再起動しないときは、手動で下記コマンドで再起動します。

   $sudo reboot

14. Raspberry Pi WiFi設定

Raspberry Piが立ち上がったら、WiFi接続をします。デスクトップ画面右上にWiFi設定アイコンがあるので起動します。

15. Raspberry Pi AP接続と暗号化キー入力

自分の接続したいAP(アクセスポイント)を選択して接続。認証コード入力画面が出るので「暗号化キー」を入力して認証させます。

16. Raspberry Pi AP接続 IPアドレス確認

認証が完了すると、デスクトップ画面右上に「電波マーク」が出るので、マウスの矢印をその電波マークに乗せると、APから払い出されたIPアドレスが表示されます。そのIPアドレス(例えば192.168.10.10)をメモに残してください。

ただし、ある一定時間アクセスしないときや、他のデバイス接続され同一IPアドレスが使用できない可能性がありますので、SSH接続する前にIPアドレスは確認しましょう。

17. Raspberry PISSH接続

MACからターミナルを起動し、Raspberry PISSH接続します。(Raspberry Piのdefaultパスワードは「raspberry」です)

  $ ssh pi@192.168.10.10

18. 接続完了画面

接続すると下記のような表示され、Raspberry PIに接続が完了します。(接続直後に確認のメッセージが出るので「yes」を入力)

   $ ssh pi@192.168.10.10
   pi@192.168.10.10's password: 
   Linux raspberrypi 4.19.57-v7+ #1244 SMP Thu Jul 4 18:45:25 BST 2019 armv7l

   The programs included with the Debian GNU/Linux system are free software;
   the exact distribution terms for each program are described in the 
   individual files in /usr/share/doc/*/copyright.

   Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent 
   permitted by applicable law.
   Last login: Wed Nov 25 21:11:32 2020 from 192.168.10.9
   pi@raspberrypi:~ $ 
   pi@raspberrypi:~ $ 

これでRaspberry PiAWS IoT Greengrassとしてセットアップする準備ができました。

19. Greengrass使用のためのユーザ/グループ登録

MACのターミナルウィンドから、Raspberry Pi「ggc_userユーザ」 「ggc_groupグループ」を登録します。

    $sudo adduser --system ggc_user
    $sudo addgroup --system ggc_group

20. Raspberry Pi のセキュリティを向上

Pi デバイスでのセキュリティを向上させるには、起動時にオペレーティングシステムのハードリンクとソフトリンク (symlink) の保護を有効にします(ここはそのまま引用です)。ここは説明のみ。

20-1. 98-rpi.confファイル場所へ移動

98-rpi.conf ファイルに移動し、98-rpi.confファイルがあることを確認します。

    $cd /etc/sysctl.d
    $ls
    98-rpi.conf  99-sysctl.conf  README.sysctl  protect-links.conf
20-2. ハードリンクとソフトリンク (symlink)設定と保存

テキストエディタ (Leafpad、GNU nano、vi など) を使用して下の 2 行をファイルの末尾に追加します。sudo コマンドを使用してルートとして編集することが必要な場合があります (例: sudo nano 98-rpi.conf)。

    kernel.printk = 3 4 1 3
    vm.min_free_kbytes = 16384
    fs.protected_hardlinks = 1          -> 追加         
    fs.protected_symlinks = 1           -> 追加

21. Raspberry Piを再起動

Raspberry Piを再起動します。

     $sudo reboot

22. ハードリンクとソフトリンク (symlink)設定確認

MACのターミナルを起動し、SSHRaspberry Pi に接続し、次のコマンドを実行して変更を確認します。

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

23. ハードリンクとソフトリンク (symlink)表示確認

fs.protected_hardlinks = 1 および fs.protected_symlinks = 1 と表示されます。

    fs.protected_fifos = 0
    fs.protected_hardlinks = 1     -> ここ
    fs.protected_regular = 0
    fs.protected_symlinks = 1      -> ここ

24. AWS IoT Greengrass で Lambda 関数のメモリ制限設定

コマンドラインブートファイルを編集し、メモリ cgroups を有効にしてマウントします。これにより、AWS IoT Greengrass で Lambda 関数のメモリ制限を設定できるようになります。AWS IoT Greengrass をデフォルトの containerization モードで実行するには、cgroups も必要です。(ここの文はAWSサイト引用です )

24-1. Raspberry Piのbootディレクトリへ移動

boot ディレクトリに移動します。

    $cd /boot/
24-2. cmdline.txtの編集と保存

テキストエディタを使用してcmdline.txtの末尾に「cgroup_enable=memory cgroup_memory=1」を追加します。下記の一行は長いので、カーソルを文末に移動して追加してください。

    dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=PARTUUID=dca25b9b-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles cgroup_enable=memory cgroup_memory=1

25. Raspberry Piの再起動

Pi を再起動します。これで、Raspberry PiAWS IoT Greengrass の準備ができた状態になります。

    $sudo reboot

AWS IoT Geengrass リンク

docs.aws.amazon.com