APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

AWS IoT Greengrassを使ってみる(その2)

はじめに

どうも、システム基盤開発室という部署に所属してる社員番号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使用しても同様のことが可能です。