はじめに
どうも、システム基盤開発室という部署に所属してる社員番号666です。
前回は AWS IoT Greengrassを使ってみる ということで
- AWS IoT Greengrassの作成
- ラズベリーパイのGreengrassソフトウェア起動 を実施しました。
今回は Greengrass の機能を使ってLambdaコードをIoTデバイス(ラズパイ)にデプロイ・実行してみたいと思います。
Lambdaコードの準備
今回は Node.js を使います。
こちらのサイトから
https://docs.aws.amazon.com/ja_jp/greengrass/latest/developerguide/what-is-gg.html
AWS IoT Greengrass Core SDK ソフトウェアを入手します。
https://d1onfpft10uf5o.cloudfront.net/greengrass-sdk/downloads/nodejs/8.10/aws-greengrass-core-sdk-js-1.4.0.tar.gz
tar.gz を入手したら展開してください。展開後 sdk/の中にaws-greengrass-core-sdk-js.zip があるので更に展開します。
また、greengrassExamples/ の中にサンプルコードがあります。今回はこの HelloWorld/index.js を利用します。
AWS Lambdaへの登録
AWS Lambdaで関数を作成します。リージョンはGreengrassを作成したリージョンと同じにしてください。
[関数の作成]
関数名は任意です。 ランタイムはNode.js 8.10を指定する必要があります。
Lambdaの実行ロールはデフォルトで良いと思います。
コードは先ほどの HelloWorld/index.js を使います。
更に node_modules ディレクトリに入手したSDK aws-greengrass-core-sdk を配備します。
このあたりはNode.jsなLambda作成の手順のお作法と同じです。
新規にバージョンを作成して、その後任意の名称でエイリアスを作成します。
AWS IoT GreengrassへのLambda登録
さて、AWS IoT Greengrassの画面に戻りLambdaの登録をします。
[Lambdaの追加]または[最初のLambdaを追加する]をクリックしてLambda登録に進みます。
[既存のLambdaの使用]をクリックします。
先ほど作成したLambda: HelloGreengrassを選択します。
エイリアスを選択します。HelloGreengrassを選択します。
登録したLambdaについて設定を変更する必要があります。 [設定の編集]をクリックします。
タイムアウト値を: 30秒 に変更します
Lambdaライフサイクル: 依続期間が長く無制限に稼働する関数にするに変更します
ここまででLambdaの準備が完了しました。
IoT デバイスへのデプロイ
それではIoTデバイスへデプロイを実施します。
右上のアクションからデプロイを選択します。
はじめてのデプロイの場合はCoreの検出方法を選択します。ここは「自動検出」を選択しましょう。
デプロイが正常に成功した旨のメッセージが出力されればデプロイが完了です。
サブスクリプションの登録
次にサブスクリプションの登録をする必要があります。
[サブスクリプションの追加]または[最初のサブスクリプションの追加]をクリックします。
サブスクリプションの作成
まずはソースとターゲットを選択する必要があります。
ソースは HelloGreengrass LAMBDA
ターゲットは IoT Cloud サービス
を選択し[次へ]をクリックします。
トピックのフィルターを記載します。
ここではLambdaのソースコードに記載されている hello/world とします。
サブスクリプションが登録されました。
早速テストしてみましょう。
テスト
AWS IoT のトップ画面からGreengrassのテストが可能です。
左のメニューからテストをクリックしてください。
トピックのサブスクリプションに hello/world と入力します。
「ペイロードを文字列として表示」を選択して[トピックへのサブスクライブ]をクリックします。
あら...IoTデバイスがトピックにメッセージを発行し続けて、ここに表示されるはずなのですがナゼか出てきません...
IoTデバイス、すなわちラズパイでruntime.logを確認してみると
[ERROR]-runtime execution error: unable to start lambda container. {"errorString": "failed to run container sandbox: container_linux.go:344: starting container process caused \"exec: \\\"nodejs8.10\\\": executable file not found in $PATH\""} [ERROR]-Failed to start worker. {"workerId": "xxxxxxxx-f1cc-xxxx-xxxx-xxxxxxxxxxxx", "functionArn": "arn:aws:lambda:us-east-1:xxxxxxxxxxxx:function:HelloGreengrass:2", "errorString": "process start failed: failed to run container sandbox: container_linux.go:344: starting container process caused \"exec: \\\"nodejs8.10\\\": executable file not found in $PATH\""}
こんなログがありました。よくわかりませんが nodejs8.10 が必要なんでしょうか。シンボリックリンクで対応しました...\(^o^)/
改めてデプロイしてテストしてみます。
テストが成功しました。
いかがでしょうか。ほぼAWSの提供しているチュートリアルの内容ですが、Node.js使用しても同様のことが可能です。