テックブログ

Raspberry PiでAWS GreenGrassをセットアップし、AWS Lambda 関数を設定するまで

投稿日:2019年6月2日 更新日:

最近、組み込み×クラウドの話をよく耳にします。
自分でも、どんな取り組みがあるのかと調べては試してを繰り返しています。

そんな中、AWS Summit で「IoT GreenGrass」を見て便利そうだなと思ったで、環境構築からチュートリアル実行までやってみました。

参考ページ

AWS IoT Greengrass の使用開始 チュートリアル

AWS IoT Greengrass の設定

AWS IoT から IoT Greengrass を選択。

q1.png

「グループを作成」を選択。

q2.png

「簡単な作成の使用」を選択。

q3.png

グループに任意の名前をつけます。

q4.png

Core機能の名前はそのままで大丈夫です。
グループ名の末に_Coreがつくと思います。

q5.png

グループとCoreの作成をしてください。
その後のコアのセキュリティリソースのダウンロードも忘れずに。

q6.png

また以下からAWS IoT Greengrass Core ソフトウェアインストールパッケージをダウンロードしておきます。
(ページの下の方に進むとあります)

AWS IoT Greengrass Core ソフトウェア

今回はラズパイに入れるので「Raspbian」を選びましょう。

q7.png

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です。

次にコマンドラインブートファイルを編集し、メモリ 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 をダウンロードします。

AWS IoT Greengrass Core SDK

Python の 最新バージョンを選択。

q8.png

今回はフォルダから以下を取得。

examples\HelloWorld (フォルダ)
greengrasssdk (フォルダ)

greengrasssdk を HelloWorld フォルダ直下ににコピー。

greengrassHelloWorld.py ファイルと greengrasssdk フォルダを hello_world_python_lambda.zip という名前の圧縮された .zip ファイルに保存。
この様にして Lambda 関数デプロイパッケージを作成します。

q9.png

macなどの場合は以下のコマンドで上記パッケージが簡単に作成できます。

sudo zip -r hello_world_python_lambda.zip greengrasssdk greengrassHelloWorld.py

Lambda 関数の作成

AWS のサービスから Lambda を選択。

q10.png

関数の作成を選択。

q11.png

一から作成を選択。

q12.png

関数名は任意で、ランタイムはPython 2.7を選択。

q13.png

ロールの設定はこんな感じ。
そして、関数の作成を押下。

q14.png
q16.png

設定タブの関数コードを以下の様に設定し、先ほど作成したパッケージをアップロードします。

アクションから「新しいバージョンを発行」を選択。

q15.png

任意のバージョン名を設定。そして発行します。

q17.png

一応エイリアスも設定しておきます。

q18.png

任意の名前で作成。

スクリーンショット 2019-06-13 20.57.52.png

作成完了です。

IoT Greengrass の Lambda 関数の設定

IoT Greengrass のグループメニュー(先ほど作成した)から Lambda を選択。
その後、Lambdaの追加を選択。

q19.png

「既存の Lambda の使用」を選択。

q20.png

先程作成した Lambda 関数が出てくるので選択し次へ。

q21.png

エイリアスも先ほど作ったものを選択し完了。

q22.png

「…」を選択し、設定の編集を選択します。

q23.png

下記の赤い枠で括った部分の設定を変更します。
その後、更新。

q24.png

次に「サブスクリプション」を選択し、「最初のサブスクリプションの追加」を追加します。

q25.png

ソースの選択では以下の様に選択。

q26.png

ターゲットの選択では以下の様に選択。
その後、次へ。

q27.png

トピックフィルターを以下の様に入力。
その後次へ、完了を選択。

スクリーンショット 2019-06-13 21.24.08.png

アクションメニューから「デプロイ」を選択。

q28.png

「自動検出」を選択。

q29.png

「権限の付与」を選択。

q30.png
スクリーンショット 2019-06-19 11.32.08.png

その後デプロイすると…

うまくいきました!!!

そんなスラスラとできたわけではなかった

上記の手順でみていくとあたかも簡単にできた感じですが、実際はめちゃくちゃ躓きました…
(デプロイ成功の日時で察した方もいるかと思いますが..)

自分の要領の悪さと理解不十分のせいかもしれませんが、躓いた部分を以下に記述します。

なぜか 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

また、その他のエラーが出た場合はこちらのトラブルシューティングを参考にするのが良いと思います!

正直使いこなすまでにはもっと理解が必要そうです…

-テックブログ
-, , , ,

執筆者:

関連記事

no image

Go言語で数値かどうかを判定する

実装で気になったところをメモ程度に残していく。 正規表現による方法 正規表現を使うと処理速度は遅くなるので、ループを多く回す時には不向きかもしれない。(個人的にはあまり気にならなかった) flag, …

no image

Go言語 × AWSIoT × Raspberrypi やってみた

前の記事ではRaspberrypiとAWSIoTを通信させる時、サンプルのPythonプログラムで動かしました。その際、他にも通信をする方法あるのかなと探してみたところ、Goでも出来そうだったので試し …

no image

AWS IoT × Raspberrypi でやったことメモ

AWS IoTの使い方を知るために、Raspberrypiと繋げてみることにしました。その際やったことをメモベースでまとめています。基本的にRaspberrypi側の設定です。 参考ページ 以下のペー …

トップ