[AWS IoT Greengrass V2] Lambda関数(コンポーネント)をデプロイしてみました

2021.08.13

1 はじめに

IoT事業部の平内(SIN)です。

AWS IT Greengrass V2(以下、Greengrass V2)では、Lambda関数もコンポーネントの1つとして利用可能です。
https://www.youtube.com/watch?v=pVYmcXatcT8

今回は、Lambda関数をデプロイしてみました。

2 Lambda

Lambdaは、「一から作成」で作成し、ランタイムは、Python3.8となっています。

プログラムは、ログ出力するだけの超簡単なものです。

def lambda_handler(event, context):
    print("😋 lambda started.  event:{}".format(event))

コンポーネントとして登録する際、バージョン指定が必要($LATESTは使用できない)なので、「新しいバージョンを発行」しました。

3 コンポーネント

「Lambda関数をインポートする」を選択して新規にコンポーネントを作成しました。 指定したLambda関数及び、バージョンは、上記で作成したものです。

Lambda関数のコンポーネントで「イベントソース」の設定があります。 こちらは、LambdaをInvokeするキッカケとなるイベントを設定するもので、トピックの発行元として、「AWS IoT Core」及び、「ローカル発行」の2種類から選択可能です。

今回は、AWS IoT Coreのメッセージブローカーを発行元とし、トピックとして、「topic/lambda」を定義しました。

その他の設定は、全てデフォルトのままでコンポーネント作成を進めています。

gg_sample_function バージョン 1.0.0として作成されている様子です。

4 デプロイ

デプロイも今回、コアデバイス(gg-device-002)だけをターゲットするものを新規に作成しました。

コンポーネントの選択では、Lambdaのコンポーネントと、動作確認用に、aws.greengrass.Cli及び、aws.greengrass.LocalDebugConsoleを追加しています。

デプロイが完了した時点で、デバイス側で、コンポーネントを一覧してみました。

デプロイでは指定していない下記の3つのコンポーネントが、依存関係として自動的にインストールされていることが確認できます。

  • aws.greengrass.LambdaManager
  • aws.greengrass.LambdaLauncher
  • aws.greengrass.LambdaRuntimes
$ sudo /greengrass/v2/bin/greengrass-cli component list

・・・略・・・

Component Name: aws.greengrass.LambdaManager
    Version: 2.1.3
    State: RUNNING
    Configuration: {"getResultTimeoutInSecond":"60"}
Component Name: aws.greengrass.LambdaLauncher
    Version: 2.0.8
    State: FINISHED
    Configuration: {}
Component Name: aws.greengrass.LambdaRuntimes
    Version: 2.0.7
    State: FINISHED
    Configuration: {}

・・・略・・・

Component Name: gg_sample_function
    Version: 1.0.0
    State: RUNNING
    Configuration: {"containerMode":"NoContainer","containerParams":{"devices":{},"memorySize":16000.0,"mountROSysfs":false,"volumes":{}},"inputPayloadEncodingType":"json","lambdaExecutionParameters":{"EnvironmentVariables":{}},"maxIdleTimeInSeconds":60.0,"maxInstancesCount":100.0,"maxQueueSize":1000.0,"pinned":true,"pubsubTopics":{"0":{"topic":"topic/lambda","type":"IOT_CORE"}},"statusTimeoutInSeconds":60.0,"timeoutInSeconds":3.0}

5 動作確認

イベントソースとして設定した、AWS IoT Coreのメッセージブローカーへ、topic/lambdapublishしてみました。

コンポーネントのログをtailで確認すると、トピックの到着と同時にLambdaが実行されている様子を確認できます。

※一部折り返して表示しています。

$ sudo tail -f /greengrass/v2/logs/gg_sample_function.log

・・・略・・・

2021-08-13T04:12:09.563Z [INFO] (pool-2-thread-75) 
  gg_sample_function: lambda_function.py:2,😋 lambda started.  
  event:{'message': 'AWS IoT コンソールからの挨拶'}. 
  {serviceInstance=0, serviceName=gg_sample_function, currentState=RUNNING}
2021-08-13T04:12:21.632Z [INFO] (pool-2-thread-75) 
  gg_sample_function: lambda_function.py:2,😋 lambda started. 
  event:{'message': 'AWS IoT コンソールからの挨拶'}. 
  {serviceInstance=0, serviceName=gg_sample_function, currentState=RUNNING}

6 最後に

今回は、Lambdaによるコンポーネントを試してみました。

Greengrass V2では、プログラムの実行が、Lambdaに依存していないため、今一つ、メリット感じづらいのですが・・・トピックで起動する仕組みが予め備わっているので、トリガーがこれで良ければ、その仕組みをわざわざ実装する必要がないので、便利かも知れません。

なお、デフォルトでは、Lambdaコンポーネントは、コンテナで分離実行するように定義されていますが、コンテナ外での実行も指定可能です。リソースの許可設定等の作業は必要なくなるので、より簡単に利用できそうです。

7 参考リンク


[AWS IoT Greengrass V2] RaspberryPIにインストールしてみました
[AWS IoT Greengrass V2] RaspberryPIでコンポーネントを作成してみました
[AWS IoT Greengrass V2] クラウド側から複数のコアデバイスにコンポーネントをデプロイしてみました
[AWS IoT Greengrass V2] クラウド側からコンポーネントを削除してみました
[AWS IoT Greengrass V2] ローカルデバッグコンソール(aws.greengrass.LocalDebugConsole)を使用してみました
[AWS IoT Greengrass V2] Lambda関数(コンポーネント)をデプロイしてみました
[AWS IoT Greengrass V2] コンポーネントからIoT CoreのメッセージブローカーにPublish/Subscribeしてみました
[AWS IoT Greengrass V2] コンポーネントからシークレットマネージャにアクセスしてみました