Howto

Armadillo-X1, Armadillo-IoT G3/G3LにAWS Greengrass Coreをインストールする

Armadillo-X1, Armadillo-IoT G3/G3LにAWS IoT Greengrass Core (v2) をインストールする手順を説明します。

AWS Greengrass とは

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

AWS IoT Greengrass

AWS IoT Greengrass よくある質問

AWS IoT Greengrass の IoT エッジランタイムである Greengrass Core を、Armadillo にインストールすることで、Armadillo 上で AWS Lambda 関数を実行したり、AWS Lambda 関数をはじめ、ソフトウェア実装された機能やコンポーネントを追加または削除したり、IoT デバイスアプリケーションを管理したりすることができます。 この Howto では、Armadillo-X1, Armadillo-IoT G3/G3L に AWS IoT Greengrass Core v2 をインストールして、Armadillo のユーザー LED を点滅させるカスタムコンポーネントを AWS からデプロイして実行するまでの手順を説明します。 AWS IoT Greengrass Core の最新版は、2021年5月時点で v2 ですので、v2 を対象にしています。

なお、以下で述べる AWS IoT Greengrass Core v2 のセットアップ手順は、AWS のドキュメントサイトにある説明に基づいています。そちらの説明もご覧になってみて下さい。

Getting started with AWS IoT Greengrass V2

Armadillo 本体の設定

AWS IoT Greengrass Core v2 の動作要件は、こちらで説明されています:

Setting up AWS IoT Greengrass core devices / Requirements

この要件を満たす Armadillo の標準ソフトウェア(Linux ディストリビューション)は、Debian GNU/Linux 10 (buster) です。 Debian GNU/Linux 9 (stretch) の場合、glibc のバージョンが 2.24 であるため、Greengrass Core v2 の動作要件である「glibc のバージョンが 2.25 以上」を満たしません。 AWS IoT Greengrass Core v2 を動かすには、この他に、バージョン 8 以上の、Java ランタイムが必要です(Armadillo の場合、ARM32 用の Java ランタイムが必要です)。 Java ランタイム(JRE; Java Runtime Environment)の利用条件を考えると、OpenJDK の JRE を利用するのが簡単でしょう。 OpenJDK の ARM32 用 JRE をインストールする手順は、OpenJDK JRE のインストールで述べます。

まとめると、ArmadilloでAWS IoT Greengrass Core v2 を動かすために必要な標準ソフトウェアと、インストールが必要なソフトウェアは、次の通りです:

標準ソフトウェア

  • Linux カーネル: Linux 4.9
  • ディストリビューション: Debian GNU/Linux 10 (buster)

インストールが必要なソフトウェア

  • バージョン 8 以上の Java ランタイム(JRE)
  • AWS IoT Greengrass Core v2

この他に、AWS アカウントと、管理者グループに所属する IAM ユーザーが必要です。 AWS アカウントのセットアップについては、AWS IoT Greengrass の "Developer Guide, Version2" にある、次の説明をご覧ください:

Set up an AWS account

注意: これ以後の説明では、Armadillo での操作を、root ユーザーではなく、sudo を許可した一般ユーザーで行うものと前提しています。 出荷直後や、インストールイメージをインストールした直後の状態の Armadillo には root ユーザーしか登録されていませんが、製品マニュアルに記載の手順でユーザーを作成できます。

さて、お使いの Armadillo の Linux ディストリビューションが Debian GNU/Linux 10 (buster) かどうか分からない場合は、次のコマンドで確認できます:

$ cat /etc/os-release | grep PRETTY_NAME
PRETTY_NAME="<ディストリビューション名>"

"<ディストリビューション名> "の部分が "Debian GNU/Linux 9 (strech)" など、Debian GNU/Linux 10 (buster) ではない場合、標準ソフトウェアを更新する必要があります。 お使いの Armadillo が購入直後のものであれば、インストールディスクイメージを使って内蔵ストレージを書き換えるのが簡単です。 内蔵ストレージの内容を書き換えずに、とりあえず試してみたい、という場合には、Debian GNU/Linux 10 (buster) のブート SD カードを作って動かして頂くのがよいでしょう。

お使いの Armadillo のLinux ディストリビューションが Debian GNU/Linux 10 (buster) であれば、次の手順をスキップして、「OpenJDK JRE のインストール」に進んで下さい。

標準ソフトウェアの更新

標準ソフトウェアを更新するには、SD カードまたは microSD カードが必要です。Armadillo-X1 と Armadillo-IoT G3 は SD カード、Armadillo-IoT G3L は microSD カードを使用して更新します。 内蔵ストレージを書き換えても問題ない場合(購入直後の Armadillo をお使いになる場合など)は、インストールディスクを作って内蔵ストレージを書き換えて下さい。内蔵ストレージを書き換えたくない場合は、SD ブートをご利用下さい。

インストールディスクの作成と内蔵ストレージの書き換え

SD カードまたは microSD カードにインストールディスクイメージを書き込んでインストールディスクを作り、内蔵ストレージを書き換える手順は、それぞれの製品の製品マニュアルの、「イメージファイルの書き換え方法」または「ソフトウェアの更新と初期化」の章に記載しています。 次のページをご覧ください:

ブート SD カードの作成と SD ブート

SD カードまたは microSD カードにイメージを書き込んでブートディスクを作り、内蔵ストレージの代わりに SD カードまたは microSD カードから Linux を起動して動かす手順は、それぞれの製品マニュアルの「SDブートの活用」の章に記載しています。 次のページをご覧ください:

OpenJDK JRE のインストール

OpenJDK JREをArmadillo にインストールするには、ARM32 用 JRE のビルド済みバイナリが必要です。Debian 公式から OpenJDK 11 JRE のパッケージが提供されていますので、以下のコマンドでインストールして下さい。

$ sudo apt-get install openjdk-11-jre

Greengrass Core のインストール

必要なものが揃ったら、次は、AWS IoT Greengrass Core v2 のインストールです(以下、"AWS IoT" を省略して "Greengrass Core v2" と記します)。 Greengrass Core v2 のインストール手順には、デバイス(ここでは Armadillo)に紐づける、AWS IoT の "Thing" や "Thing Group"、およびデバイス認証用の証明書などのリソースを手作業でプロビジョニングするやり方と、Greengrass Core v2 のインストーラを使って自動プロビジョニングするやり方があります。 ここでは、後者(自動プロビジョニング)の手順を説明します。詳細は、こちらをご覧ください。

Install AWS IoT Greengrass Core software with automatic resource provisioning

大まかな手順は、次の通りです:

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

AWS IoT Greengrass の "Devveloper Guide, Version2" にある Set up an AWS account の説明に従って作った IAM ユーザーに対し、アクセスキーを新規発行して下さい。 発行したら、アクセスキー ID とシークレットキーを記録して下さい。 このアクセスキーは、Greenngrass Core v2 のインストールが済んだら削除して構いません。

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

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

$ export AWS_ACCESS_KEY_ID=<アクセスキー ID>
$ export AWS_SECRET_ACCESS_KEY=<シークレットキー>

これらの環境変数設定は、Grenngrass Core v2 のインストール時にのみ必要なものですから、.bashrc に記述する必要は、ありません。

3. Greengrass Core v2 をダウンロードする

Armadillo で次のコマンドを実行し、Greengrass Core v2 のインストーラが入ったアーカイブ(.zipファイル)をダウンロードして、展開して下さい。 ダウンロードする際、curl に -k を指定するのを忘れないようにして下さい。 -k を付けないと、ダウンロードサーバが自己証明書を使用しているためにエラーとなり、正しくダウンロードできません。

$ curl -k -s https://d2s8p88vqu9w66.cloudfront.net/releases/greengrass-nucleus-latest.zip > greengrass-nucleus-latest.zip
$ unzip greengrass-nucleus-latest.zip -d GreengrassCore && rm greengrass-nucleus-latest.zip

これで、カレントワーキングディレクトリに GreengrassCore というディレクトリが出来て、その中に Greengrass Core v2 のインストーラが展開されます。 インストーラの実体は、次で見るように、.jar ファイルです。

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

Armadillo で次のようなコマンドを実行すると、Greengrass Core v2 が Armadillo にインストールされると共に、必要なリソースが自動的にプロビジョニングされます。 Armadillo に紐づける、AWS IoT の "Thing" の作成、および、Thing を所属させる Thing Group の作成(既に存在する場合は作成されません)や、IAM ロールの登録、デバイス認証用の証明書の配置なども、インストール時に自動的に行われます。 どのようなリソースがプロビジョニングされるのか興味のある方は、手作業でプロビジョニングするやり方をご覧になってみて下さい。

$ sudo -E java -Droot="/greengrass/v2" -Dlog.store=FILE \
  -jar ./GreengrassCore/lib/Greengrass.jar \
  --aws-region ap-northeast-1 \
  --thing-name MyGreengrassCore \
  --thing-group-name MyGreengrassCoreGroup \
  --tes-role-name MyGreengrassV2TokenExchangeRole \
  --tes-role-alias-name MyGreengrassCoreTokenExchangeRoleAlias \
  --component-default-user ggc_user:ggc_group \
  --provision true \
  --setup-system-service true \
  --deploy-dev-tools true

上のコマンドにより、MyGreengrassCore という名前の "Thing" と、MyGreengrassCoreGroup という名前の "Thing Group" が作られます。 二台以上の Armadillo に Greengrass Core v2 をインストールして動かしたい場合、上のコマンドの '--thing-name MyGreengrassCore' の部分を変えて、インストーラのオプション引数 --thing-name に渡す "Thing" の名前だけを変えれば、同じ "Thing Group" に所属する "Thing" をそれぞれの Armadillo に紐づけて、Greengrass Core v2 のインストールとリソースプロビジョニングを行うことができます。 この後で述べる、カスタムコンポーネントのデプロイは、Thing Group の単位で行えますので、Armadillo に紐づける Thing を同じ ThingGroup に所属させておけば、複数台の Armadillo にコンポーネントを一括配信することが出来るというわけです。

上のコマンドでは、インストーラにオプション引数 '--setup-system-service true' を指定していますので、Greengrass Core v2 がシステムサービスとしてsysmtedに登録され、自動起動します。 インストールに成功した時点で、Greengrass Core v2 がシステムサービスとして起動しており、Armadillo を再起動しても自動起動されるのです。 Greengrass Core v2 を停止する場合や、無効化したい場合は、systemctl コマンドをお使い下さい。

Greengrass Core v2 のサービス名は、greengrass.service です。たとえば、次のコマンドを実行すると、Greengrass Core v2 の現在状態が表示されるはずです:

$ systemctl status greengrass.service

Greengrass Core v2 をアンインストールする手順は、こちらをご覧ください:

Uninstall the AWS IoT Greengrass Core software

カスタムコンポーネントを作成してデプロイする

AWS IoT Greengrass を使用すると、Greengrass Core をインストールしたデバイスに対し、デバイスに紐づけた AWS IoT の Thing および、Thing が所属する Thing Group を対象として、デバイスで動作するソフトウェアコンポーネントを AWS からデプロイすることができます。 ソフトウェアコンポーネントは、たとえば Python スクリプトや、シェルスクリプトでもよいですし、C言語で実装したアプリケーションをデプロイすることも可能です。 デプロイしたソフトウェアコンポーネントを実行する際に、管理者権限で実行するように設定することもできます。 デプロイにあたっては、デバイスと AWS との間での認証が行われ、セキュアな通信によるコンポーネントの転送が行われますので、必要最小限のセキュリティが確保されます。

より安全性を高めるための仕組みとして、Greengrass Core を Dockerコンテナで実行することも可能であり、AWS ラムダ関数は、デフォルトでは専用のコンテナで実行される仕組みになっているようです。 AWS IoT Greengrass におけるセキュリティの詳細については、AWS IoT Greengrass のドキュメントをご覧ください。

ここでは、Armadillo のユーザー LED を点滅させるカスタムコンポーネントを Python で実装して Amazon S3 に置き、AWS からデプロイして実行するまでの手順の流れを、簡単に述べます。

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

まず、Greengrass Core v2 をインストールした Armadillo 上でカスタムコンポーネントを作って動作確認するまでの手順は、AWS IoT Greengrass の "Developer Guide, Version2" にあるチュートリアル(Getting started tutorial)のページにある "Create your first component" や、"Create custom AWS IoT Greengrass components" のページをご覧ください。

Create your first component

Create custom AWS IoT Greengrass components

注意: 上のチュートリアルでは、recipe ファイルの "Manifests" / "Lifecycle" / "Run" で、コンポーネント実体である Python スクリプト(hello_world.py)を python3 で実行するように設定されています。Armadillo に python3 がインストールされていない場合は、そのままではエラーしてしまいますので、コンポーネントの動作確認を行う前に、apt でインストールして下さい:

$ sudo apt install python3

2. カスタムコンポーネントを Amazon S3 にアップロード(デプロイ用)

次に、カスタムコンポーネントを Amazon S3 にアップロードする手順、および、Greengrass Core v2 デバイスに S3 へのアクセスを許可する手順は、以下のページをご覧ください:

Upload your component

Upload components to deploy to your core devices

Allow access to S3 buckets for component artifacts

上のページの説明では、S3 にカスタムコンポーネントの実体(この例では Python スクリプト)をアップロードする際、AWS CLI を使用しています。 Armadillo に AWS CLI をインストールすることも可能だと思いますが、開発 PC に AWS CLI をインストールして、開発 PC からアップロードする方が、セキュリティの観点からも良いでしょう。 その場合、Armadillo で作ったコンポーネントを開発 PC にコピーして、開発 PC からアップロードする、という手順になります。 カスタムコンポーネントを作る作業は、最初から開発 PC で行うのが、より一般的な手順でしょう。 AWS CLI のインストール手順は、こちらをご覧ください:

Installing, updating, and uninstalling the AWS CLI version 2

3. デプロイの実行

カスタムコンポーネントをアップロードしたら、AWS からのデプロイを設定すれば完了です。 デプロイの手順は、以下のページをご覧ください:

Deploy your component

Deploy AWS IoT Greengrass components to devices

4. 追加情報

各デバイスに対するデプロイの進行状況や、各デバイスの動作状態は、AWS マネジメントコンソールで閲覧することもできますし、デプロイの作成や設定変更も、AWS マネジメントコンソールで行うことができます。 AWS にサインインして、ブラウザ画面の左上隅にある「サービス」をクリックして表示されるメニュー画面から IoT > IoT Greengrass を選択すると、"AWS IoT Grenngrass" の管理画面が表示されます。

AWS マネジメントコンソールでの GUI 操作、および、その前に述べた、AWS CLI を使用する方法に加えて、Web API(REST API)を使った操作も可能です。 AWS IoT Greengrass v2 の Web API のリファレンスは、こちらです:

https://docs.aws.amazon.com/greengrass/v2/APIReference/Welcome.html

各種プログラミング言語用の AWS SDK を使用して、これらの Web API を呼び出すアプリケーションを作成することができます。 たとえば、デプロイをキャンセルする Web API である CancelDeployment について、Python や Java や C++、さらに C# 用の SDK を利用できます。 その他に、どんなプログラミング言語を使用できるかは、リファレンスのページをご覧になってみて下さい。

カスタムコンポーネントで LED 点滅

最後に、Greengrass Core v2 のカスタムコンポーネントで LED 点滅(L チカ)してみましょう。 Armadillo のユーザー LED は、sysfs を使って点灯制御できます。 たとえば、ユーザー LED1であれば、/sys/class/leds/led1/brightnessに対して 1 または 0 を書き込むことで、点灯または消灯できます。 つまり、

$ sudo sh -c "echo 1 >/sys/class/leds/led1/brightness"

で点灯できます。(※Armadillo-G3 や Armadillo-G3L にはユーザー LED が複数ありますが、Armadillo-X1 には LED1 しかありませんので、ここでは、LED1 を使用します。) これを利用すれば、LED 点滅動作を行うカスタムコンポーネントを簡単に作れます。 チュートリアルのカスタムコンポーネントに LED 点滅動作を追加した例を、以下に示します。 以下では、カスタムコンポーネントのバージョンを 1.0.1 に変更していますので、この例を使って試す際には、1.0.1 のバージョンを新たに作ることを忘れないようにして下さい。

まず、LED 点滅用の recipe ファイルです:

{
  "RecipeFormatVersion": "2020-01-25",
  "ComponentName": "com.example.HelloWorld",
  "ComponentVersion": "1.0.1",
  "ComponentDescription": "My first AWS IoT Greengrass component.",
  "ComponentPublisher": "Amazon",
  "ComponentConfiguration": {
    "DefaultConfiguration": {
      "Message": "world"
    }
  },
  "Manifests": [
    {
      "Platform": {
        "os": "linux"
      },
      "Lifecycle": {
        "Run": {
          "Script": "python3 -u {artifacts:path}/hello_world.py '{configuration:/Message}'",
          "RequiresPrivilege": true
        }
      },
      "Artifacts": [
	{
	  "URI": "s3://getting-started/artifacts/com.example.HelloWorld/1.0.1/hello_world.py"
	}
      ]
    }
  ]
}

"Manifests" の "Lifecycle"に、"RequiresPrivilege": true を追加していることに注意して下さい。 Greengrass Core のコンポーネントは、ユーザー ggc によって実行されますが、LED 点灯制御用の sysfs ファイル(brightness)への書き込みには root 権限が必要なため、"RequiresPrivilege": true の設定がないと、コンポーネントの実行時にエラーします。

次に、LED 点滅用のコンポーネント実体である、Python スクリプトです。 上の recipe ファイルから参照している、バージョン 1.0.1 の hello_world.py の内容を以下に示します。 この Python スクリプトを S3 にアップロードすることも、自分で試す際に忘れないようにして下さい。

import sys
import datetime
import time
from subprocess import STDOUT, check_output

message = f"Hello, {sys.argv[1]}! Current time: {str(datetime.datetime.now())}."

# Print the message to stdout.
print(message)

# Append the message to the log file.
with open('/tmp/Greengrass_HelloWorld.log', 'a') as f:
    print(message, file=f)

# blink the LED1
while True:
    output = check_output("echo 1 >/sys/class/leds/led1/brightness", stderr=STDOUT, shell=True, executable='/bin/bash')
    time.sleep(1)
    output = check_output("echo 0 >/sys/class/leds/led1/brightness", stderr=STDOUT, shell=True, executable='/bin/bash')
    time.sleep(1)

'# blink the LED1' から後の行が、チュートリアルのサンプルに追加した行です。 単純に、1秒おきに点灯と消灯を繰り返すだけの動作です。 このカスタムスクリプトを、ThingGroup へのデプロイ対象に設定しておけば、その ThingGroup に所属する Thing を紐づけて Armadillo に Grenngrass Core v2 をインストールすると、Greenngrass Core2 のインストールとリソースのプロビジョニングが完了し、自動的に開始したデプロイ動作が完了した時点で、Armadillo のユーザー LED1 が点滅を始めるはずです。

さて、systemclt コマンドを使って Greengrass Core の動作を停止すれば、このカスタムコンポーネントも動作停止しますが、上の Python スクリプトだと、停止のタイミングによっては、ユーザー LED1 が点灯したままになってしまうでしょう。 カスタムコンポーネントが終了する時に、ユーザー LED1 を消灯させるにはどうすればよいのかは、recipe ファイルのフォーマットのリファレンスをご覧になって、考えてみて下さい。 "Lifecycle" での設定が役立つはずです。

AWS IoT Greengrass component recipe reference