LoginSignup
8
5

More than 5 years have passed since last update.

AWS Greengrass のローカル Lambda ライフサイクル別の最小コード

Last updated at Posted at 2018-03-09

AWS Greengrass では Greengrass Core 上で動くローカル Lambda のライフサイクルが選べるようになりました

image.png

それぞれの最小コードを紹介します

ローカル Lambda のライフサイクル

  • オンデマンド Lambda 関数
    • Publishメッセージをトリガーに実行されるタイプ
  • 存続期間が長く無制限に稼働する関数
    • Arduino の loop() のような永続的に実行されるタイプ

オンデマンド関数

Publishメッセージをトリガーに実行されるタイプです。一般的であり、また AWS Lambda っぽいコードでもあります

このサンプルコードは受け取ったオブジェクトを DEBUG:root:Receive message: ... とログに出力します

lambda_function.py
import logging

def lambda_handler(event, context):
    logging.debug('Receive message: {}'.format(event))
    return

コーディングのポイント;

  • ローカルのログに出力するだけなら import greengrasssdk は不要なんです
    • MQTT Publish がやりたくなったら import greengrasssdk が必要となります

※「ユーザの 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 という文字列をログに出力し続けます

lambda_function.py
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

コーディングのポイント;

  • threadingTimer を利用すると簡単に実現できます
    • loop対象のpython関数内で Timer(待機秒, 自身のpython関数名).start() でループさせられます
    • AWS Greengrass Core 起動時に一緒に起動される永続的なコンテナで動くため、グローバル変数である loop_counter の中身は保持され続けることが確認できます
  • 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

8
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
5