Jetson NanoでAWS IoT Greengrassを使う Lambda編

記事タイトルとURLをコピーする

前回に引き続きJetson NanoとAWS IoT Greengrassを設定していきます。

今回はドキュメントのモジュール3に沿って、Lambdaのデプロイを試してみます。

なのでほとんどJetson nanoと関係ないです。

1. Lambda関数の作成

まずはPCやMacやらでサンプルの関数を作成します。ワタシはAmazon Linux (EC2)で実施しました。Lambdaへアップロードするためzipを作成します。(サンプルなのでzipでアップロードする手順だが、実際にはServerless Frameworkとかで作成するのがいいのか??)

まずはAWS IoT Greengrass Core SDK for Pythonをクローン。

git clone git@github.com:aws/aws-greengrass-core-sdk-python.git

クローンしたフォルダへ移動。 AWS IoT Greengrass Core SDKをサンプルコードのフォルダへコピー。

cd aws-greengrass-core-sdk-python/
cp -r greengrasssdk/ examples/HelloWorld/

サンプルのフォルダへ移動し、zip化。

cd examples/HelloWorld
zip -r hello_world_python_lambda.zip greengrasssdk greengrassHelloWorld.py

ここからはAWSマネージメントコンソールの作業です。

LambdaのコンソールからLambda関数を新規作成します。

いい感じの関数名を入力。 ランタイムはPython 3.7とします。Jetson NanoにPython 3.7がインストールされていることが前提となります。

コードエントリタイプを「zipファイルをアップロード」にし、「アップロード」から作成したzipファイルをアップロード。 ハンドラーは ```greengrassHelloWorld.function_handler```` です。

上記が設定出来たら保存。

ドキュメントに注記があるように、Greengrassでは$LATESTバージョンのLambdaエイリアスをサポートしていないそうなので、そうじゃないエイリアスを作成します。

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

いい感じに説明を入れて発行。

「アクション」から「エイリアスの作成」。

いい感じに名前と説明を入れて、バージョンは上記で作成したバージョンを選択(画像の場合は「1」)。作成。

2. AWS IoT Greengrass側の設定

Lambda関数ができたので、AWS IoT Greengrass側の設定を行います。

前回作成したGreengrassグループの画面を開き「Lambdaの追加」をクリック。

先ほど作成したLambdaを使用するので「既存のLambdaの使用」。

先ほど作成したLambdaを選択し「次へ」。

先ほど作成したエイリアスを選択し「完了」。

一覧にLambdaが追加されます。「・・・」から「設定の編集」をクリック。

タイムアウトを25秒、Lambdaのライフサイクルは「存続時間が長く無期限に稼働する関数にする」を選択し、「更新」。 「存続時間が長く無期限に稼働する関数にする」とは、要はGreengrassが起動したらずっと起動しっぱなしのLambda関数と思ってもらえればokです。逆に「オンデマンド」は呼び出しごとに起動するLambda関数になります。

Lambda関数の作成は以上。次にサブスクリプションを設定していきます。 サンプルのLambda関数はデバイス側からAWS側へメッセージを送信するだけなので、サブスクリプションを1つ用意します。

グループの画面の「サブスクリプション」から「最初のサブスクリプションの追加」。

ソースは先ほど作成したLambda関数、ターゲットは「IoT Cloud」とし、「次へ」。

トピックのフィルターは hello/world 。「次へ」。

「完了」。

続いて、ログ出力設定を行います。今回はサンプルなのでJetson Nano側へ書き込むようにしますが、実運用する場合はログローテなりCloudWatchに出力するなりがいいかもしれません。

グループの「設定」から「ローカルログ設定」の「編集」をクリック。

「別のログタイプの追加」をクリック。

「ユーザーLambda」と「Greengrass システム」の両方にチェックを入れ「更新」。

基本的にデフォルトでいいですが「ディスク容量制限」をいい感じに設定して「保存」。

ここで設定したログはデバイス側の {Greengrassのルート}/ggc/var/log 配下に保存されます。ドキュメント通りに設定していれば {Greengrassのルート}/greengrass となります。

3. デプロイ

デプロイする前にJetson Nano側でAWS IoT Greengrassが起動しているか確認します。

ps aux | grep -E 'greengrass.*daemon'

プロセスがなければ起動しましょう。

sudo /greengrass/ggc/core/greengrassd start

さてJetson Nano側AWS IoT Greengrassの起動が確認できたらデプロイを実行します。

「アクション」から「デプロイ」をクリック。

今回は1台しかないので自動検出とします。

ドキュメントによると少々時間がかかることがあるそうですが、ワタシの環境では秒で終わりました。

「デプロイ」からステータスを確認できます。「正常に完了しました」となっていればok

4. 確認

さてJetson Nano側でLambdaが起動しているか確認します。

AWS IoTのコンソールから「テスト」をクリック。 「トピックのサブスクリプション」は hello/world とします。 サービスの品質は「0」、MQTTペイロードの表示は「ペイロードを文字列として表示」とします。

「トピックへのサブスクライブ」をクリック。 すると...正常にデプロイできていれば、ひたすらHell Worldが送信されます。

5. Jetson Nano側のLambdaの削除

サンプルを削除する場合は、グループからLambdaとサブスクリプションを削除しデプロイすればokです。

まとめ

いかがでしたでしょうか。今回はドキュメントに沿って、簡単なサンプルを動かしてみました。jetson Nanoなので、Lamdaだけでなくカメラを付けて画像処理やSagemakerのモデルをデプロイして云々ができるかもしれません。