🕶️

AWS IoT Greengrass 入門

2021/12/24に公開

1. 最初に


私は NABLAS 株式会社 (https://www.nablas.com/) で深層学習モデルを用いて外観検査の自動化・省人化に取り組んでいます。GPU サーバーで深層学習モデルを学習させた後に、工場内の Jetson へのデプロイを行っています。現在、そのデプロイは手作業となっており、効率化・ヒューマンエラーの最小化の観点から AWS IoT Greengrass の導入を検討しています。本記事は AWS IoT Greengrass を触ってみた備忘録として書きましたので、導入検討している方々の助けになれば幸いです。

 

2. 今回の構成


 

3-1. Jetson のセットアップ


Jetson の初期設定は NVIDIA SDK Manager を使いました。以下の記事が参考になるかと思います。
https://zenn.dev/taikiinoue45/articles/864aeceaeaf003

 

続いては、https://aws.amazon.com/iot/ のページから、AWS IoT -> Greengrass -> コアデバイス -> 1 つの Greengrass コアデバイスをセットアップする、の順に進むと以下の画面になるかと思います。これに従い Jetson のセットアップを行います。

 

Java のインストール

sudo apt-get update && sudo apt-get install java-common wget
wget https://corretto.aws/downloads/latest/amazon-corretto-11-aarch64-linux-jdk.deb
sudo dpkg --install amazon-corretto-11-aarch64-linux-jdk.deb 

Java のバージョンを確認

java -version
>> openjdk version "11.0.13" 2021-10-19 LTS
>> OpenJDK Runtime Environment Corretto-11.0.13.8.1 (build 11.0.13+8-LTS)
>> OpenJDK 64-Bit Server VM Corretto-11.0.13.8.1 (build 11.0.13+8-LTS, mixed mode)

AWS の認証情報を登録

export AWS_DEFAULT_REGION=ap-northeast-1
export AWS_ACCESS_KEY_ID=...
export AWS_SECRET_ACCESS_KEY=...

インストーラーを実行

sudo apt-get update && sudo apt-get install curl
curl -s https://d2s8p88vqu9w66.cloudfront.net/releases/greengrass-nucleus-latest.zip > greengrass-nucleus-latest.zip && unzip greengrass-nucleus-latest.zip -d GreengrassCore
sudo -E java -Droot="/greengrass/v2" -Dlog.store=FILE -jar ./GreengrassCore/lib/Greengrass.jar --aws-region ap-northeast-1 --thing-name GreengrassQuickStartCore-17c9cab9a2f --thing-group-name GreengrassQuickStartGroup --component-default-user ggc_user:ggc_group --provision true --setup-system-service true --deploy-dev-tools true

greengrass-cli のバージョンを確認

/greengrass/v2/bin/greengrass-cli -V
>> Greengrass CLI Version: 2.4.0

 

3-2. AWS のセットアップ


今回の構成では Jetson にデプロイするコンポーネントを S3 に保存しますので、S3 bucket を作成

aws s3 mb s3://aws-greengrass-tutorial-taikiinoue45-20211021

Greengrass が S3 からコンポーネントを取得できるように、IAM policy を作成・アタッチ

aws iam create-policy --policy-name MyGreengrassV2ComponentArtifactPolicy --policy-document file://components/policy.json
aws iam attach-role-policy --role-name GreengrassV2TokenExchangeRole --policy-arn arn:aws:iam::371416467874:policy/MyGreengrassV2ComponentArtifactPolicy

 

3-3. コンポーネントのアップロード


コンポーネントを S3 にアップロード。ダミーデータを生成する sensor.py と、IoT Core にデータを送信する publisher.py、この 2 つのコンポーネントをアップロードします。

aws s3 cp ./components/artifacts/ s3://aws-greengrass-tutorial-taikiinoue45-20211021/artifacts/com.example.IoTPublisher/1.0.0 --recursive
sensor.py
import numpy as np

class DummySensor(object):
    def __init__(self, mean=25, variance=1):
        self.mu = mean
        self.sigma = variance

    def read_value(self):
        return np.random.normal(self.mu, self.sigma, 1)[0]

if __name__ == '__main__':
    sensor = DummySensor()
    print(sensor.read_value())
publisher.py
import time
import datetime
import json
import awsiot.greengrasscoreipc
from awsiot.greengrasscoreipc.model import (
    QOS,
    PublishToIoTCoreRequest
)
from dummy_sensor import DummySensor

TIMEOUT = 10
publish_rate = 0.2
topic = "data/device0/sensor"
qos = QOS.AT_LEAST_ONCE

ipc_client = awsiot.greengrasscoreipc.connect()
sensor = DummySensor()


while True:
    message = {"timestamp": str(datetime.datetime.now()), "value":sensor.read_value()}
    message_json = json.dumps(message).encode('utf-8')

    request = PublishToIoTCoreRequest()
    request.topic_name = topic
    request.payload = message_json
    request.qos = qos
    operation = ipc_client.new_publish_to_iot_core()
    operation.activate(request)
    future = operation.get_response()
    future.result(TIMEOUT)

    print("publish")
    time.sleep(1/publish_rate)

 

3-4. コンポーネントのデプロイ


続いては、https://aws.amazon.com/iot/ のページから、AWS IoT -> Greengrass -> Components -> Create component、の順に進むと以下の画面になるかと思います。これに従いコンポーネントを実行するために必要な情報が記述された yaml ファイルをアップロードします。

recipe.yaml
---
RecipeFormatVersion: "2020-01-25"
ComponentName: "com.example.IoTPublisher"
ComponentVersion: "1.0.0"
ComponentType: "aws.greengrass.generic"
ComponentDescription: "A component that publishes messages."
ComponentPublisher: "Amazon"
ComponentConfiguration:
  DefaultConfiguration:
    accessControl:
      aws.greengrass.ipc.pubsub:
        com.example.IoTPublisher:subscribe:1:
          policyDescription: "Allows access to subscribe to all topics."
          operations:
          - "aws.greengrass#SubscribeToTopic"
          resources:
          - "*"
      aws.greengrass.ipc.mqttproxy:
        com.example.IoTPublisher:publish:1:
          policyDescription: "Allows access to publish IoT core to all topics."
          operations:
          - "aws.greengrass#PublishToIoTCore"
          resources:
          - "*"
Manifests:
- Name: Linux
  Platform:
    os: linux
  Lifecycle:
    Install:
        pip3 install awsiotsdk numpy
    Run: |-
        python3 {artifacts:path}/example_iotpublisher.py
  Artifacts:
  - Uri: "s3://aws-greengrass-tutorial-taikiinoue45-20211021/artifacts/com.example.IoTPublisher/1.0.0/example_iotpublisher.py"
  - Uri: "s3://aws-greengrass-tutorial-taikiinoue45-20211021/artifacts/com.example.IoTPublisher/1.0.0/dummy_sensor.py"

 

その後、既存のデプロイに追加 を選択すると先程セットアップしたデバイスにデプロイすることができます。

 

ここまでのセットアップを終えますと、Jetson にデプロイされた sensor コンポーネントからダミーデータが生成され、publisher コンポーネントから IoT Core にデータが送信されているはずです。https://aws.amazon.com/iot/ のページから、AWS IoT -> MQTT test clientの順に進むと以下の画面となり、送信されたデータが確認できます。

4. 最後に


今回は、AWS IoT Greengrass の初歩の部分を触ってみて、S3 に保存した py ファイルをコンポーネントとして Jetson にデプロイしました。これ以外にも AWS Lambda や docker container をコンポーネントとして扱えるみたいですので、今後はこちらも触ってみようと思います。また、AWS IoT Greengrass ML Inference (https://aws.amazon.com/greengrass/ml/) と呼ばれる機械学習のデプロイに特化したサービスもあるのでこちらも要検討です。

今後も外観検査に使う深層学習モデルのデプロイに関して ”簡単に”、”安全に” を目指して、調査・検証を続けていき、都度発信していこうと思います。

 

5. 参考文献


Discussion