[AWS IoT Greengrass V2] プロセス間通信 (IPC) でコンポーネントの設定値を使用してみました

2021.09.11

1 はじめに

IoT事業部の平内(SIN)です。

AWS IoT Greengrass V2では、コンポーネント毎に設定値を保持しており、プロセス間通信 (IPC) を使用してこれにアクセスすることができます。

設定値は、多数のデバイスに配布されたコンポーネントで共通の値となり、デフォルト値を設定する事も、後からクラウド側などから更新することも可能です。

この値に基づいて、コンポーネントの動作を実装しておけば、Lambdaの設定値を環境変数で保持するのと同じように、プログラムの変更なしで、振る舞いを変えることが可能になります。

今回は、この設定値をコンポーネントで使用してみました。

2 デフォルト値

下記は、今回作成したコンポーネントのレシピです。

ComponentConfiguration.DefaultConfigurationで、デフォルトの設定値を記述できます。

---
RecipeFormatVersion: 2020-01-25
ComponentName: com.example.ConfigSample
ComponentVersion: '1.0.0'
ComponentConfiguration:
  DefaultConfiguration:
    my_default_key: my_default_value
Manifests:
  - Platform:
      os: linux
    Lifecycle:
      Run: python3 -u {artifacts:path}/config_sample.py
    Artifacts:
    - Uri: s3://gg-artifacts-2021-08-11/artifacts/com.example.ConfigSample/1.0.0/config_sample.py

このコンポーネントをデプロイすると、デバイス側で下記のように一覧することができます。

$ sudo /greengrass/v2/bin/greengrass-cli component list
・・・略・・・
Component Name: com.example.ConfigSample
    Version: 1.0.0
    State: FINISHED
    Configuration: {"my_default_key":"my_default_value"}
・・・略・・・

また、コンポーネントを下記のように実装することで、この設定値を読み出せることが確認できます。

import awsiot.greengrasscoreipc
from awsiot.greengrasscoreipc.model import (
    GetConfigurationRequest
)

try:
    ipc_client = awsiot.greengrasscoreipc.connect()
    request = GetConfigurationRequest()
    operation = ipc_client.new_get_configuration()
    operation.activate(request).result(TIMEOUT)
    result = operation.get_response().result(TIMEOUT)
    print('😍 value:{} component_name: {} '.format(result.value, result.component_name))

except Exception as e:
    print('😭 Exception: {}'.format(e))

※ 確認しやすいように一部編集しています。

# tail /greengrass/v2/logs/com.example.ConfigSample.log
・・・略・・・

stdout. 😍 value:{'my_default_key': 'my_default_value'} component_name: com.example.ConfigSample. {scriptName=services.com.example.ConfigSample.lifecycle.Run, serviceName=com.example.ConfigSample, currentState=RUNNING}
Run script exited. {exitCode=0, serviceName=com.example.ConfigSample, currentState=RUNNING}
・・・略・・・

3 設定値の変更

デプロイ時に「コンポーネントの設定」で、値を編集することができます。

今回は、下記のキーを追加してみました。

デプロイが完了すると、一覧表示で設定値が反映されていることを確認できます。

$ sudo /greengrass/v2/bin/greengrass-cli component list
・・・略・・・
Component Name: com.example.ConfigSample
    Version: 1.0.0
    State: FINISHED
    Configuration: {"append_key":"append_value","my_default_key":"my_default_value"}
・・・略・・・

また、コンポーネントのログからも、変更後の設定値を読み出せていることが確認できます。

※ 確認しやすいように一部編集しています。

# tail /greengrass/v2/logs/com.example.ConfigSample.log
・・・略・・・

stdout. 😍 value:{'append_key': 'append_value', 'my_default_key': 'my_default_value'} component_name: com.example.ConfigSample. {scriptName=services.com.example.ConfigSample.lifecycle.Run, serviceName=com.example.ConfigSample, currentState=RUNNING}
Run script exited. {exitCode=0, serviceName=com.example.ConfigSample, currentState=RUNNING}

4 最後に

ここまで、コンポーネントの設定値を取得するGetConfigurationを使用してみましたが、この他にも、下記の操作が可能です。

  • GetConfiguration コンポーネントの設定値を取得する
  • UpdateConfiguration コンポーネントの設定値を更新する
  • SubscribeToConfigurationUpdate コンポーネントの設定が更新されたときに通知を受け取るようにサブスクライブする
  • SubscribeToValidateConfigurationUpdates サブスクライブして、このコンポーネントの設定が更新される前に通知を受信する
  • SendConfigurationValidityReport コンポーネントの設定更新が有効かどうかをnucleusに伝える(無効とした場合は、デプロイメントが失敗する)
    参考:https://docs.aws.amazon.com/ja_jp/greengrass/v2/developerguide/ipc-component-configuration.html

多数のデバイスに展開されたコンポーネントは、このような仕組みをうまく使いこなして制御を考えるといいのかもしれません。

5 参考リンク


[AWS IoT Greengrass V2] RaspberryPIにインストールしてみました
[AWS IoT Greengrass V2] RaspberryPIでコンポーネントを作成してみました
[AWS IoT Greengrass V2] クラウド側から複数のコアデバイスにコンポーネントをデプロイしてみました
[AWS IoT Greengrass V2] クラウド側からコンポーネントを削除してみました
[AWS IoT Greengrass V2] ローカルデバッグコンソール(aws.greengrass.LocalDebugConsole)を使用してみました
[AWS IoT Greengrass V2] Lambda関数(コンポーネント)をデプロイしてみました
[AWS IoT Greengrass V2] コンポーネントからIoT CoreのメッセージブローカーにPublish/Subscribeしてみました
[AWS IoT Greengrass V2] コンポーネントからシークレットマネージャにアクセスしてみました
[AWS IoT Greengrass V2] コンポーネントでコアデバイス間のPublish/Subscribeを試してみました
[AWS IoT Greengrass V2] ログマネージャでコンポーネントのログをCloudWatch Logsに送ってみました
[AWS IoT Greengrass V2] トークン交換サービスでコンポーネントからDynamoDBにアクセスしてみました
[AWS IoT Greengrass V2] ストリームマネージャーを使用してコンポーネントからKinesis Data Streamsへデータを送ってみました