Howto

Armadillo-IoT G4 で AWS IoT Greengrass V2 を使用する方法

Armadillo-IoT G4 で AWS IoT Greengrass V2 を使用する方法について説明します。Armadillo-IoT G4 のコンテナセットアップ後の使い方についてはGetting started tutorialに沿ってカスタムコンポーネントのデプロイ方法と、AWS Lambda で作成する lambda 関数のデプロイ方法を説明します。Armadillo-X1, Armadillo-IoT G3/G3L での利用の場合はArmadillo-X1, Armadillo-IoT G3/G3LにAWS Greengrass Coreをインストールするをご確認ください。

本 Howto の構成は以下です。

システム構成

以下にシステム構成図を示します。

Armadillo-IoT G4 では Podman を使用して AWS IoT Greengrass Core をインストールするコンテナを作成します。作成したコンテナ上で AWS IoT Greengrass Core を動かします。AWS IoT Greengrass V2 は指定したコアデバイスに対してカスタムコンポーネントをデプロイします。また lambda 関数をデプロイして AWS IoT Core MQTT メッセージの Subscribe について紹介します。AWS IoT Core MQTT メッセージについての詳細と pub/sub の実装についてはこちらの Howtoで紹介します。

AWS IoT Greengrass とは

AWS IoT Greengrass は、Amazon Web Service が提供している、オープンソースの IoT エッジランタイムおよびクラウドサービスであり、デバイスソフトウェアの構築、デプロイ、および管理を支援するものです。 AWS IoT Greengrass をデバイスにインストールしておくことにより、ファームウェアを更新することなく、設置済みのデバイス上のソフトウェアを、リモートで管理および操作できます。詳細は、AWS IoT GreengrassAWS IoT Greengrass よくある質問をご覧ください。

Armadillo-IoT G4 のコンテナの準備

Armadillo-IoT G4 の起動や接続方法についてはマニュアルをご確認ください。

Armadillo-IoT G4 にログイン後は AWS IoT Greengrass Core をインストールするコンテナを用意します。今回はアットマークテクノが提供しているイメージを利用してコンテナを作成します。

イメージのダウンロード

初めにコンテナを保存するために下記コマンドを用いてコンテナストレージをデフォルトの tmpfs から eMMC に変更します。

[armadillo ~]# podman_switch_storage --disk

次にアットマークテクノが提供しているイメージをArmadillo-IoT ゲートウェイ G4 コンテナページからダウンロードして、コンテナストレージにイメージを読み込みます。バージョンは適宜最新のものをダウンロードしてください。2021/12/27 現在の最新版は v1.0.1 です。

[armadillo ~]# curl -O https://armadillo.atmark-techno.com/files/downloads/armadillo-iot-g4/container/at-debian-image-v1.0.1.tar
[armadillo ~]# podman load -i at-debian-image-v1.0.1.tar

イメージが読み込まれたか確認します。

[armadillo ~]# podman images
REPOSITORY                 TAG         IMAGE ID      CREATED      SIZE
localhost/at-debian-image  v1.0.1      93a4ec873ac5  10 days ago  233 MB
localhost/at-debian-image  latest      93a4ec873ac5  10 days ago  233 MB

コンテナ作成

Dockerfile を用いてダウンロードしたイメージをもとに、必要なソフトウェアをインストールします。インストールするソフトウェアは以下です。

  • sudo パッケージ
  • バージョン 8 以上の Java ランタイム(JRE)
  • python3.5 以降
  • AWS IoT Greengrass Core

最新版のパッケージをインストールしようとすると python3.9.x がインストールされますが、2021/12/27 現在 AWS IoT Greengrass V2 で使用できる lambda 関数が python3.9 に未対応のため、今回は python3.8.12 をソースからビルドしてインストールします。また、AWS IoT Greengrass Core のインストールについては後述し、ダウンロードのみ行います。

Dockerfile の用意

Dockerfile をカレントディレクトリに作成します。以下に示す内容を作成するか、以下コマンドを実行して Dockerfile をダウンロードしてください。

[armadillo ~]# curl -O https://download.atmark-techno.com/sample/armadillo_iot_g4-install-aws-greengrass-howto/Dockerfile

Dockerfile に記載する内容は以下です。FROM 行でベースとなるイメージを指定し、必要なパッケージをインストールしていきます。示すバージョンは、適宜ダウンロードしたバージョンに合わせてください。

# docker base image
FROM localhost/at-debian-image:v1.0.1 AS builder

# install build deps
RUN apt-get update && apt-get install -y \
        build-essential zlib1g-dev libncurses5-dev libgdbm-dev \
        libnss3-dev libssl-dev libreadline-dev libffi-dev curl

#install python3.8
RUN curl -O https://www.python.org/ftp/python/3.8.12/Python-3.8.12.tgz \
        && tar -xf Python-3.8.12.tgz \
        && cd Python-3.8.12 \
        && ./configure \
        && make \
        && make install \
        && cd ../ \
        && rm -r Python-3.8.12 Python-3.8.12.tgz 

FROM localhost/at-debian-image:v1.0.1

#install
RUN apt-get update \
        && apt-get install -y sudo openjdk-11-jdk curl unzip \
        && apt-get clean -y

COPY --from=builder /usr/local /usr/local

#download greengrass core
RUN curl -s -O https://d2s8p88vqu9w66.cloudfront.net/releases/greengrass-nucleus-latest.zip \
        && unzip greengrass-nucleus-latest.zip -d GreengrassCore && rm greengrass-nucleus-latest.zip 

Dockerfile がカレントディレクトリに存在するか確認します。

[armadillo ~]# ls Dockerfile
Dockerfile

Dockerfile の作成が確認出来たら、Dockerfile と同ディレクトリで以下のコマンドを実行してイメージを作成します。

[armadillo ~]# podman build -t greengrass:1.0 .

イメージが出来たか確認します。

[armadillo ~]# podman images
REPOSITORY                 TAG         IMAGE ID      CREATED        SIZE
localhost/greengrass       1.0         89a0c8b4032c  About a minute ago  1.1 GB
<none>                     <none>      0fa5934c8e59  About an hour ago  792 MB
localhost/at-debian-image  v1.0.1      93a4ec873ac5  10 days ago     233 MB
localhost/at-debian-image  latest      93a4ec873ac5  10 days ago     233 MB

ダウンロードしてきたイメージと、先ほど作成したイメージが確認できます。またマルチステージビルドを行っているため <none> と表示される中間イメージが存在します。 次に任意の名前のコンテナを作成します。以下はコンテナ名を "my_container" にする場合のコマンドです。

[armadillo ~]# podman run -it --name=my_container localhost/greengrass:1.0

成功した場合はコンテナの中に入っています。この場合は以下のコマンドでコンテナから抜けることができます。

[container ~]# exit

コンテナから抜けたところで、任意の名前のコンテナの作成に成功しているか確認します。

[armadillo ~]# podman ps -a
CONTAINER ID  IMAGE                             COMMAND     CREATED        STATUS                     PORTS       NAMES
317fd5610580  localhost/greengrass:1.0      bash        3 minutes ago  Exited (0) 11 seconds ago              my_container

"my_container" が作成されています。

AWS IoT Greengrass Core のインストール

再度コンテナに入り、コンテナに AWS IoT Greengrass Core をインストールするために必要な設定を行います。以下のコマンドでコンテナに入ります。

[armadillo ~]# podman start my_container
[armadillo ~]# podman attach my_container

AWS IoT Greengrass Core

AWS IoT Greengrass Core の利用には AWS アカウントと、管理者グループに所属する IAM ユーザーが必要です。 AWS アカウントのセットアップについては、Step 1: Set up an AWS accountをご覧ください。 AWS IoT Greengrass Core のインストール方法として、手作業でプロビジョニングする方法と、インストーラを使って自動プロビジョニングする方法があります。今回は自動プロビジョニングを用いてインストールします。

1. AWS マネジメントコンソールでアクセスキーの新規発行

Step 1: Set up an AWS accountの説明に従って作った IAM ユーザーに対し、アクセスキーを新規発行します。発行した <アクセスキー ID> と <シークレットキー> をメモしてください。

2. アクセスキー ID と シークレットキー の設定

AWS IoT Greengrass Core インストーラーが、アクセスキーを使用できるようにするため、コンテナ上で次のコマンドを実行し、環境変数にアクセスキー ID とシークレットキーを設定してください。 ここで、以下の<アクセスキー ID>と<シークレットキー>は、1でメモした内容に置き換えて実行します。

[container ~]# export AWS_ACCESS_KEY_ID=<アクセスキー ID>
[container ~]# export AWS_SECRET_ACCESS_KEY=<シークレットキー>

3. AWS IoT Greengrass Core ダウンロード

コンテナ作成時に AWS IoT Greengrass Core のダウンロードは完了しています。GreengrassCore というディレクトリの中に AWS IoT Greengrass Core インストーラーが展開されています。

4. インストーラを実行して自動プロビジョニングする

以下のコマンドを用いて自動プロビジョニングを行います。オプションについての詳細はStep 3: Install the AWS IoT Greengrass Core softwareをご確認ください。ここではいくつかのオプションについて説明します。

オプション 説明
--aws-region < AWS リージョン > AWS のリージョンを入力します。Amazon S3 と同じリージョンを指定してください。
--thing-name < コアデバイス名 > デバイスに対するコアデバイス名を設定します。すでに同じ名前のコアデバイスが登録されている場合、プロビジョニングは失敗します。
--thing-group-name < コアデバイスのグループ名 > コアデバイスが所属するグループ名を設定します。
--tes-role-name < IAM ロール名 > コアデバイスが一時的に取得できるようにする IAM ロールの名前を設定します。
--tes-role-alias-name < IAM ロールのエイリアス名 > コアデバイスが一時的な認証情報を後で取得できるようにする IAM ロールのエイリアスの名前を設定します。

適宜、動作環境に置き換えて実行します。カレントディレクトリに GreengrassCore ディレクトリがあることを確認します。

[container ~]# ls GreengrassCore
GreengrassCore

GreengrassCore と同ディレクトリで以下のコマンドを実行します。以下に実行コマンド例を示します。

[container ~]# sudo -E java -Droot="/greengrass/v2" -Dlog.store=FILE \
  -jar ./GreengrassCore/lib/Greengrass.jar \
  --aws-region ap-northeast-1 \
  --thing-name PodmanGreengrassCore \
  --thing-group-name PodmanGreengrassCoreGroup \
  --tes-role-name MyGreengrassV2TokenExchangeRoleByPodman \
  --tes-role-alias-name MyGreengrassCoreTokenExchangeRoleAliasByPodman \
  --component-default-user ggc_user:ggc_group \
  --provision true \
  --deploy-dev-tools true

5. AWS IoT Greengrass Core の起動

コンテナではサービスとして AWS IoT Greengrass Core を動かせないため、下記コマンドを用いて手動で起動します。

[container ~]# sudo /greengrass/v2/alts/current/distro/bin/loader

また、プロビジョニングに成功した場合は Greengrass CLI がデプロイされています。デプロイには数分かかります。

[container ~]# ls /greengrass/v2/bin/greengrass-cli
/greengrass/v2/bin/greengrass-cli

インストールが確認できれば成功です。 AWS IoT Greengrass Core をアンインストールする手順は、Uninstall the AWS IoT Greengrass Core softwareをご覧ください。

カスタムコンポーネントの作成とデプロイ

AWS IoT Greengrass Core をインストールしたデバイスに対して、デバイスに紐づけたコアデバイス名または、コアデバイスグループ名を対象として AWS IoT Greengrass V2 からコンポーネントをデプロイすることができます。デプロイにあたっては、デバイスと AWS との間での認証が行われ、セキュアな通信によるコンポーネントの転送が行われるため、必要最小限のセキュリティが確保されます。AWS IoT Greengrass におけるセキュリティの詳細についてはSecurity in AWS IoT Greengrassをご覧ください。 また、デプロイするカスタムコンポーネントについては Amazon S3 を利用する必要があります。

1. カスタムコンポーネントの作成とローカルでの動作確認

コンテナ上に以下のコンポーネントを作成します。

  • コンポーネント名: "com.example.HelloWorld"
  • バージョン: "1.0.0"

またこのコンポーネントはローカルで動作確認後にコンポーネントリストから削除します。 最初にコンポーネントの作成と動作確認についてはStep 4: Develop and test a component on your deviceを参照します。 ソフトウェアコンポーネントがデプロイされたかは下記コマンドで確認します。

[container ~]# sudo /greengrass/v2/bin/greengrass-cli component list

一覧の中にコンポーネント名 "com.example.HelloWorld" が見つかればデプロイに成功しています。 動作確認のためにログファイルの内容を確認します。

[container ~]# cat /tmp/Greengrass_HelloWorld.log
Hello, world!

動作確認ができたので、コンポーネントをデプロイから削除します。

[container ~]# sudo /greengrass/v2/bin/greengrass-cli deployment create --remove="com.example.HelloWorld"

ログファイルも削除します。

[container ~]# rm /tmp/Greengrass_HelloWorld.log

2. Amazon S3 へのアーティファクトのアップロード

Amazon S3 の操作には AWS CLI を利用する方法と、Aamazon S3 console から操作する方法があります。AWS CLI を利用する場合はデバイスにインストールすることも可能ですが、開発 PC にインストールしてソフトウェアコンポーネントをアップロードする方法がセキュリティの観点からも推奨されます。Aamazon S3 へのアーティファクトのアップロードにはStep 5: Create your component in the AWS IoT Greengrass serviceを参照します。

また、コアデバイスが S3 バケットのコンポーネントアーティファクトを取得するにはコアデバイスのロールにポリシーを追加する必要があります。S3 バケットにアクセスするためのポリシーを追加し、コアデバイスのロールに追加してください。正しく設定できた場合コアデバイスのロールには以下の二つのポリシーがアタッチされています。

  • ロール: MyGreengrassV2TokenExchangeRoleByPodman (--tes-role-name で指定したロール名)

    • コアデバイスのポリシー:MyGreengrassV2TokenExchangeRoleByPodmanAccess (--tes-role-name で指定したロール名に対応するアクセスポリシー名)

    • S3 バケットアクセスポリシー:MyGreengrassV2ComponentArtifactPolicy (S3 バケットアクセスポリシーに設定したアクセスポリシー名)

3. AWS IoT Greengrass にコンポーネント作成

AWS IoT Greengrass にコンポーネントを作成するには AWS CLI を利用する方法と、AWS IoT Greengrass console から操作する方法があります。AWS IoT Greengrass へのコンポーネント作成にはStep 5: Create your component in the AWS IoT Greengrass serviceを参照します。コンポーネント作成に使用されるレシピについて、ローカルで動作確認した場合から変わっているので注意してください。

4. IoT AWS Greengrassからのコンポーネントのデプロイ

AWS IoT Greengrass からコンポーネントをデプロイするには AWS CLI を利用する方法と、AWS IoT Greengrass console から操作する方法があります。デプロイ方法はStep 5: Create your component in the AWS IoT Greengrass serviceを参照します。

5. デプロイの確認

コンポーネントがデプロイされたか確認します。

[container ~]# sudo /greengrass/v2/bin/greengrass-cli component list

一覧の中にコンポーネント名 "com.example.HelloWorld" が見つかればデプロイに成功しています。 コンポーネント名が見当たらない場合はログを確認してください。

[container ~]# sudo tail -f /greengrass/v2/logs/greengrass.log

もし、以下のようなログが見つかった場合はデプロイに失敗しているので、コアデバイスのロールのポリシーを再確認してください。

2021-12-08T06:41:29.587Z [ERROR] (pool-2-thread-23) com.aws.greengrass.deployment.DeploymentService: Error occurred while processing deployment. {deploymentId=1e46623d-96d1-4af5-af6f-522f023fc355, serviceName=DeploymentService, currentState=RUNNING}
java.util.concurrent.ExecutionException: com.aws.greengrass.componentmanager.exceptions.PackageDownloadException: Failed to download artifact name: 's3:///artifacts/com.example.HelloWorld/1.0.0/hello_world.py' for component com.example.HelloWorld-1.0.0, reason: Failed to head artifact object from S3

lambda 関数の作成とデプロイ

デバイスにはカスタムコンポーネントだけではなく、AWS Lambda で作成した lambda 関数をデプロイすることも可能です。AWS Lambda を用いての lambda 関数の作成とデプロイについて紹介します。

1. lambda 関数の作成

AWS Lambda を用いての lambda 関数の作成方法は「Hello, World!」をサーバーレスで実行するを参考にします。今回コンテナにインストールしたのは python3.8.12 のため、ランタイムは python3.8 を指定してください。またアーキテクチャは arm64 を指定してください。 作成した lambda 関数のテストが終了したら、"バージョン"タブから "新しいバージョンを発行"を選択します。このバージョンがデプロイされるバージョンになります。

2. AWS IoT Greengrass にコンポーネント作成

AWS IoT Greengrass console から lambda 関数のコンポーネントを作成します。作成時のポイントは以下です。

  • コンポーネントソースとして "Lambda 関数をインポートする" を選択
  • Lambda 関数は1で作成した "hello-world-python" を選択
  • トピック: topic/lambda を入力、タイプ: AWS IoT Core MQTT を選択
  • 分離モードとして "コンテナなし" を選択

3. IoT AWS Greengrass からのコンポーネントのデプロイ

2で作成したコンポーネントの上部にある"デプロイ"を選択します。既存のデプロイとして Greengrass CLI やカスタムコンポーネントのデプロイに使用したデプロイ名を選択します。"hello-world-python" がデプロイに含まれていることを確認して "デプロイ" を実行します。

4. デプロイの確認

コンポーネントがデプロイされたかコンテナで確認します。

[container ~]# sudo /greengrass/v2/bin/greengrass-cli component list

一覧の中にコンポーネント名 "hello-world-python" が見つかればデプロイに成功しています。

5. lambda 関数の動作確認

AWS IoT Core console を用いて動作確認を行います。AWS IoT Core console の "テスト" 内の "MQTT テストクライアント" を選択します。タブで "トピックに公開する" を選びます。以下のように内容を設定します。

  • トピック名: topic/lambda
  • メッセージペイロード
{
  "key1": "hello, world",
  "key2": "value2",
  "key3": "value3"
}

上記設定後 "発行" を選択します。lambda 関数が動作しているかログを確認します。

[container ~]# sudo tail -f /greengrass/v2/logs/hello-world-python.log

以下のようなログが確認できれば、動作確認は終了です。

2021-12-17T02:33:53.255Z [INFO] (pool-2-thread-32) hello-world-python: lambda_function.py:8,value1 = hello, world. {serviceInstance=0, serviceName=hello-world-python, currentState=RUNNING}
2021-12-17T02:33:53.257Z [INFO] (pool-2-thread-32) hello-world-python: lambda_function.py:9,value2 = value2. {serviceInstance=0, serviceName=hello-world-python, currentState=RUNNING}
2021-12-17T02:33:53.260Z [INFO] (pool-2-thread-32) hello-world-python: lambda_function.py:10,value3 = value3. {serviceInstance=0, serviceName=hello-world-python, currentState=RUNNING}

以上で、Armadillo-IoT G4 で AWS IoT Greengrass V2 を使用する方法について、Armadillo-IoT G4 のコンテナのセットアップから AWS IoT Greengrass V2 を使用したコンポーネントのデプロイの動作確認を終了します。