見出し画像

【Part3】Lambda関数を作り、エッジ用に設定する

AWSでエッジコンピューティング環境を作る Part3です。Greengrassの環境を構築できていない方はPart2からどうぞ

【Part2】AWSでエッジコンピューティング環境を作る(Greengrass編)

今回は、ラズパイにデプロイする関数をLambdaを用いて作ります。
デプロイ用に設定しなければいけないことが多少あるので注意してください。

Lambda関数の作成

まず、Lambda関数の作成をします。ラズパイではなく、自分のローカルのPCで作業を進めていきます。「Lambdaって何?!」という人は、下記記事を見ていただければと思います。要は、コンピューターリソースを意識せず、好きなタイミングで発動できる関数を使えるサービスFunction as a Service : FaaSと言います)です。AWSサービスのつなぎの役割を果たしていて、めちゃくちゃ便利です。

サーバーレスアーキテクチャの要「Lambda」とはなにか

さて、今回はLambdaで、greengrassのライブラリを同梱して取り扱うので、zip形式でまとめておいてアップロードをします。下記ページより、aws-greengrass-core-sdk-pythonをダウンロードします(zipでも、cloneでも良いです。)

ここの中の下記2つのフォルダ/ファイルを用います

☑ greengrasssdk (greengrassライブラリ)
example/HelloWorld/greengrassHelloWorld.py (HelloWorldできるexample)

greengrassHelloWorld.pyの中身を見てみましょう。MQTTと呼ばれる通信プロトコルを用いてAWSクラウドとラズパイ間でpublish/subscribe(送受信)を行います。わかりにくいところをコメントで補足してみました。

# -*- coding: utf-8 -*-
#
# Copyright 2010-2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
#

import greengrasssdk # greengrassライブラリ。lambdaに同梱する必要あり
import platform
from threading import Timer


# sdk clientを作成
client = greengrasssdk.client('iot-data')

# Greengrass Coreが入っているデバイスの情報を取得
my_platform = platform.platform()


# このLambda関数がデプロイされ、ラズパイが起動すると、5秒おきにずっと動き続ける。
# "hello/world"というtopicをAWS IoT上でサブスクライブすると、メッセージが返ってくる
def greengrass_hello_world_run():
   if not my_platform:
       client.publish(
           topic='hello/world',
           payload='Hello world! Sent from Greengrass Core.')
   else:
       # platformを認識できているのならば、platformとともにメッセージをpublishする
       client.publish(
           topic='hello/world',
           payload='Hello world! Sent from '
                   'Greengrass Core running on platform: {}'
                   .format(my_platform))

   # 5秒ごとに非同期にこの関数を実行する
   Timer(5, greengrass_hello_world_run).start()


# 上記の関数を実行する(ラズパイが起動している限り、実行される様になっている)
greengrass_hello_world_run()


def function_handler(event, context):
   # 何かしらのイベントによって発火させるのであれば、この中に実行される関数を書く。
   # 今回は無条件に関数を実行なので、外に書いてある。
   return

さて、この関数と、greengrasssdk2つをzipでまとめてlambda上にアップロードします。ハンドラやランタイムを間違えないようにしましょう。

画像1

※ちなみに、圧縮の仕方はちょっとだけ注意が必要です。Windowsの場合、フォルダに入れて圧縮ではなく、複数選択して直接zip(図)で固めてください。じゃないとハンドラがありませんというエラーが出ます。私はちょっとハマったので。。。笑

画像2

Lambdaのバージョニングとエイリアス

Lambda関数を無事アップロードできたら、次にバージョン登録を行います。Greengrassにデプロイするためには、この関数のバージョニングが必須なので、変更を反映させたいときは実行しておきましょう

画像3

次にエイリアスを登録します。greengrassのデプロイ時に、バージョン変更を反映しなければいけないのですが、エイリアスを作り、バージョンを紐付けておくと、Lambda上で変更の反映が完了するので楽です(下図)。

画像4

さっきのバージョンを発行の下に、エイリアスの作成とあるので、選択します。変更の場合は、アクションの左にある限定条件を押し、紐付けを変えたいエイリアスを選択すると設定できます。

画像5

作成時に、バージョンを指定します。変更のときは

画像6

まとめ

少し長くなったので、ここで区切ります。ここまでがLambda側の準備です。ラズパイで動く挙動を変更したいときは

1. Lambdaの中身を書き換える
2. バージョンを発行する
3. エイリアスに新しいバージョンを紐付ける
4. ラズパイへデプロイ

の流れを行うことで、簡単に反映させることができます。

さて、次回は上記の4にもある、ラズパイへのデプロイを実施します。ではでは。

前 : 【Part2】Greengrass環境構築編
後 : 【Part4】ラズパイへのデプロイ編

サポートいただけると励みになります! よろしくおねがいします!!