GreengrassのLambdaでもPython3.7が利用可能に!!Greengrass Core 1.9.0がリリースされました

AWS IoT Greengrass v1.9.0の新機能・修正点をご紹介します
2019.05.02

はじめに

サーバーレス開発部@大阪の岩田です。

GW真っ最中ですがGreengrass Core 1.9.0がリリースされたというニュースが飛び込んできました。 1.8.0がリリースされたのが3月上旬なので、約2ヶ月という短いスパンでのリリースとなります。

AWS IoT Greengrass Adds Support for Python 3.7, Node v8.10.0, and Expands Support for Elliptic-Curve Cryptography

個人的な目玉機能として、Greengrass Core1.9.0からLambdaのランタイムとしてPython3.7が利用可能になったという変更があります。現在関わっている案件でGreengrassを活用したシステムを構築しているのですが、バックエンドの管理用APIはPython3系で、バックエンドと連携させるためのデバイス(Greengrass)側のLambdaはPython2系で実装を進めており、ロジックの共通化やPython2系のユニットテストに課題を抱えていました。このリリースを機に全部Python3.7に移行してコードを整理できそうです!

早速Greengrass Core1.9.0を試していきたいと思います。

Greengrass core 1.9.0の新機能

v1.9.0の主な修正点です

LambdaのランタイムにPython 3.7とNode.js 8.10のサポートを追加

個人的に一番嬉しい追加拡張です。 これまでGreengrass Lambdaで利用できるPythonとNode.jsのバージョンはそれぞれ

  • Python 2.7
  • Node.js 6.10

と古めのバージョンしかサポートされていませんでした。 利用できるライブラリのバージョン等で制約を受けることも多かったのですが、これで開発に自由度が出そうです。 なお、これまで通りPython 2.7、Node.js 6.10を利用することも可能です。

MQTTのコネクションを最適化 GG Core <-> AWS IoT Core間で確立するコネクション数を削減

Greengrass Core1.8ではGG Core <-> AWS IoT Core間で以下のMQTT接続を確立していました。

オペレーション種別 クライアントID
デプロイメント core-thing-name
※コアデバイスのモノの名前
例)MyCoreThing
MQTTメッセージの交換 core-thing-name-spr
※コアデバイスのモノの名前 + -spr
例)MyCoreThing-spr
シャドウの同期 core-thing-name-snn
※コアデバイスのモノの名前+ -s + 連番
例)MyCoreThing-s01
デバイス証明書管理 core-thing-name-dcm
※コアデバイスのモノの名前 + -dcm
例)MyCoreThing-dcm

Greengrass Core1.9からは以下のように変更されます。

オペレーション種別 クライアントID
デプロイメント core-thing-name
※コアデバイスのモノの名前
例)MyCoreThing
MQTTメッセージの交換 core-thing-name-cnn
※コアデバイスのモノの名前+ -c + 連番
例)MyCoreThing-c01

この変更によりMQTTのコネクション数に基づく課金を低く抑えることが可能になります。

コアデバイス <-> IoTデバイス間の接続で楕円曲線暗号化をサポート

Greengrass CoreのローカルMQTTサーバー機能を利用すると、エッジ側のローカルネットワーク内でコアデバイス <-> IoTデバイス間でTLSの接続を確立し、MQTTのメッセージ交換が可能になります。

この通信用のTLS接続を確立する際に、デフォルトでは、Greengrassが自動的に生成したRSA秘密鍵が利用されますが、Greengrass Core 1.9からはconfig.jsonMQTTServerCertificateに秘密鍵のパスを指定することで楕円曲線暗号を使用した秘密鍵が利用可能になりました。秘密鍵のフォーマットには

  • SECG1
  • PKCS#8

がサポートされています。また、この変更に伴ってローカルネットワーク内の暗号化スイートに以下の2種が選択できるようになりました。

  • TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
  • TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384

やってみる

ここからは実際にGreengrass Core 1.9.0を使ってPython3.7のLambdaをデプロイしてみます。

Python3.7とGreengrass SDKの導入

まずコアデバイスにPython3.7をインストールします。詳細な手順は割愛させて頂きます。

次にGreengrass SDK For Pythonをインストールします。Greengrass Core 1.9.0のリリースに合わせてPython3.7に対応したVersion1.4.0が先日リリースされています。

$ pip3.7 install greengrasssdk
Collecting greengrasssdk
  Downloading https://files.pythonhosted.org/packages/58/7f/7c48616e8632bc5d44b58d04087ee85bad4ee8db3a2d2cca5ef26434b5e4/greengrasssdk-1.4.0-py2.py3-none-any.whl
Installing collected packages: greengrasssdk
Successfully installed greengrasssdk-1.4.0

Lambda関数の作成

次にGreengrassにデプロイするPython3.7のLambda関数を作成します。

今回は「設計図の使用」からGreengrass向けのサンプルを選択します

Lambda関数の作成1

関数名は「GGHelloPython37」としました。

Lambda関数の作成2

ランタイムにPython3.7を指定しつつ、最新版のGreengrass Greengrass SDKを利用するためにLambdaのパッケージに含まれるSDKを削除します。

Lambda関数の作成3

ここまでできたらLambda関数を保存してバージョンを発行しておきます。

デプロイ

Greengrass GroupにLambda関数を追加してデプロイしていきます。 Lambdaの追加画面にいくと、以前とは違いPython3.7で作成したLambdaが選択可能になっていることが分かります。

GG GroupにLambda関数を追加

Lambda関数を追加したらLong-Lived Lambdaとして設定して、MQTTのトピックhello/worldへのサブスクリプションを追加しておきます。

テスト

Greengrass Groupのデプロイを行った後、マネジメントコンソールからMQTTのトピックhello/worldをサブスクライブすると

マネジメントコンソールからサブスクライブのテスト

データが流れてきました!テスト成功です。

まとめ

Greengrass v1.9.0の新機能についてご紹介しました。 LambdaのPython 3.7対応により、Greengrassでより多くのユースケースが実現出来そうです。すでにGreengrassを利用されている方もこの機会にバージョンアップを検討してみてはいかがでしょうか?