【レポート】Greengrass Basicのワークショップに参加しました #reinvent #IOT204
はじめに
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の基本を理解するためのものです。
■以下を学習
・デバイスを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を使用します。
- テンプレートを選択する画面 ※テンプレートはすでに選択されているので何もしなくてOKです
- Next
- Parameters
3.1. Select SSHKeyName
3.2. Select a SubnetID
3.3. Select a VpcId - Next
- Options ※何もせず次へ
- Next
- Review -> ページ下部にある"I acknowledge that AWS CloudFormation might create IAM resources." にチェック
- Create
- ページをリフレッシュ
- 作成が完了するのを待ちます
IoTのログを有効にする
IAMコンソールへ移動します。ロールを作成します。
- ロール
- ロールの作成 -> AWS サービス -> IoT -> 次のステップ: アクセス権限
- アタッチされたアクセス権限ポリシー: AWSIoTLogging, AWSIoTRuleActions
- 次のステップ: 確認 5. ロールの名前を設定
- ロールを作成
ロールを作成したら、IoTコンソールへ移動します。
- Get started (初めて設定を実施する場合のみ、はじめに。。みたいなページが表示されます)
- ページ右側の「設定」を選択
- ログが無効になっていると思うので、ログの箇所にて「編集」を選択
- 詳細レベル -> デバッグ(詳細レベルが最も高い) を選択
- ログの設定 -> 先ほど作成したロールを選択
- 更新
こうなります。
IoTのログファイルはCloudWatchに送信されます。コンソールを使用して、ログを見ることができます。
Connect a thing to AWS IoT
デバイスをAWS IoTへ接続します。
・デバイスをAWS IoT、Greengrass Aware Device(GGAD)へ接続する
・X.509証明書と接続情報を使用して動作する
ここではキーと証明書を含むzipファイルと、必要なソフトウェアをインストールするための
スクリプトを用意します。
1.AWS IoTコンソールへ移動します。
2.オンボードをクリック。
3.「デバイスの設定」-> 今すぐ始める
4.「AWS IoTにどの様に接続していますか?」プラットフォームとSDKを選択する
5.Linux/OSXとパイソンを選択する
6.モノの名前を登録する
7.conncection kitのダウンロード
8.次のステップをクリック
次に、EC2インスタンスにSSHログインします。
- "ggad-1"という名前のディレクトリを作成します。(Cloudformationを使用しているなら不要)
- "connect_device_package.zip"をディレクトリ "ggad-1"にコピー(scp)
- ファイル "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コンソールへ移動します。
- 「テスト」をクリック
- 「トピックへサブスクライブする」で"sdk/test/Python"を入力し、トピックへのサブスクライブを実行
- 同じ様に"$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コアに接続してデータをクラウドやローカルに送信し、クラウドからメッセージを受信します。
Greengrassグループを作成します。Greengrassコンソールへ行って、
1.Greengrassを選択
2.グループの定義
3.グループの作成
4.「簡単な作成の使用」をクリック
5.グループ名:myFirstGGG
6.次へ
7.コアの名前はそのままにする
8.次へ
9.グループとコアの作成
10.tar.gzのダウンロード実施
11.もし、CloudformationからEC2を作成していない場合はGreengrassソフトウェアもダウンロード
12.「完了」をクリック。※「完了」をクリックしないと作成されないので、忘れないようにしてください。
Greengrass Groupが作成されたことを確認します。
Greengrass -> Groupsで確認。
Install Greengrass on your device
Greencoreとして機能するデバイスで、Greengrassソフトウェアをインストールします。
Greengrassサービスロールを作成します。
※Greengrassでは、LambdaおよびAWS IoTデータへのアクセスが必要です。
IAMコンソールへ移動します。
- ロール
- ロールの作成
- AWS サービス
- Greengrass
- 次のステップ: アクセス権限
- 選択 -> AWSGreengrassResourceAccessRolePolicy
- 次のステップ: 確認
- ロール名: GreengrassRole
- ロールの作成
次に、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 を選択
3.デバイス
4.デバイスを追加する
5.モノを選択する
6.ggad-1を選択して完了
7.ggad-2も同じように登録
Create a subscription
Greengrassグループに追加したggad-1とggad-2は、ggad-1がパブリッシャとして動作し
ggad-2がサブスクライバとして動作する場所で通信する必要があります。
デバイス間でメッセージをルーティングし、通信を可能にするためにサブスクリプションを定義します。
サブスクリプションとは、ソース、ターゲット、トピックフィルタで構成されるルーティングルールです。
どのソースがどのトピックにどのターゲットへ通信できるかを定義します。
Greengrassコンソールへ移動します。
1.グループ
2.myFirstGGG を選択
3.サブスクリプション
4.サブスクリプションの登録
5.ソース -> デバイス -> ggad-1
ターゲット -> デバイス -> ggad-2
次へ
6.Optional topic filter -> sdk/test/Python 次へ
7.完了
Enable Logging for Greengrass
Greengrassのログを有効にします。
デフォルトではGreengrass Coreではログは有効になっていません。コアで何が起きたのか、トラブルシューティングなどのためにログを有効にしておきます。
- グループ
- myFirstGGG を選択
- 設定
- スクロールダウンして Local logs configuration -> 編集
- 他のログタイプを登録
- 両方の"User Lambdas" と "Greengrass system"にチェックをする 更新
- 送信するログレベルの選択 -> デバッグログ を選択
- 保存
グリーングラスコアのログファイル
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.アクション -> デプロイ
4.Automatic detection を選びます
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.モノ
3.ggad-1を選択
4.セキュリティ
5.証明書をクリック
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コンソールへ移動します。
- Greengrass -> コア
- myFirstGGG_Core を選択
- 接続 -> コアエンドポイント
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です。
MQTTクライアントでsdk/test/Pythonをサブスクライブします。
デバイス(ggad-2)で
sudo ./start.sh
MQTTクライアントで受信メッセージを確認します。
Cloud to device communication
クラウドからggadにメッセージを送信することもできます。
クラウドからのデータをggad-1デバイスにルーティングする必要があります。
Greengrass -> グループ -> myFirstGGGからサブスクリプションを選択。
ソース: IoT Cloud
ターゲット: デバイス -> ggad-1
オプションのトピックのフィルター: sdk/test/Python
デプロイします。
デバイス(ggad-1)で
sudo ./start.sh
MQTTクライアントに移動して、sdk/test/pythonにメッセージを発行します。
- トピックの発行
- パブリッシュ: トピック: sdk/test/Python ※デフォルトメッセージはそのままで良いです
- トピックをパブリッシュします。
確認。
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...
きました。↑
モニタリング
おわりに
IoT関連のワークショップに参加したくて、Greengrassのワークショップに参加してみました。
(とにかくIoT関連のセッションやワークショップが人気で、IoT Basicのワークショップは人数制限で入れませんでした。。)
実はワークショップ中に全て終わらせることができず、、後日改めて挑戦しました。
Greengrassは初めてふれたサービスな上に、IoTもほぼ未経験の状態でしたので理解に時間がかかりましたが
とても興味深かったです。
こちらのワークショップではCloudformationが用意されているので一からインスタンスを設定するより
ずっと簡単にできます。Greengrassの理解を深めたい方に是非おすすめです!