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を作成したリージョンと同じにしてください。 f:id:yuki-kodama:20190611134220p:plain [関数の作成]

f:id:yuki-kodama:20190611134455p:plain
関数名は任意です。 ランタイムはNode.js 8.10を指定する必要があります。
Lambdaの実行ロールはデフォルトで良いと思います。

f:id:yuki-kodama:20190611135435p:plain
コードは先ほどの HelloWorld/index.js を使います。 更に node_modules ディレクトリに入手したSDK aws-greengrass-core-sdk を配備します。
このあたりはNode.jsなLambda作成の手順のお作法と同じです。
新規にバージョンを作成して、その後任意の名称でエイリアスを作成します。
f:id:yuki-kodama:20190611142321p:plain


f:id:yuki-kodama:20190611142350p:plain

AWS IoT GreengrassへのLambda登録

さて、AWS IoT Greengrassの画面に戻りLambdaの登録をします。

f:id:yuki-kodama:20190611232952p:plain [Lambdaの追加]または[最初のLambdaを追加する]をクリックしてLambda登録に進みます。


f:id:yuki-kodama:20190611233301p:plain [既存のLambdaの使用]をクリックします。

f:id:yuki-kodama:20190611233528p:plain 先ほど作成したLambda: HelloGreengrassを選択します。

f:id:yuki-kodama:20190611233743p:plain エイリアスを選択します。HelloGreengrassを選択します。

f:id:yuki-kodama:20190611234430p:plain 登録したLambdaについて設定を変更する必要があります。 [設定の編集]をクリックします。

f:id:yuki-kodama:20190611234712p:plain
タイムアウト値を: 30秒 に変更します
Lambdaライフサイクル: 依続期間が長く無制限に稼働する関数にするに変更します



ここまででLambdaの準備が完了しました。

IoT デバイスへのデプロイ

それではIoTデバイスへデプロイを実施します。 f:id:yuki-kodama:20190611235306p:plain

f:id:yuki-kodama:20190612001734p:plain 右上のアクションからデプロイを選択します。

f:id:yuki-kodama:20190612235434p:plain はじめてのデプロイの場合はCoreの検出方法を選択します。ここは「自動検出」を選択しましょう。

f:id:yuki-kodama:20190613231727p:plain デプロイが正常に成功した旨のメッセージが出力されればデプロイが完了です。

サブスクリプションの登録

次にサブスクリプションの登録をする必要があります。
f:id:yuki-kodama:20190613232203p:plain [サブスクリプションの追加]または[最初のサブスクリプションの追加]をクリックします。

f:id:yuki-kodama:20190613233354p:plain サブスクリプションの作成
まずはソースとターゲットを選択する必要があります。

f:id:yuki-kodama:20190613233851p:plain ソースは HelloGreengrass LAMBDA
ターゲットは IoT Cloud サービス
を選択し[次へ]をクリックします。

f:id:yuki-kodama:20190613234133p:plain トピックのフィルターを記載します。
ここではLambdaのソースコードに記載されている hello/world とします。


f:id:yuki-kodama:20190613234442p:plain



f:id:yuki-kodama:20190613234507p:plain



サブスクリプションが登録されました。
早速テストしてみましょう。

テスト

AWS IoT のトップ画面からGreengrassのテストが可能です。
f:id:yuki-kodama:20190612001738p:plain 左のメニューからテストをクリックしてください。



f:id:yuki-kodama:20190612233952p:plain トピックのサブスクリプションに hello/world と入力します。
ペイロードを文字列として表示」を選択して[トピックへのサブスクライブ]をクリックします。


f:id:yuki-kodama:20190613235338p:plain

あら...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^)/



改めてデプロイしてテストしてみます。
f:id:yuki-kodama:20190614193846p:plain

テストが成功しました。

いかがでしょうか。ほぼAWSの提供しているチュートリアルの内容ですが、Node.js使用しても同様のことが可能です。