最近、組み込み×クラウドの話をよく耳にします。
自分でも、どんな取り組みがあるのかと調べては試してを繰り返しています。
そんな中、AWS Summit で「IoT GreenGrass」を見て便利そうだなと思ったで、環境構築からチュートリアル実行までやってみました。
参考ページ
AWS IoT Greengrass の使用開始 チュートリアル
AWS IoT Greengrass の設定
AWS IoT から IoT Greengrass を選択。
「グループを作成」を選択。
「簡単な作成の使用」を選択。
グループに任意の名前をつけます。
Core機能の名前はそのままで大丈夫です。
グループ名の末に_Coreがつくと思います。
グループとCoreの作成をしてください。
その後のコアのセキュリティリソースのダウンロードも忘れずに。
また以下からAWS IoT Greengrass Core ソフトウェアインストールパッケージをダウンロードしておきます。
(ページの下の方に進むとあります)
AWS IoT Greengrass Core ソフトウェア
今回はラズパイに入れるので「Raspbian」を選びましょう。
Raspberry Pi側の設定
Raspberry Pi のセットアップ
以下コマンドを実行。
sudo adduser --system ggc_user
sudo addgroup --system ggc_group
起動時にオペレーティングシステムのハードリンクとソフトリンクの保護を有効にする。
まずは以下コマンドを実行。
cd /etc/sysctl.d
ls
98-rpi.conf ファイルがあれば以下の2行を末尾に追加。
(rootとして実行する必要がある場合も)
fs.protected_hardlinks = 1
fs.protected_symlinks = 1
再起動して以下を実行。
sudo sysctl -a 2> /dev/null | grep fs.protected
fs.protected_hardlinks = 1 と fs.protected_symlinks = 1が表示されればOKです。
次にコマンドラインブートファイル (cmdline.txt)を編集し、メモリ cgroups を有効にしてマウントします。
containerization モードで実行するには、Cgroups も必要になります。
boot直下に移動します。
cd /boot/
ファイルの既存行の末尾に以下を追加。
cgroup_enable=memory cgroup_memory=1
再起動して完了です。
パッケージ作成の前準備
まずは先ほどダウンロードしたAWS IoT Greengrass Core ソフトウェアインストールパッケージを解凍します。
すると以下の様なフォルダ構成になると思います。
greengrass
|
|- cers
|- config
|- ggc
|- ota
次にグループ作成時にダウンロードした、コアのセキュリティリソースのフォルダも解凍します。
すると以下の様なフォルダ構成になると思います。
(コアのセキュリティリソースのフォルダ名)
|
|- cers
|- config
上記で解凍したコアのセキュリティリソースの cers の中身を、 greengrass 直下の同じ名前のフォルダに移動します。
また、セキュリティリソースの config の config.json を greengrass 直下の config に移動し、ファイルを上書きします。
上記が終了したら、 greengrass を圧縮し、 Raspberry Pi へ送信します。
(自分はmacだったので、scpコマンドを使いました。)
送信できたら、 Raspberry Pi で、圧縮した greengrass フォルダを解凍し、/ 直下に配置します。
ルート CA 証明書を配置
以下のコマンドを実行し、ルート CA 証明書を配置。
(別の証明書を使いたい場合はこちらを参考に)
cd /greengrass/certs/
sudo wget -O root.ca.pem https://www.amazontrust.com/repository/AmazonRootCA1.pem
ダウンロードしたファイルが空でないか確認します。
cat root.ca.pem
Raspberry Pi で AWS IoT Greengrass を起動します。
「Greengrass successfully started」メッセージが表示されたら、PID をメモしておいてください。
cd /greengrass/ggc/core/
sudo ./greengrassd start
AWS IoT Greengrass コア ソフトウェア が機能しているか確認します。
ps aux | grep (PIDをかく)
実行中の Greengrass デーモンへのパスを持つ PID のエントリが表示されれば機能しています。
Lambda 関数の作成、パッケージ化
パッケージ作成
以下のページから、AWS IoT Greengrass Core SDK for Python をダウンロードします。
Python の 最新バージョンを選択。
今回はフォルダから以下を取得。
examples\HelloWorld (フォルダ)
greengrasssdk (フォルダ)
greengrasssdk を HelloWorld フォルダ直下ににコピー。
greengrassHelloWorld.py ファイルと greengrasssdk フォルダを hello_world_python_lambda.zip という名前の圧縮された .zip ファイルに保存。
この様にして Lambda 関数デプロイパッケージを作成します。
macなどの場合は以下のコマンドで上記パッケージが簡単に作成できます。
sudo zip -r hello_world_python_lambda.zip greengrasssdk greengrassHelloWorld.py
Lambda 関数の作成
AWS のサービスから Lambda を選択。
関数の作成を選択。
一から作成を選択。
関数名は任意で、ランタイムはPython 2.7を選択。
ロールの設定はこんな感じ。
そして、関数の作成を押下。
設定タブの関数コードを以下の様に設定し、先ほど作成したパッケージをアップロードします。
アクションから「新しいバージョンを発行」を選択。
任意のバージョン名を設定。そして発行します。
一応エイリアスも設定しておきます。
任意の名前で作成。
作成完了です。
IoT Greengrass の Lambda 関数の設定
IoT Greengrass のグループメニュー(先ほど作成した)から Lambda を選択。
その後、Lambdaの追加を選択。
「既存の Lambda の使用」を選択。
先程作成した Lambda 関数が出てくるので選択し次へ。
エイリアスも先ほど作ったものを選択し完了。
「...」を選択し、設定の編集を選択します。
下記の赤い枠で括った部分の設定を変更します。
その後、更新。
次に「サブスクリプション」を選択し、「最初のサブスクリプションの追加」を追加します。
ソースの選択では以下の様に選択。
ターゲットの選択では以下の様に選択。
その後、次へ。
トピックフィルターを以下の様に入力。
その後次へ、完了を選択。
アクションメニューから「デプロイ」を選択。
「自動検出」を選択。
「権限の付与」を選択。
うまくいきました!!!
そんなスラスラとできたわけではなかった
上記の手順でみていくとあたかも簡単にできた感じですが、実際はめちゃくちゃ躓きました...
(デプロイ成功の日時で察した方もいるかと思いますが..)
自分の要領の悪さと理解不十分のせいかもしれませんが、躓いた部分を以下に記述します。
なぜか Rasbian os でうまくいかなかった
デプロイした際に進行中のステータスまではいくのですが、そこから進展がなかったです。
Raspberry Pi のOSを UbuntuMATE にして再度やり直したらうまくいきました。
(インストールパッケージはrasbianなのに...?)
もうちょっとちゃんと調べてみます。
ユーザーの名前空間が有効になっていないために AWS IoT Greengrass コア ソフトウェアが Raspberry Pi で実行されない
自分の環境では以下のエラーが出ました。
The AWS IoT Greengrass Core software does not run on Raspberry Pi because user namespace is not enabled.
これは以下のコマンドを実行し再デプロイすることで、解決しました。
# ファームウェアおよび kernel を最新の安定したバージョンに更新
sudo BRANCH=stable rpi-update
# daemonを停止
cd /greengrass/gcc/core
sudo ./greengrassd stop
# 再起動
sudo reboot
# 再起動後にdaemonを再起動
cd /greengrass/gcc/core
sudo ./greengrassd restart
また、その他のエラーが出た場合はこちらのトラブルシューティングを参考にするのが良いと思います!
正直使いこなすまでにはもっと理解が必要そうです...