Atom's tech blog

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

f:id:iAtom:20201202141535j:plain

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


ここではコアデバイスRaspberry Pi)にインストールして起動したGreengrassとクラウド側のAWS IoTと連携(接続・通信)をします。


Part1の冒頭で説明した「AWS IoTに登録したLambda関数をRaspberry Piへデプロイする」設定がここになります。

AWS構成図

f:id:iAtom:20201203142522j:plain

Lambda 関数の作成とパッケージ化

今回のケースではAWS IoT Greengrass Core SDK for Python を使用して MQTT メッセージ送信します。

このステップでは、次の操作を行います。

  • AWS IoT Greengrass Core SDK for PythonMACへダウンロードします。
  • Lambda 関数コードと依存関係を含む関数デプロイパッケージを作成します。
  • Lambda コンソールを使用し、Lambda 関数を作成してデプロイパッケージをアップロードします。
  • Lambda 関数のバージョンを発行し、そのバージョンを指すエイリアスを作成します。

尚、Python 3.7 をコアデバイスにインストールする必要あり。

AWS IoT Greengrass Core SDK for Pythonのダウンロード

下記からダウンロードしてください。 自分はgitcloneせず、MACへzipファイルをダウンロードしました。

AWS IoT Greengrass Core SDK for Python


f:id:iAtom:20201129173539j:plain

ダウンロードファイルの構成

ダウンロードしたzipファイルを解凍します。構成は以下になっています。 使用するフォルダとサンプルソースは、「greengrasssdk フォルダ」、「greengrassHelloWorld.py」です。


f:id:iAtom:20201129175027j:plain

Lambda関数のデプロイパッケージ作成

「greengrasssdk フォルダ」、「greengrassHelloWorld.py」をLambda関数としてのデプロイパッケージを作成します。 下記の図のように「greengrasssdk フォルダ」と「greengrassHelloWorld.py」は同じ位置に配置してください。


f:id:iAtom:20201129180108j:plain

MACのターミナルを起動し、上記フォルダ位置に移動してから下記のzipコマンドを実行してください。

    $ zip -r hello_world_python_lambda.zip greengrasssdk greengrassHelloWorld.py

これでデプロイするパッケージ(Lambda関数)ができました。

Greengrassグループの選択

AWS IoT Greengrassサービスからグループを選択してください。


f:id:iAtom:20201202115922j:plain

Greengrass グループへLambda の追加

zip化したLambda関数をアップロードします。 左メニューのLambdaでRaspberry Piに転送し、Raspberry Piで動かすためのLambda関数を登録します。 まず、右上の「Lambdaの追加」ボタンを選択してください。


f:id:iAtom:20201129182241j:plain


新しいLambdaの作成を選択してください。


f:id:iAtom:20201130091542j:plain


関数の作成画面に遷移します。 「一から作成」を選択し、 関数名はAWSのサイトに合わせて「Greengrass_HelloWorld」を入力し、ランタイムは「Python3.7」を選択してください。 アクセス権はデフォルトのままにし、「関数を作成」ボタンをクリックしてください。


f:id:iAtom:20201130093035j:plain

デプロイパッケージ(Lambda関数)のアップロード

関数が作成されると以下の画面に遷移します。


f:id:iAtom:20201130103021j:plain


画面スクロールすると下の方に「関数コード」があリますので、「アクション」ボタンから「.zipファイルをアップロード」を選択します。 こちらではzipファイルに圧縮したLambda関数(hello_world_python_lambda.zip)をMACからアップロードします。


f:id:iAtom:20201130094911j:plain


.zipファイルをアップロード」を選択すると、「アップロード」ボタンが表示されますので、そちらをクリックします。


f:id:iAtom:20201130095340j:plain


MAC上で作成した「hello_world_python_lambda.zip」ファイルを選択し、「アップロード用に選択」ボタンをクリックします。


f:id:iAtom:20201130095517j:plain


保存ボタンをクリックします。アップロードされるまで少し時間がかかります。


f:id:iAtom:20201130100619j:plain


アップロードが完了すると「関数コード」画面にアップロードしたsdkpythonファイルが展開されていることが見えます。


f:id:iAtom:20201130100653j:plain


ランタイム、ハンドラ設定をします。「編集」ボタンをクリックします。


f:id:iAtom:20201130101041j:plain


ランタイムは「Python3.7」を選択し、ハンドラは「greengrassHelloWorld.function_handler」と入力してください。 最後に保存をクリックします。


f:id:iAtom:20201130102048j:plain


このgreengrassHelloWorld.function_handlerは、「greengrassHelloWorld.py」の「function_handler()」を使用すると意味。


f:id:iAtom:20201130102139j:plain

Lambda関数を発行

アクション」メニューから「新しいバージョンを発行」をクリックします。この作業はASW上でRaspberry Piへデプロイするソースコードの世代管理をするために実施します。


f:id:iAtom:20201130103254j:plain

ここではAWSのサイトのガイドと同様に「First version」として入力し、「発行」ボタンをクリックします。


f:id:iAtom:20201130103829j:plain

Lambda関数のエイリアス作成

このエイリアス作成とは.... AWSサイトには次のような説明があります。

  • Greengrass グループは、Lambda 関数をエイリアス(推奨)またはバージョンで参照できます。エイリアスを使用する方がコード更新の管理が簡単です。関数コードが更新された場合にサブスクリプションテーブルやグループ定義を変更する必要がないためです。代わりに、新しい関数バージョンのエイリアスを指定します。

バージョンよりエイリアスの方が管理がしやすいので推奨とのことなので、エイリアスを作成します。

アクション」ボタンから「エイリアスを作成」を選択します。


f:id:iAtom:20201130110023j:plain


名前は「GG_HelloWorld」を入力、バージョンは「」を選択し、「保存」ボタンをクリックします。


f:id:iAtom:20201130110415j:plain


保存が完了するとエイリアスが作成されます。


f:id:iAtom:20201130110825j:plain

AWS IoT GreengrassのLambda関数の設定

先ほどLambda関数をAWS IoTへアップロードし、バージョン&エイリアス登録まで実施しましたが、作成したグループ「RaspberryPI」で使用できるようにLambda関数をグループに追加します。

Greengrassグループの Lambdaで「Lambdaの追加」をクリックします。


f:id:iAtom:20201130112902j:plain


先ほどAWS IoTへアップロードしたLambda関数を使用したいので、「既存のLambdaを使用」をクリックします。


f:id:iAtom:20201130113234j:plain


前に作成したLambda 関数名 (Greengrass_HelloWorld)を選択し、次へ。


f:id:iAtom:20201130113736j:plain

エイリアス名「GG_HelloWorld」を選択し、「完了」ボタンをクリックします。


f:id:iAtom:20201130115903j:plain


これでGreengrassグループ「RaspberryPI」へLambda関数の登録が完了しました。


f:id:iAtom:20201130120347j:plain


Greengrassグループ固有のLambda設定をします。


f:id:iAtom:20201130131430j:plain


タイムアウト」を25秒。「Lambdaのライフタイム」を「持続時間が長く無制限に稼働する関数にする」を選択します。

タイムアウト時間はLambda関数が起動する周期時間? よくわからない....。 ライフサイクルは「いつも起動して制限なく動作しておく関数する」と意味でしょうね。


f:id:iAtom:20201130131712j:plain


最後に「更新」ボタンをクリックします。


f:id:iAtom:20201130132215j:plain


タイムアウト時間、ライフサイクルが更新されていることを確認し完了。


f:id:iAtom:20201130133845j:plain

コアデバイスクラウド設定をデプロイ

Raspberry Piに対してクラウドに設定したLambda関数をデプロイします。

Greengrassデーモン起動確認

Raspberry PiでGreengrassデーモンが起動されているか確認します。 前々回のStepで動作させていますが、停止している可能性もあるため起動確認しておきましょう。

Raspberry PiSSH接続し、次のコマンドを入力します。

    $ 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の画面からデプロイ登録

グループが初めてデプロイされたときにのみ、検出方法の確認が求められます。その時は「自動検出」を選択してください。 「自動検出」の表示画像を取り損ねました.......。

ここでは、一度デプロイ済後にキャプチャした画面イメージです。(履歴情報は画像編集で消しています) デプロイを実行すると、「保留中」-> 「進行中」 -> 「正常に完了しました」とステータスが変わります。

デプロイが失敗すると「失敗」と表示されます。


f:id:iAtom:20201130134322j:plain


デプロイが成功すると次のイメージです。


f:id:iAtom:20201130135712j:plain


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の設定を見ることが出来ます。下の方にスクロールするとログのセクションがあります。


f:id:iAtom:20201130150458j:plain


編集」をクリックする下記が表示されますので、出力レベルの変更ができます。


f:id:iAtom:20201130150800j:plain