前回に引き続き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のモデルをデプロイして云々ができるかもしれません。
Yusuke Mine(書いた記事を見る)
I get drunk but it's not enough 'Cause the morning comes and you're not my baby.