Raspberry Pi でAWS IoT Greengrassを動かしてみた!(Part1)
本記事はGreengrass Core = 1.11.0 で実施した情報です。
AWS IoT Greengrassに興味があったので動かしてみました。
- Part1: Raspberry Piのセットアップ
- Part2: AWS IoT Greengrass(クラウド)の設定
- Part3: Raspberry PiへGreengrassソフトウェアインストールと起動
- Part4: Greengrass(Raspberry Pi)とAWS IoT(クラウド)と連携
- Part5: Greengrass(Raspberry Pi)でLambda関数の実行動作
- AWS構成図
- AWS IoT Greengrassとは何?
- 評価環境
- Greengrassの環境設定
- 1. SDカードのフォーマット
- 2. Raspberry Pi OSダウンロード
- 3. SDカードへの書き込み
- 4. Raspberry Piに周辺機器を接続
- 5. Raspberry Pi 日本語設定
- 6. Raspberry Pi ターミナル起動
- 7. Raspberry Piのconfigの起動
- 8. Raspberry Pi SSH有効設定
- 9. Raspberry Pi SSH有効設定(P2 SSH選択)
- 10. Raspberry Pi SSH有効設定確認(はい選択)
- 11. Raspberry Pi SSH有効設定最終確認(了解選択)
- 12. Raspberry Pi config終了確認(Finish選択)
- 13. Raspberry Pi 再起動しない時の手動設定
- 14. Raspberry Pi WiFi設定
- 15. Raspberry Pi AP接続と暗号化キー入力
- 16. Raspberry Pi AP接続 IPアドレス確認
- 17. Raspberry PIへSSH接続
- 18. 接続完了画面
- 19. Greengrass使用のためのユーザ/グループ登録
- 20. Raspberry Pi のセキュリティを向上
- 21. Raspberry Piを再起動
- 22. ハードリンクとソフトリンク (symlink)設定確認
- 23. ハードリンクとソフトリンク (symlink)表示確認
- 24. AWS IoT Greengrass で Lambda 関数のメモリ制限設定
- 25. Raspberry Piの再起動
- AWS IoT Geengrass リンク
主にAWSサイトの手順を参考に環境構築しました。 2回トライして1回目はダメだった。2回目のGreengrassデプロイでやっと通信まで実施できた。
1回目のダメな理由がわからないが、Greengrass Core Deviceにクラウド設定をデプロイするところで正常に終了したが、Raspberry Pi(Greengrass Core Device)側からのメッセージがAWSに届かなかった。(MQTTクライアントのテストで受信できていない......)
今回はRaspberry Piのセットアップで、OSインストールから環境登録まで。
AWS構成図
AWS IoT Greengrassとは何?
自分もよくわかっていないので、簡易説明を残しておきます。
AWSサイトには、以下の説明で書いていました。(一部抜粋)
クラウドの機能をローカルデバイスに拡張するソフトウェア。 デバイスは情報源に近いデータを収集および分析して、ローカルイベントに自律的に反応し、ローカルネットワークで互いに安全に通信することができる。デバイス上で動作するアプリケーションロジックのクラウドベースの管理が可能。ローカルにデプロイした Lambda 関数とコネクタは、ローカルイベント、クラウドからのメッセージ、またはその他のソースによってトリガーをかけられる
これではよくわからず。なのでもう少し自分が調べた結果で、自分なりにわかりやすい言葉で書くと、
- AWSで登録したLambda関数(例えば、Pythonのスクリプト)をローカルデバイス(今回でいえばRaspberry Pi)へのデプロイ(配置)ができる。要するに Lambda関数のソースコードをデプロイ時にローカルデバイスへ転送される。
- AWSに登録したLambda機能をローカルデバイスに持たせることができる
- Lambda関数の実行はMQTTメッセージを受けたり定期的に実行させたり、常時起動させることができる
IoTで使用するローカルデバイスは、数個レベルではなく、100や200など多数のローカルデバイスとして配置するので、このLambda関数を使用して一斉にソフトウェアの更新が可能となります。
すなわち Greengrassをインストールすることで、ソースコードはクラウド上で修正し、ローカルデバイスへはAWS IoTからデプロイ実施で更新ができます。
それではRaspberry Piのインストールから始めます。
評価環境
- Raspberry Pi 3B+ (OS:rasbpian-buster)
- MacBook Pro (macOS Big Sur : 11.0.1)
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」を選択します。
9. Raspberry Pi SSH有効設定(P2 SSH選択)
「P2 SSH」を選択します。
10. Raspberry Pi SSH有効設定確認(はい選択)
「はい」を選択します。
11. Raspberry Pi SSH有効設定最終確認(了解選択)
The SSH server is enable とメッセージが出るので「了解」を選択します。
12. Raspberry Pi config終了確認(Finish選択)
「了解」を選択すると最初のメニュー画面に戻るので、「Finish」を選択します。選択後再起動します。
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 PIへSSH接続
MACからターミナルを起動し、Raspberry PIにSSH接続します。(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 Pi にAWS 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のターミナルを起動し、SSHでRaspberry 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 Pi は AWS IoT Greengrass の準備ができた状態になります。
$sudo reboot