AWS IoT Greengrass v1.8.0がリリースされました!!

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

はじめに

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

こちらでアナウンスされているように、先日3月7日にGreengrassのv1.8.0がリリースされました!! このブログではv1.8.0の新機能と修正点について簡単に紹介させて頂きます。

v1.8.0の新機能

v1.8.0では以下の3つの機能追加(修正)が行われています。

  1. Greengrassグループ内のLambda関数に対してデフォルトのUID/GIDが設定可能に
  2. MQTTSのトラフィックで443ポートを指定可能に
  3. MQTTのクライアントIDが推測可能な形式に

順番に詳細を見ていきましょう。

Greengrassグループ内のLambda関数に対してデフォルトのUID/GIDが設定可能に

これまでもLambda関数単位にUID/GIDを指定することはできましたが、Greengrassグループに対してLambda関数実行時のUID/GIDが指定できるようになりました。また、指定したデフォルトのUID/GIDは個々のLambda関数の設定からオーバーライドすることが可能です。こちらの機能追加に関してはマネジメントコンソールを見て頂ければ一目瞭然です。

試しにGreengrass1.7.1を稼働させているGreengrassグループに対してデフォルトのUID/GIDを指定してデプロイしてみると・・・

Greengrass Core Version '1.7.1' is below minimum required version: '[1.8.0]'というエラーが出てデプロイに失敗しました。

HTTPS通信に443ポートが指定可能に

デフォルトのポート8443以外に443ポートが指定できるようになりました。 443ポートを利用するにはGreengrassの設定ファイルで下記のようにiotHttpPortggHttpPortを指定します。

/greengrass/config/config.json

{
    "coreThing" : {
        "caPath" : "root.ca.pem",
        "certPath" : "12345abcde.cert.pem",
        "keyPath" : "12345abcde.private.key",
        "thingArn" : "arn:aws:iot:us-west-2:123456789012:thing/core-thing-name",
        "iotHost" : "abcd123456wxyz-ats.iot.us-west-2.amazonaws.com",
        "iotHttpPort" : 443,
        "ggHost" : "greengrass-ats.iot.us-west-2.amazonaws.com",
        "ggHttpPort" : 443,
        "keepAlive" : 600
    },
    ...
}

企業内ネットワークなど、アウトバウンドのポートが制限されているような環境で効果を発揮しそうです。

MQTTのクライアントIDが推測可能な形式に

これまでgreengrassdがAWS IoTに接続する際のクライアントIDはvRsYrmUBといったランダムなクライアントIDが利用されていましたが、v1.8.0からは下記の通りコアデバイスのモノの名前(thingName)をベースにしたクライアントIDが設定されるように変わりました。

|オペレーション種別|クライアント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|

この変更により、クライアント証明書にアタッチするポリシーの厳格化やライフサイクルイベントと連動した独自ロジックの作成が可能になります。

試しにフリートインデックスを利用してコアデバイスの接続状態を取得してみます。事前にAWS IoTの設定からフリートインデックスを有効化し、「モノのインデックスにモノの接続データを含めます。」をONにしておきます。

なお、AWS側でのコアデバイス切断検知にかかる時間はMQTTのKeep Alive Timerに依存します。デフォルトのKeep Alive Timerは1,200秒と結構な長さなのでGreengrassの設定でKeep Alive Timerを短めに設定しておきます。

/greengrass/config/config.json

{
  "coreThing" : {
    "caPath" : "root.ca.pem",
    "certPath" : "xxxxxx.cert.pem",
    "keyPath" : "xxxxxx.private.key",
    "thingArn" : "arn:aws:iot:ap-northeast-1:xxxxxxxxxxxx:thing/MyEC2GGGroup2_Core",
    "iotHost" : "xxxxxxxxxx-ats.iot.ap-northeast-1.amazonaws.com",
    "ggHost" : "greengrass-ats.iot.ap-northeast-1.amazonaws.com",
    "keepAlive" : 60
  },

この状態でコアデバイスを起動し、Pythonのインタラクティブシェルからクエリを投げてみます。

>>>import boto3
>>>iot = boto3.client('iot')
>>> iot.search_index(queryString='connectivity.connected:true')['things']
[{'thingName': 'MyEC2GGGroup2_Core', 'thingId': '0705bff5-07ed-4f27-93e4-cdf8d9e2ac9a', 'shadow': '{"reported":{"connected":"true"},"metadata":{"reported":{"connected":{"timestamp":1551068691}}},"version":3}', 'connectivity': {'connected': True, 'timestamp': 1552221497572}}]

起動したコアデバイスの情報が取得できました!今度はコアデバイスを停止し1分半ほど待機、再度クエリを投げます。

>>> iot.search_index(queryString='connectivity.connected:true')['things']
[]

今度はレスポンスが空のリストになりました!!

まとめ

Greengrass v1.8.0の新機能についてご紹介しました。 個人的にはMQTTのクライアントID周りの変更がかなり嬉しく、Greengrassデバイスを管理するアプリ開発において色々な活用方法が考えられそうです。 また、証明書にアタッチするポリシーを厳格化することもできるのでGreengrassのバージョンアップと共にポリシーの修正を検討してみるのも良さそうです。