AWS Greengrass では Greengrass Core 上で動くローカル Lambda のライフサイクルが選べるようになりました
それぞれの最小コードを紹介します
ローカル Lambda のライフサイクル
-
オンデマンド Lambda 関数
- Publishメッセージをトリガーに実行されるタイプ
- 存続期間が長く無制限に稼働する関数
- Arduino の
loop()
のような永続的に実行されるタイプ
- Arduino の
オンデマンド関数
Publishメッセージをトリガーに実行されるタイプです。一般的であり、また AWS Lambda っぽいコードでもあります
このサンプルコードは受け取ったオブジェクトを DEBUG:root:Receive message: ...
とログに出力します
import logging
def lambda_handler(event, context):
logging.debug('Receive message: {}'.format(event))
return
コーディングのポイント;
- ローカルのログに出力するだけなら
import greengrasssdk
は不要なんです- MQTT Publish がやりたくなったら
import greengrasssdk
が必要となります
- MQTT Publish がやりたくなったら
※「ユーザの Lambda ログ」 でレベルを デバッグ にしておいてください
※ログレベルの変更やログの場所は AWS Greengrass (1.3.0) を Ubuntu server (16.04 x86_64) で動かし、とりま開発する環境まで考える で解説しています
存続期間が長く無制限に稼働する関数
Arduino の loop()
のような永続的に実行されるタイプで、存続期間の長い Lambda 関数と呼ばます
Greengrass Core 起動時に一緒に実行されて、永続的に動き続けます
このサンプルコードは5秒毎に DEBUG:root:Hello world! loop counter is x
という文字列をログに出力し続けます
import logging
from threading import Timer
loop_counter = None
def setup():
global loop_counter
loop_counter = 1
def loop():
global loop_counter
logging.debug('Hello world! loop counter is {}'.format(loop_counter))
loop_counter += 1
Timer(5, loop).start()
setup()
loop()
def lambda_handler(event, context):
return
コーディングのポイント;
-
threading
のTimer
を利用すると簡単に実現できます- loop対象のpython関数内で
Timer(待機秒, 自身のpython関数名).start()
でループさせられます - AWS Greengrass Core 起動時に一緒に起動される永続的なコンテナで動くため、グローバル変数である
loop_counter
の中身は保持され続けることが確認できます
- loop対象のpython関数内で
-
lambda_handler()
の実装は空(= return を返すだけ)で構いません- もちろん中身を実装してオンデマンドLambda関数として実装することも可能ですが、オンデマンドLambda関数は都度コンテナが起動するため、変数の共有などできません
-
setup()
は Arduino のコードに似せるために作っただけですので、とくにこのような実装である必要はありません
※「ユーザの Lambda ログ」 でレベルを デバッグ にしておいてください
※ログレベルの変更やログの場所は AWS Greengrass (1.3.0) を Ubuntu server (16.04 x86_64) で動かし、とりま開発する環境まで考える で解説しています
AWS IoT Core への Publish
AWS IoT Core への Publish は greengrasssdk.client
を使います
import greengrasssdk
client = greengrasssdk.client('iot-data')
def any_func():
client.publish(topic='my_topic/foo/bar', payload='Hello world!')
となります
あとがき
こんな話を書いている場合じゃないのだが。進捗 0 バイト。
EoT