【レポート】Greengrass Basicのワークショップに参加しました #reinvent #IOT204

2017.12.12

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

Classmethod CANADA 塩谷です。
re:Invent 2017のワークショップ「IOT204 - AWS Greengrass Basic Workshop」に参加しました。
そちらのレポートです。

セッション概要

In the AWS Greegrass Basic Workshop, learn the concepts of AWS Greengrass. You will install, run, and configure the software. Then we show you how to connect a device to AWS IoT and to AWS Greengrass. In your account, learn to provision AWS Greengrass and create various communication scenarios. Route messages to locally connected devices, and to and from the cloud. Also learn how to use logging to get insights about what's happening on the AWS Greengrass Core. For this workshop, you need to have an AWS account created, and you need to bring your laptop.

セッション資料

Greengrass Bootcamp - Basic

ワークショップ

このワークショップはGreengrassの基本を理解するためのものです。

0の画像

■以下を学習
・デバイスをAWS IoTとGreengrassに接続する
・Greengrassをインストールする
・Greengrass経由でデバイス通信を行う

使用するのはEC2インスタンスかラズベリーパイですが、今回はEC2を使用します。

前提条件

ワークショップに必要なもの
・AWSアカウント
・EC2インスタンスまたはラズベリーパイにSSH/SCPできる環境
・awscli ※用意されているCloudformationからEC2を起動する場合は不要
・VPC(パブリックサブネット)
・SSHキーペア ※EC2を使用する場合

リージョンの確認

次へ進む前に、Greengrassが利用できるリージョンで作業していることを確認します。
(AWSコンソールのGreengrassを選択して確認します。)

現在Greengrassが使用できるのは以下。
• 米国東部 (バージニア北部)
• 米国西部 (オレゴン)
• 欧州 (フランクフルト)
• アジアパシフィック (シドニー)
• アジアパシフィック (東京)

わたしはオレゴンが1番近いので、オレゴンを選択します。

要件

ミニマム構成:
CPU single 1GHz
128MB RAM
x86 and Arm
Linux (Ubuntu, Amazon, Raspbian)

EC2インスタンスを作成

EC2インスタンスを作成します。
ワークショップで用意されているCloudformationを使用します。

  1. テンプレートを選択する画面 ※テンプレートはすでに選択されているので何もしなくてOKです
  2. Next
  3. Parameters
    3.1. Select SSHKeyName
    3.2. Select a SubnetID
    3.3. Select a VpcId
  4. Next
  5. Options ※何もせず次へ
  6. Next
  7. Review -> ページ下部にある"I acknowledge that AWS CloudFormation might create IAM resources." にチェック
  8. Create
  9. ページをリフレッシュ
  10. 作成が完了するのを待ちます

1の画像

IoTのログを有効にする

IAMコンソールへ移動します。ロールを作成します。

  1. ロール
  2. ロールの作成 -> AWS サービス -> IoT -> 次のステップ: アクセス権限
  3. アタッチされたアクセス権限ポリシー: AWSIoTLogging, AWSIoTRuleActions
  4. 次のステップ: 確認 5. ロールの名前を設定
  5. ロールを作成

ロールを作成したら、IoTコンソールへ移動します。

  1. Get started (初めて設定を実施する場合のみ、はじめに。。みたいなページが表示されます)
  2. ページ右側の「設定」を選択
  3. ログが無効になっていると思うので、ログの箇所にて「編集」を選択
  4. 詳細レベル -> デバッグ(詳細レベルが最も高い) を選択
  5. ログの設定 -> 先ほど作成したロールを選択
  6. 更新

Logsの画像
こうなります。

IoTのログファイルはCloudWatchに送信されます。コンソールを使用して、ログを見ることができます。

Connect a thing to AWS IoT

デバイスをAWS IoTへ接続します。
・デバイスをAWS IoT、Greengrass Aware Device(GGAD)へ接続する
・X.509証明書と接続情報を使用して動作する

ここではキーと証明書を含むzipファイルと、必要なソフトウェアをインストールするための
スクリプトを用意します。

1.AWS IoTコンソールへ移動します。

GetStartedの画像

2.オンボードをクリック。
3.「デバイスの設定」-> 今すぐ始める
4.「AWS IoTにどの様に接続していますか?」プラットフォームとSDKを選択する
5.Linux/OSXとパイソンを選択する

howtoconnecttoIotの画像

6.モノの名前を登録する

howtoconnecttoIotの画像

7.conncection kitのダウンロード

connectionkitの画像

8.次のステップをクリック

configureの画像

Successfullyの画像

次に、EC2インスタンスにSSHログインします。

  1. "ggad-1"という名前のディレクトリを作成します。(Cloudformationを使用しているなら不要)
  2. "connect_device_package.zip"をディレクトリ "ggad-1"にコピー(scp)
  3. ファイル "connect_device_package.zip"を解凍します。
$ ls -la
total 28
drwxr-xr-x 2 ec2-user ec2-user  4096 Dec 10 01:15 .
drwx------ 6 ec2-user ec2-user  4096 Dec 10 00:49 ..
-rw-r--r-- 1 ec2-user ec2-user  3575 Dec 10 01:15 connect_device_package.zip
-rwxr-xr-x 1 ec2-user ec2-user 11591 Dec 10 00:49 GGBootcampPubSub.py
-rw-r--r-- 1 ec2-user ec2-user  2542 Dec 10 00:49 gg_discovery_api.py
$ unzip connect_device_package.zip
Archive:  connect_device_package.zip
  inflating: ggad-1.private.key
  inflating: ggad-1.public.key
  inflating: ggad-1.cert.pem
  inflating: start.sh
$ ls
connect_device_package.zip  ggad-1.private.key  start.sh
ggad-1.cert.pem             ggad-1.public.key

rootとしてstart.shを起動します。
※起動するのに権限が足りない場合があるので適宜変更します。

sudo ./start.sh

Send sensor data to AWS IoT

センサーデータをJSON形式でAWS IoTに送信して、MQTTクライアントで受信データを監視します。

センサーデータを送信するために必要なスクリプト:
・GGBootcampPubSub.py
・gg_discovery_api.py

Cloudformationを使用している場合には、すでにディレクトリ配下にあります。

start.shの中身を変更して、ggad-1ディレクトリ配下にあるGGBootcampPubSub.pyを呼び出す様にする必要があります。

変更前

python aws-iot-device-sdk-python/samples/basicPubSub/basicPubSub.py -e <YOUR_ENDPOINT>.<AWS_REGION>.amazonaws.com -r root-CA.crt -c ggad-1.cert.pem -k ggad-1.private.key

変更後

python GGBootcampPubSub.py -e <YOUR_ENDPOINT>.<AWS_REGION>.amazonaws.com -r root-CA.crt -c ggad-1.cert.pem -k ggad-1.private.key

送信するメッセージを表示するには、AWS IoTコンソールに組み込まれているMQTTクライアントを登録します。
・sdk/test/Python
・$aws/events/#

AWS IoTコンソールへ移動します。

  1. 「テスト」をクリック
  2. 「トピックへサブスクライブする」で"sdk/test/Python"を入力し、トピックへのサブスクライブを実行
  3. 同じ様に"$aws/events/#"を入力し、トピックへのサブスクライブを実行

センサーデータをAWS IoTに送信します。
SSHコンソールで、start.shを実行してからMQTTクライアントを確認してください。

ここまで、デバイスggad-1の設定を行いました。次は2つめのデバイスggad-2を設定します。
ggad-1と同じ様に設定するわけですが、MQTTクライアントはAWS IoTに接続するときに一意のClientIDを使用します。
そのため、ggad-1とggad-2として接続する様に設定します。

start.shの中身を変更します。

ggad-1

python GGBootcampPubSub.py -e <YOUR_ENDPOINT>.<AWS_REGION>.amazonaws.com -r root-CA.crt -c ggad-1.cert.pem -k ggad-1.private.key --clientId ggad-1

ggad-1

python GGBootcampPubSub.py -e <YOUR_ENDPOINT>.<AWS_REGION>.amazonaws.com -r root-CA.crt -c ggad-2.cert.pem -k ggad-2.private.key --clientId ggad-2

ClientID設定が動作するかどうかをテストするには、AWS IoTコンソールで以下を実行します。
$aws/events/#

Provision a Greengrass Group

Greengrassグループを作成して、AWS Greengrassソフトウェアをデバイスにインストールします。
デバイスはGreengrassコアに接続してデータをクラウドやローカルに送信し、クラウドからメッセージを受信します。

概念1の画像

概念2の画像

Greengrassグループを作成します。Greengrassコンソールへ行って、

1.Greengrassを選択

11画像

2.グループの定義
3.グループの作成
4.「簡単な作成の使用」をクリック

12画像

5.グループ名:myFirstGGG

13画像

6.次へ
7.コアの名前はそのままにする

14画像

8.次へ
9.グループとコアの作成

15画像

10.tar.gzのダウンロード実施
11.もし、CloudformationからEC2を作成していない場合はGreengrassソフトウェアもダウンロード
12.「完了」をクリック。※「完了」をクリックしないと作成されないので、忘れないようにしてください。

Greengrass Groupが作成されたことを確認します。
Greengrass -> Groupsで確認。

16画像

Install Greengrass on your device

Greencoreとして機能するデバイスで、Greengrassソフトウェアをインストールします。

Greengrassサービスロールを作成します。
※Greengrassでは、LambdaおよびAWS IoTデータへのアクセスが必要です。

IAMコンソールへ移動します。

  1. ロール
  2. ロールの作成
  3. AWS サービス
  4. Greengrass
  5. 次のステップ: アクセス権限
  6. 選択 -> AWSGreengrassResourceAccessRolePolicy
  7. 次のステップ: 確認
  8. ロール名: GreengrassRole
  9. ロールの作成

次に、Greengrassグループ作成中にダウンロードしたtar.gzファイルをEC2インスタンスの/tmpディレクトリにSCPします。
tar.gzファイルには、キー、証明書、設定ファイル(config.json)が含まれておりGreengrass Coreの設定に使用されます。

SCPしたtar.gzを/greengrassに展開します。

cd /greengrass
sudo tar zxvf /tmp/<unique-string>-setup.tar.gz

これでGreengrassコアを起動する準備ができました。

Greengrassデーモンを起動する前に、以下を実施します。
コアが正しく起動するとそのトピックに関するアクティビティを確認できます。

AWS IoTコンソールのMQTTクライアントにて以下をサブスクライブします。

① $aws/events/#
② $aws/things/#
③ #

EC2インスタンスでGreengrassを起動します。

$ cd /greengrass/ggc/core
$ sudo ./greengrassd start
Starting greengrass daemon
Greengrass successfully started with PID: 24809

Greengrass Coreのログディレクトリにアクセスするにはroot権限が必要です。

$ sudo su -
# cd /greengrass/ggc/var/log/system/
# tail -f runtime.log
[2017-12-10T05:26:43.673Z][INFO]-Started all system components
[2017-12-10T05:26:43.901Z][INFO]-Started Deployment Agent and listening for updates
[2017-12-10T05:26:43.901Z][INFO]-Started Deployment Agent and listening for updates
[2017-12-10T05:26:43.901Z][INFO]-Deployment agent connected to cloud
[2017-12-10T05:26:43.901Z][INFO]-Trying to subscribe to topic $aws/things/myFirstGGG_Core-gda/shadow/update/delta
[2017-12-10T05:26:43.917Z][INFO]-Subscribed to : $aws/things/myFirstGGG_Core-gda/shadow/update/delta
[2017-12-10T05:26:43.917Z][INFO]-Trying to subscribe to topic $aws/things/myFirstGGG_Core-gda/shadow/get/accepted
[2017-12-10T05:26:43.938Z][INFO]-Subscribed to : $aws/things/myFirstGGG_Core-gda/shadow/get/accepted

Greengrassを起動するときに問題が発生した場合は、crash.logをチェックします。

/greengrass/ggc/var/log/crash.log

Add devices to the Greengrass Group

Greengrassグループは現在、コアのみで構成されていますので
デバイスggad-1とggad-2をグループに追加します。
後に、この2つのデバイスはAWS IoTではなくてコアに接続されるように設定します。

Greengrassコンソールへ移動します。

1.グループ
2.myFirstGGG を選択

17画像

3.デバイス
4.デバイスを追加する
5.モノを選択する

18画像

6.ggad-1を選択して完了
7.ggad-2も同じように登録

19画像

Create a subscription

Greengrassグループに追加したggad-1とggad-2は、ggad-1がパブリッシャとして動作し
ggad-2がサブスクライバとして動作する場所で通信する必要があります。

デバイス間でメッセージをルーティングし、通信を可能にするためにサブスクリプションを定義します。
サブスクリプションとは、ソース、ターゲット、トピックフィルタで構成されるルーティングルールです。
どのソースがどのトピックにどのターゲットへ通信できるかを定義します。

Greengrassコンソールへ移動します。

1.グループ
2.myFirstGGG を選択
3.サブスクリプション

20画像

4.サブスクリプションの登録
5.ソース -> デバイス -> ggad-1
ターゲット -> デバイス -> ggad-2
次へ

21画像

6.Optional topic filter -> sdk/test/Python 次へ

22画像

7.完了

23画像

Enable Logging for Greengrass

Greengrassのログを有効にします。
デフォルトではGreengrass Coreではログは有効になっていません。コアで何が起きたのか、トラブルシューティングなどのためにログを有効にしておきます。

  1. グループ
  2. myFirstGGG を選択
  3. 設定
  4. スクロールダウンして Local logs configuration -> 編集
  5. 他のログタイプを登録
  6. 両方の"User Lambdas" と "Greengrass system"にチェックをする 更新
  7. 送信するログレベルの選択 -> デバッグログ を選択
  8. 保存

グリーングラスコアのログファイル

Log directory: /greengrass/ggc/var/log
System logs: /greengrass/ggc/var/log/system
Lambda logs: /greengrass/ggc/var/log/user/<AWS_REGION>/<ACCOUNT_ID>

Deploy the Greengrass Group to the device

Greengrasグループの作成または変更後、Greengrass Coreに配置する必要があります。

デバイス上で

cd /greengrass/ggc/var/log/system
tail -f localwatch/localwatch.log *.log

Greengrassコンソール上で

1.グループ
2.myFirstGGG を選択
3.アクション -> デプロイ

24画像

4.Automatic detection を選びます

25画像 26画像

tail -f localwatch/localwatch.log *.log からも起動、接続が確認できます。

Connect devices to the Greengrass Core

Greengrass Coreはデバイスを介して設定された内容を取得したので、
これでCoreに接続することができます。
デバイスをGreengrass Coreに接続するには、接続情報(IPアドレス/DNS名とポート)と
コアの証明書に署名したCA証明書が必要です。

上記の情報はAWS IoTの検出サービスを介してデバイスによって自動的に取得されます。
検出サービスを使用するには、greengrass:Discoverアクションを許可するIoTポリシーが必要です。

ggad-1とggad-2をコアに接続するには、各デバイスのポリシーにgreengrass:Discoverアクションを
追加する必要があります。

AWS IoTコンソールへ移動します。

1.管理
2.モノ

27画像

3.ggad-1を選択
4.セキュリティ
5.証明書をクリック

28画像

6.ポリシー
7.ggad-1-Policyをクリック
8.ポリシードキュメントを編集
9.アクションセクションに"greengrass:Discover"を追加して保存

新しいポリシー文書は以下のようになります。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "iot:Publish",
        "iot:Subscribe",
        "iot:Connect",
        "iot:Receive",
        "greengrass:Discover" ★ここに追加
      ],
      "Resource": [
        "*"
      ]
    }
  ]
}

余談ですが、正常に保存が成功してるのに反映されないなーと思っていたら
構文間違えてました。。間違えてても保存されてしまうんですね。。(間違えてるから保存はできても反映されない)

同じように、ggad-2も変更します。

変更したら、利用可能なコアのエンドポイントを見てみましょう!

Greengrassコンソールへ移動します。

  1. Greengrass -> コア
  2. myFirstGGG_Core を選択
  3. 接続 -> コアエンドポイント

29画像

Connect devices to the Greengrass Core

ggad-1とggad-2はGreengrass Coreに接続してローカルで通信します。
ggad-1はパブリッシャとして動作します。ggad-2はサブスクライバとして動作してggad-1から
受信したデータを書き込みます。

デフォルトではデバイスはAWS IoTに接続しているので、Greengrass Coreに向けるために
コマンドパラメータ"--connect-to greengrass"を使用します。

ggad-1とggad-2のstart.shを変更します。

python GGBootcampPubSub.py -e <YOUR_ENDPOINT>.<AWS_REGION>.amazonaws.com -r root-CA.crt -c ggad-1.cert.pem -k ggad-1.private.key --clientId ggad-1 --connect-to greengrass

2つの端末を開き、start.shスクリプトでデバイスを起動します。

ターミナル 1: ggad-2を起動
ターミナル 2: ggad-1を起動
ターミナル 1: ggad-1からのメッセージが到着することを確認

ggad-1

2017-12-10 06:53:47,965 - AWSIoTPythonSDK.core - INFO - publish: topic: sdk/test/Python
2017-12-10 06:53:47,965 - AWSIoTPythonSDK.core - INFO - arn:aws:iot:us-west-2:<AWS_account_ID>:thing/myFirstGGG_Core

ggad-2

2017-12-10 06:53:45,697 - AWSIoTPythonSDK.core - INFO - {"temperature": 34.21059259572323, "datetime": "2017-12-10T06:53:45", "pressure": 49.81736789234773, "device": "ggad-2", "humidity": 1145.6129113675813, "sensor": "Random"}
2017-12-10 06:53:45,697 - AWSIoTPythonSDK.core - INFO - publish: topic: sdk/test/Python
2017-12-10 06:53:45,697 - AWSIoTPythonSDK.core - INFO - arn:aws:iot:us-west-2:<AWS_account_ID>:thing/myFirstGGG_Core
2017-12-10 06:53:45,697 - AWSIoTPythonSDK.core.protocol.mqtt_core - INFO - Performing sync publish...

router.logはGreengrassのメッセージのルーティングを記録します。
/greengrass/ggc/var/log/system/router.log

router.log

[2017-12-10T06:53:40.691Z][INFO]-message received from (client/ggad-2) with subject (sdk/test/Python)
[2017-12-10T06:53:40.958Z][INFO]-message received from (client/ggad-1) with subject (sdk/test/Python)
[2017-12-10T06:53:40.958Z][INFO]-Message (client/ggad-1, sdk/test/Python) will be forwarded to client/ggad-2.
[2017-12-10T06:53:40.958Z][INFO]-Message (client/ggad-1, sdk/test/Python) forwarded to client/ggad-2, func arn:aws:lambda:::function:GGConnManager.

Device to cloud communication

ggad-2からメッセージをクラウドに送信します。
それに応じてデバイスからクラウドへメッセージをルーティングするには別のサブスクリプションを
作成する必要があります。

Greengrass -> グループ -> myFirstGGGからサブスクリプションを選択。

ソース: デバイス -> ggad-2
ターゲット: IoT Cloud
オプションのトピックのフィルター: sdk/test/Python

デプロイします。

pending -> progress -> succesfully となったらOKです。

30画像

MQTTクライアントでsdk/test/Pythonをサブスクライブします。

デバイス(ggad-2)で

sudo ./start.sh

MQTTクライアントで受信メッセージを確認します。

31画像

Cloud to device communication

クラウドからggadにメッセージを送信することもできます。
クラウドからのデータをggad-1デバイスにルーティングする必要があります。

Greengrass -> グループ -> myFirstGGGからサブスクリプションを選択。

ソース: IoT Cloud
ターゲット: デバイス -> ggad-1
オプションのトピックのフィルター: sdk/test/Python

デプロイします。

32画像

デバイス(ggad-1)で

sudo ./start.sh

MQTTクライアントに移動して、sdk/test/pythonにメッセージを発行します。

  1. トピックの発行
  2. パブリッシュ: トピック: sdk/test/Python ※デフォルトメッセージはそのままで良いです
  3. トピックをパブリッシュします。

確認。
ggad-1が実行されているウィンドウ/端末のデバイスで受信メッセージを探します。

2017-12-10 07:28:15,028 - AWSIoTPythonSDK.core - INFO - {"temperature": 23.628040064070234, "datetime": "2017-12-10T07:28:15", "pressure": 40.638825937419846, "device": "ggad-1", "humidity": 1117.8889468338257, "sensor": "Random"}
2017-12-10 07:28:15,028 - AWSIoTPythonSDK.core - INFO - publish: topic: sdk/test/Python
2017-12-10 07:28:15,028 - AWSIoTPythonSDK.core - INFO - arn:aws:iot:us-west-2:<AWS_account_ID>:thing/myFirstGGG_Core
2017-12-10 07:28:15,028 - AWSIoTPythonSDK.core.protocol.mqtt_core - INFO - Performing sync publish...

きました。↑

モニタリング

33画像

34画像

35画像

36画像

おわりに

IoT関連のワークショップに参加したくて、Greengrassのワークショップに参加してみました。
(とにかくIoT関連のセッションやワークショップが人気で、IoT Basicのワークショップは人数制限で入れませんでした。。)
実はワークショップ中に全て終わらせることができず、、後日改めて挑戦しました。
Greengrassは初めてふれたサービスな上に、IoTもほぼ未経験の状態でしたので理解に時間がかかりましたが
とても興味深かったです。
こちらのワークショップではCloudformationが用意されているので一からインスタンスを設定するより
ずっと簡単にできます。Greengrassの理解を深めたい方に是非おすすめです!