Raspberry Pi でAWS IoT Greengrassを動かしてみた!(Part4)
本記事はGreengrass Core = 1.11.0 で実施した情報です。
ここではコアデバイス(Raspberry Pi)にインストールして起動したGreengrassとクラウド側のAWS IoTと連携(接続・通信)をします。
- Part1: Raspberry Piのセットアップ
- Part2: AWS IoT Greengrass(クラウド)の設定
- Part3: Raspberry PiへGreengrassソフトウェアインストールと起動
- Part4: Greengrass(Raspberry Pi)とAWS IoT(クラウド)と連携
- Part5: Greengrass(Raspberry Pi)でLambda関数の実行動作
Part1の冒頭で説明した「AWS IoTに登録したLambda関数をRaspberry Piへデプロイする」設定がここになります。
AWS構成図
Lambda 関数の作成とパッケージ化
今回のケースではAWS IoT Greengrass Core SDK for Python を使用して MQTT メッセージ送信します。
このステップでは、次の操作を行います。
- AWS IoT Greengrass Core SDK for Python をMACへダウンロードします。
- Lambda 関数コードと依存関係を含む関数デプロイパッケージを作成します。
- Lambda コンソールを使用し、Lambda 関数を作成してデプロイパッケージをアップロードします。
- Lambda 関数のバージョンを発行し、そのバージョンを指すエイリアスを作成します。
尚、Python 3.7 をコアデバイスにインストールする必要あり。
AWS IoT Greengrass Core SDK for Pythonのダウンロード
下記からダウンロードしてください。 自分はgitcloneせず、MACへzipファイルをダウンロードしました。
AWS IoT Greengrass Core SDK for Python
ダウンロードファイルの構成
ダウンロードしたzipファイルを解凍します。構成は以下になっています。 使用するフォルダとサンプルソースは、「greengrasssdk フォルダ」、「greengrassHelloWorld.py」です。
Lambda関数のデプロイパッケージ作成
「greengrasssdk フォルダ」、「greengrassHelloWorld.py」をLambda関数としてのデプロイパッケージを作成します。 下記の図のように「greengrasssdk フォルダ」と「greengrassHelloWorld.py」は同じ位置に配置してください。
MACのターミナルを起動し、上記フォルダ位置に移動してから下記のzipコマンドを実行してください。
$ zip -r hello_world_python_lambda.zip greengrasssdk greengrassHelloWorld.py
これでデプロイするパッケージ(Lambda関数)ができました。
Greengrassグループの選択
AWS IoT Greengrassサービスからグループを選択してください。
Greengrass グループへLambda の追加
zip化したLambda関数をアップロードします。 左メニューのLambdaでRaspberry Piに転送し、Raspberry Piで動かすためのLambda関数を登録します。 まず、右上の「Lambdaの追加」ボタンを選択してください。
新しいLambdaの作成を選択してください。
関数の作成画面に遷移します。
「一から作成」を選択し、
関数名はAWSのサイトに合わせて「Greengrass_HelloWorld」を入力し、ランタイムは「Python3.7」を選択してください。
アクセス権はデフォルトのままにし、「関数を作成」ボタンをクリックしてください。
デプロイパッケージ(Lambda関数)のアップロード
関数が作成されると以下の画面に遷移します。
画面スクロールすると下の方に「関数コード」があリますので、「アクション」ボタンから「.zipファイルをアップロード」を選択します。
こちらではzipファイルに圧縮したLambda関数(hello_world_python_lambda.zip)をMACからアップロードします。
「.zipファイルをアップロード」を選択すると、「アップロード」ボタンが表示されますので、そちらをクリックします。
MAC上で作成した「hello_world_python_lambda.zip」ファイルを選択し、「アップロード用に選択」ボタンをクリックします。
保存ボタンをクリックします。アップロードされるまで少し時間がかかります。
アップロードが完了すると「関数コード」画面にアップロードしたsdkとpythonファイルが展開されていることが見えます。
ランタイム、ハンドラ設定をします。「編集」ボタンをクリックします。
ランタイムは「Python3.7」を選択し、ハンドラは「greengrassHelloWorld.function_handler」と入力してください。
最後に保存をクリックします。
このgreengrassHelloWorld.function_handlerは、「greengrassHelloWorld.py」の「function_handler()」を使用すると意味。
Lambda関数を発行
「アクション」メニューから「新しいバージョンを発行」をクリックします。この作業はASW上でRaspberry Piへデプロイするソースコードの世代管理をするために実施します。
ここではAWSのサイトのガイドと同様に「First version」として入力し、「発行」ボタンをクリックします。
Lambda関数のエイリアス作成
このエイリアス作成とは.... AWSサイトには次のような説明があります。
- Greengrass グループは、Lambda 関数をエイリアス(推奨)またはバージョンで参照できます。エイリアスを使用する方がコード更新の管理が簡単です。関数コードが更新された場合にサブスクリプションテーブルやグループ定義を変更する必要がないためです。代わりに、新しい関数バージョンのエイリアスを指定します。
バージョンよりエイリアスの方が管理がしやすいので推奨とのことなので、エイリアスを作成します。
「アクション」ボタンから「エイリアスを作成」を選択します。
名前は「GG_HelloWorld」を入力、バージョンは「1」を選択し、「保存」ボタンをクリックします。
保存が完了するとエイリアスが作成されます。
AWS IoT GreengrassのLambda関数の設定
先ほどLambda関数をAWS IoTへアップロードし、バージョン&エイリアス登録まで実施しましたが、作成したグループ「RaspberryPI」で使用できるようにLambda関数をグループに追加します。
Greengrassグループの Lambdaで「Lambdaの追加」をクリックします。
先ほどAWS IoTへアップロードしたLambda関数を使用したいので、「既存のLambdaを使用」をクリックします。
前に作成したLambda 関数名 (Greengrass_HelloWorld)を選択し、次へ。
エイリアス名「GG_HelloWorld」を選択し、「完了」ボタンをクリックします。
これでGreengrassグループ「RaspberryPI」へLambda関数の登録が完了しました。
Greengrassグループ固有のLambda設定をします。
「タイムアウト」を25秒。「Lambdaのライフタイム」を「持続時間が長く無制限に稼働する関数にする」を選択します。
タイムアウト時間はLambda関数が起動する周期時間? よくわからない....。 ライフサイクルは「いつも起動して制限なく動作しておく関数する」と意味でしょうね。
最後に「更新」ボタンをクリックします。
タイムアウト時間、ライフサイクルが更新されていることを確認し完了。
コアデバイスへクラウド設定をデプロイ
Raspberry Piに対してクラウドに設定したLambda関数をデプロイします。
Greengrassデーモン起動確認
Raspberry PiでGreengrassデーモンが起動されているか確認します。 前々回のStepで動作させていますが、停止している可能性もあるため起動確認しておきましょう。
Raspberry PiへSSH接続し、次のコマンドを入力します。
$ ps aux | grep -E 'greengrass.*daemon' root 8679 35.0 2.2 976572 21228 pts/1 Sl 13:49 0:01 /greengrass/ggc/packages/1.11.0/bin/daemon -core-dir /greengrass/ggc/packages/1.11.0 -greengrassdPid 8674 pi 8903 0.0 0.0 4048 524 pts/1 S+ 13:49 0:00 grep --color=auto -E greengrass.*daemon
起動している場合は、 「/greengrass/ggc/packages/1.11.0/bin/daemon -core-dir 」が表示されます。
デーモンが起動していない場合は次のコマンドを入力します。
$ cd /greengrass/ggc/core/ $ sudo ./greengrassd start
この状態でRaspberry PiへLambda関数をデプロイする準備ができました。
AWS IoTの画面からデプロイ登録
グループが初めてデプロイされたときにのみ、検出方法の確認が求められます。その時は「自動検出」を選択してください。 「自動検出」の表示画像を取り損ねました.......。
ここでは、一度デプロイ済後にキャプチャした画面イメージです。(履歴情報は画像編集で消しています) デプロイを実行すると、「保留中」-> 「進行中」 -> 「正常に完了しました」とステータスが変わります。
デプロイが失敗すると「失敗」と表示されます。
デプロイが成功すると次のイメージです。
Lambda関数がRaspberry Piにデプロイされていることを確認してみましょう。
「greengrassHelloWorld.py」、「greengrasssdk」があることが確認できました。
$ sudo ls -la /greengrass/ggc/deployment/lambda/arn*/ drwxr-x--- 3 root ggc_group 4096 11月 30 14:45 . drwxr-xr-x 3 root root 4096 11月 30 14:45 .. -rwxr-xr-x 1 root root 2290 11月 30 14:45 greengrassHelloWorld.py drwxr-xr-x 4 root root 4096 11月 30 14:45 greengrasssdk
Rasberry Piにデプロイした情報は、以下のファイルにあります。
$ sudo cat /greengrass/ggc/deployment/group/group.json
証明書情報は下記にあります。
$ sudo cat /greengrass/config/config.json
ログ情報(参考)
システムログ
Greengrassのデーモンが実行する際のログを確認することが出来ます。Greengrassがおかしいと思った時はまずこのログを確認します。
$ sudo tail -F /greengrass/ggc/var/log/system/runtime.log
ルーティングログ
Greengrassのサブスクリプションで指定したルーティングの状況について確認します。
$ sudo tail -F /greengrass/ggc/var/log/system/GGConnManager.log
Lambdaのログ
Lambdaのログは/greengrass/ggc/var/log/user/の中の出力されます。
$ sudo find /greengrass/ggc/var/log/user -type f -name DataChecker.log
検索されたファイルを tailコマンドで確認
$ sudo tail -F /greengrass/ggc/var/log/user/ap-northeast-1/1234567890/DataChecker.log
Greengrassのログ出力レベルを変更したい
Greengrassグループを開き、左側のメニューで設定を開くと、Greengrassの設定を見ることが出来ます。下の方にスクロールするとログのセクションがあります。
「編集」をクリックする下記が表示されますので、出力レベルの変更ができます。