AWS IoT ハンズオン Dojo ~Greengrass~¶
イントロダクション¶
AWS IoT ハンズオン Dojo コース¶
今回のAWS IoT ハンズオン Dojo コースは、AWS Greengrassに的を絞ったものになります。 Greengrassを使った _エッジコンピューティング を学ぶことが出来るコースです。

ハンズオンシナリオ¶
本ハンズオンではセンサーデバイスに異常が発生した場合、アラートデバイスで通知する、というユースケースを、AWS IoTのみ用いた場合と、そこにGreengrassを加えた場合の両パターンで実現します。
はじめに、Raspberry Pi上のセンサーデバイス、アラートデバイスをAWS IoTを通じて連携させます。AWS IoTに入力されたセンサーデバイスからの計測データをクラウド上のLambda関数で処理させます。
その後、Raspberry Pi上にGreengrass coreを導入し、センサーデバイス、アラートデバイスをAWS IoTを介することなく連携させます。クラウドからGreengrass coreにLambda関数をデプロイし、センサーデバイスからの計測データをエッジ内で処理させます。GreenGrassを加えることで、デバイスがオフライン状態であっても、エッジでの処理(ローカル Lambda)が停止することなく処理が行われることを確認します。
なお、本ハンズオンではセンサーデバイス、アラートデバイス、Greengrass coreを簡易化のため同一のRasbperri Piで動作させます。 また、センシング対象はCPU使用率、通知方法はコンソールへの出力とします。
クラウドを通じてデバイスを連携させる

エッジでデバイスを連携させる

利用するデバイス、アプリケーション、サービス¶
Raspberry Pi¶
ARMプロセッサーを搭載したシングルボードコンピュータ。 Linuxで動作し、microSDメモリーカード (microSD) を起動および長期保存用のストレージに利用します。
AWS IoT¶
- 接続されたデバイスが安全かつ簡単にクラウドアプリケーションやその他のデバイスとやりとりするためのマネージド型プラットフォームです。
- https://aws.amazon.com/jp/iot/

AWS Greengrass¶
- 接続されたデバイスでローカルのコンピューティング、メッセージング、データキャッシュ、および同期を安全な方法で実行できるようにするソフトウェアです。
- https://aws.amazon.com/jp/greengrass/

AWS IoT Device SDK¶
AWS IoT デバイス SDK を使用すれば、ハードウェアデバイスを簡単かつすばやく AWS IoT に接続できます。この SDK では、AWS IoT によって準備されているデバイスゲートウェイおよびデバイスのシャドウとハードウェアデバイスとをシームレスかつセキュアに連携させられるよう、機能が強化されています。 本ハンズオンでは、センサーデバイスとアラートデバイスにて、Python言語版のDevice SDKを使用しています。
AWS Lambda¶
- お客様のコードをイベント発生時やリクエストごとに実行できる管理不要なコンピューティングプラットフォームです。本ハンズオンでは、クラウド上とAWS Greengrass上の両方で使用します。
- https://aws.amazon.com/jp/lambda/
Amazon CloudWatch¶
- AWSクラウドリソースとAWSで実行するアプリケーションのモニタリングサービスです。メトリクスの収集、ログファイルの収集が可能です。本ハンズオンではCloudWatch Logsを利用してAWS IoTのログを収集、閲覧します。
- https://aws.amazon.com/jp/cloudwatch/
事前準備¶
VNCクライアント¶
Raspberry Piの操作は、VNCを使用してリモートで行います。VNC接続に必要なソフトウェアをURLからダウンロードし、インストールしておいて下さい。
https://www.realvnc.com/download/viewer/
(Mac/Windows共通)
設定によっては、インストール出来ない場合があります。 その場合、インストーラーを"管理者として実行"してみて下さい。
サンプルファイル¶
本ハンズオンで利用するファイルです。
- # Raspberry Pi 用 SDカードイメージ
https://s3-us-west-2.amazonaws.com/greengrass-trial/GG_Handson.img.zip
本ハンズオンでは、このイメージをSDカードに書き込んだものを用意します。 下記のツールを使ってSDカードに書き込むことも出来ます。 https://etcher.io/
- # Lambda関数パッケージ
- https://s3-us-west-2.amazonaws.com/greengrass-trial/GGhandsonLambda.zip
参考情報¶
- AWS IoT Device SDK Python https://github.com/aws/aws-iot-device-sdk-python
AWS IoTの設定¶
この章ではAWS IoTにセンサーデバイス、アラートデバイスを作成し、セキュリティーやポリシーの設定を行います。

AWS マネジメントコンソールにログイン¶
まずは、下記のURLにアクセスして、アカウントID、ユーザー名、パスワードを入力しAWSマネージメントコンソールにサインインして下さい。
https://console.aws.amazon.com/
項目 | 値 |
---|---|
アカウント | AWSのアカウントID (12桁の数字) |
ユーザー名 | IAMユーザー名 |
パスワード | IAMユーザー パスワード |

AWS IoT エンドポイント¶
Raspberry Pi上のGreengrassコア、センサーデバイス、アラートデバイスの設定ファイルに、AWS IoTのエンドポイントを記入する必要があります。
AWSマネージメントコンソールを開き、右上のリージョン一覧から [米国西部(オレゴン)]を選択します。

サービス一覧から [AWS IoT] をクリックして開きます。

メニューから [設定] をクリックして下さい。エンドポイントが表示されます。

ノートパッドなどに記録しておいて下さい。
記録
AWS IoT endpoint
"endpoint": "xxxxxxxxxxxx.iot.us-west-2.amazonaws.com"
モノ(Thing)の作成¶
メニューから [登録] をクリックして下さい。 まだ何も登録していない場合は下記が表示されますので[モノの登録]をクリックして下さい。

※ 1つ以上モノ(Thing)を登録している場合は一覧が表示されますので画面右上の[作成]をクリックして下さい。

モノの登録 画面が表示されますので、[名前]に”Alert-<参加者番号>”と入力し、[モノの作成]をクリックします。
項目 | 値 |
---|---|
Name | Alert-<参加者番号> |

アラートデバイス:Alert-<参加者番号> が作成されました。

[←]をクリックして下さい。センサーデバイスも作成します。
[作成]をクリックします。

[名前]に”Sensor-<参加者番号>”と入力し、[モノの作成]を再度、クリックします。
項目 | 値 |
---|---|
Name | Sensor-<参加者番号> |

センサーデバイス:Sensor-<参加者番号> が作成されました。

[←]をクリックして下さい。
アラートデバイスとセンサーデバイスが作成されました。

証明書の作成(アラートデバイス)¶
アラートデバイス用の証明書を作成します。
メニューから[セキュリティー]をクリックします。 まだ何も登録していない場合は下記が表示されますので[証明書を作成する]をクリックして下さい。

※ 1つ以上証明書を登録している場合は一覧が表示されますので画面右上の[作成]をクリックして下さい。

[1-Click 証明書作成 (推薦)]の右の[証明書の作成]をクリックします。

下記の様に、"証明書が作成されました!" と表示されます。
この画面で、アラートデバイスの[このモノの証明書] と [プライベートキー]をPCにダウンロードして下さい。完了してしまうと同じ証明書とキーをダウンロードすることができません。 [有効化] をクリックして、証明書をアクティブにし、最後に、[完了] をクリックして下さい。

ダウンロードした証明書とプライベートキーは、後にRaspberry Piにコピーし、アラートデバイスで使用します。 (~/aws-iot-greengrass-handson-basic 下にコピーします。) また、証明書の番号は、アラートデバイス用と分かる様にノートパッドなどに記録しておいて下さい。
記録
Alarm Device: Alert-<参加者番号>
"device_certificate_relative_path": "yyyyyyyyyy-certificate.pem.crt",
"device_private_key_relative_path": "yyyyyyyyyy-private.pem.key",
ポリシーの作成(アラートデバイス)¶
アラートデバイス(用の証明書)に付与するポリシーを追加します。
メニューから[セキュリティー]>[ポリシー]をクリックします。 まだ何も登録していない場合は下記が表示されますので[ポリシーの作成]をクリックして下さい。

※ 1つ以上ポリシーを登録している場合は一覧が表示されますので画面右上の[作成]をクリックして下さい。

アラートデバイス用の証明書に付与するポリシーを作成します。 下記のとおり入力し、[作成]をクリックして下さい。
アクションを選択するとリソースARNとして[arn:aws:iot:us-west-2:<アカウント番号>:topic/replaceWithATopic]が自動で記入されますが、[*]に置き換えて下さい。
項目 | 値 |
---|---|
名前 | Alert-<参加者番号>-policy |
アクション | iot:* |
リソース ARN | * |

アラートデバイスに付与するポリシーが作成されました。

※ 今回のハンズオンでは簡易化のため、アラートデバイスがAWS IoTにおける全アクションを全リソースに対して行えるポリシーを付与しますが、実際に使用する場合は、デバイスが必要とするアクションとリソースに制限することを検討して下さい。
証明書にポリシーをアタッチする(アラートデバイス)¶
証明書の画面に戻ります。アラートデバイス用の証明書をクリックしてください。

証明書の詳細が表示されます。右上の [アクション] メニューから [ポリシーのアタッチ] を選んで下さい。

[Alert-<参加者番号>-policy] が、表示されますので、チェックを入れて、[アタッチ] をクリックして下さい。

アラートデバイスに付与するポリシーが証明書に付与されました。 証明書の詳細にて、[ポリシー]を選択すると[Alert-<参加者番号>-policy] が、表示されることを確認して下さい。

証明書にモノをアタッチする(アラートデバイス)¶
ポリシーが紐付けられたを証明書にモノをアタッチすることで、モノの認証と権限の設定が完了します。
続けて証明書の詳細にて、右上の [アクション] メニューから [モノをアタッチする] を撰んで下さい。

[Alert-<参加者番号>] が、表示されますので、チェックを入れて、[アタッチ] をクリックして下さい。

証明書がアラートデバイスに付与されました。 証明書の詳細にて、[モノ]を選択すると[Alert-<参加者番号>] が、表示されることを確認して下さい。

センサーデバイスについても、同様の操作を行い、証明書の作成、ポリシーの作成、証明書にポリシーをアタッチ、証明書にモノをアタッチしていきます。
証明書の作成(センサーデバイス)¶
センサーデバイス用の証明書を作成します。
メニューから[セキュリティー]をクリックします。 一覧が表示されますので右上の[作成]をクリックして下さい。

[1-Click 証明書作成 (推薦)]の右の[証明書の作成]をクリックします。

下記の様に、"証明書が作成されました!" と表示されます。
この画面で、センサーデバイスの[このモノの証明書] と [プライベートキー]をPCにダウンロードして下さい。完了してしまうと同じ証明書とキーをダウンロードすることができません。 [有効化] をクリックして、証明書をアクティブにし、最後に、[完了] をクリックして下さい。

ダウンロードした証明書とプライベートキーは、後にRaspberry Piにコピーし、センサーデバイスで使用します。 (~/aws-iot-greengrass-handson-basic 下にコピーします。) また、証明書の番号は、センサーデバイス用と分かる様にノートパッドなどに記録しておいて下さい。
記録
Sensor Device: Sensor-<参加者番号>
"device_certificate_relative_path": "zzzzzzzzzz-certificate.pem.crt",
"device_private_key_relative_path": "zzzzzzzzzz-private.pem.key",
ポリシーの作成(センサーデバイス)¶
センサーデバイス(用の証明書)に付与するポリシーを追加します。
メニューから[セキュリティー]>[ポリシー]をクリックします。 一覧が表示されますので画面右上の[作成]をクリックして下さい。

センサーデバイス用の証明書に付与するポリシーを作成します。 下記のとおり入力し、[作成]をクリックして下さい。 アクションを選択するとリソースARNとして[arn:aws:iot:us-west-2:<アカウント番号>:topic/replaceWithATopic]が自動で記入されますが、[*]に置き換えて下さい。
項目 | 値 |
---|---|
名前 | Sensor-<参加者番号>-policy |
アクション | iot:* |
リソース ARN | * |

センサーデバイスに付与するポリシーが作成されました。

※ 今回のハンズオンでは簡易化のため、センサーデバイスがAWS IoTにおける全アクションを全リソースに対して行えるポリシーを付与しますが、実際に使用する場合は、デバイスが必要とするアクションとリソースに制限することを検討して下さい。
証明書にポリシーをアタッチする(センサーデバイス)¶
証明書の画面に戻ります。センサーデバイス用の証明書をクリックしてください。

証明書の詳細が表示されます。右上の [アクション] メニューから [ポリシーのアタッチ] を選んで下さい。

[Sensor-<参加者番号>-policy] が、表示されますので、チェックを入れて、[アタッチ] をクリックして下さい。

センサーデバイスに付与するポリシーが証明書に付与されました。 証明書の詳細にて、[ポリシー]を選択すると[Sensor-<参加者番号>-policy] が、表示されることを確認して下さい。

証明書にモノをアタッチする(センサーデバイス)¶
ポリシーが紐付けられたを証明書にモノをアタッチすることで、モノの認証と権限の設定が完了します。
続けて証明書の詳細にて、右上の [アクション] メニューから [モノをアタッチする] を撰んで下さい。

[Sensor-<参加者番号>] が、表示されますので、チェックを入れて、[アタッチ] をクリックして下さい。

証明書がセンサーデバイスに付与されました。 証明書の詳細にて、[モノ]を選択すると[Sensor-<参加者番号>] が、表示されることを確認して下さい。

これで、AWS IoTの基本設定は、終わりです。
Lambda関数の登録とAWS IoT Lambdaルールの作成¶
この章ではAWS IoTのTopicに入力されたデータに対するルールの設定と、そのルールをトリガーに実行されるLambda関数の設定を行います。

Lambda関数の登録¶
センサーデバイスからAWS IoTに送信されたデータによってトリガーされるLambda関数を登録します。
はじめに、Lambda関数パッケージを下記のリンクからPCにダウンロードして下さい。このzipファイルは、後ほどLambdaの設定画面でアップロードします。
https://s3-us-west-2.amazonaws.com/greengrass-trial/GGhandsonLambda.zip
このパッケージは、Lambda関数(cpuUsageChecker.py)の他に、後ほどエッジで動かす際に必要なAWS Greengrass コア Python SDKを含みますが、クラウドで実行する際は利用しません。
サービス一覧から[Lambda] をクリックして開きます。

下記のような画面が表示されるので、[今すぐ始める] をクリックします。

Lambda関数の作成画面が表示されるので、"Blank Function" をクリックします。

トリガーの設定画面が表示されるので、[次へ]をクリックします。

ダウンロード済みのLambda関数パッケージ(GGhandsonLambda.zip)をアップロードします。 下記のような画面が表示されるので、必要事項を入力して下さい。
項目 | 設定 |
---|---|
名前 | cpuUsageChecker-<参加者番号> |
説明 | a Lambda func. for gghandson |
ランタイム | Python 2.7 |
コード エントリ タイプ | .ZIPファイルをアップロード |
関数パッケージ | GGhandsonLambda.zip |
ハンドラ | cpuUsageChecker.message_handler |
ロール | カスタムロールの作成 |

ロール:[カスタムロールの作成] を選択すると、別画面でIAMの設定画面が出てきますので、 下記必要事項を入力して下さい。 ポリシードキュメントを編集する際、ダイアログが表示されます。 [OK] をクリック後、ポリシードキュメントが編集可能になるので、下記ポリシードキュメントをコピー&ペーストします。
こちらのポリシードキュメントは、デフォルトで付与されているCloudWatchLogへの各種アクションに関する権限に加えて、 AWS IoTにおけるシャドウを更新する権限を追加しています。
最後に[許可]をクリックするとIAMの設定画面は閉じます。
項目 | 設定 |
---|---|
IAMロール | 新しいIAMロールの作成 |
ロール名 | lambda_for_gghandson_<参加者番号> |
ポリシードキュメント | 下記に記載 |
ポリシードキュメント
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "arn:aws:logs:*:*:*"
},
{
"Effect": "Allow",
"Action": [
"iot:UpdateThingShadow"
],
"Resource": [
"*"
]
}
]
}

Lambdaの画面に戻ります。ロールが [既存ロールを選択]に変更され、ロール名として、"lambda_for_gghandson_<参加者番号>" になっていることを確認し、[次へ] をクリックして下さい。

確認画面が表示されますので、下までスクロースし、[関数の作成] をクリックして下さい。

Lambda関数の作成に成功すると、下記の様な画面が表示されます。
Uploadしたzipファイルに含めたLambda関数で実行したいコードが表示されます。 本コードは入力されたデータからCPUの値を取り出し、閾値に応じてアラートデバイスのシャドウを変更する簡単なプログラムとなっています。
コード内の "thingName" が、"Alert-01" となっていますので、01 の所をご自分の参加者番号に置き換えて下さい。CPUロードが 50% を越えると、アラートを"on"にするようになっています。
修正したら、 [保存] をクリックします。

これで、Lambda関数の登録は、終了です。
AWS IoT Lambdaルールの作成¶
Lambda関数を作成したので、Lambda関数を呼び出すAWS IoTのルールを作成します。 AWS IoTコンソールより、[ルール]をクリックして下さい。 まだ何も登録していない場合は下記が表示されますので[ルールを作成する]をクリックして下さい。

※ 1つ以上ルールを登録している場合は一覧が表示されますので画面右上の[作成]をクリックして下さい。

ルールを作成する 画面が表示されますので、[名前]に”cpuUsageRule_<参加者番号>”(ハイフンが利用できないため、アンダースコアを使います)を入力し、説明に下記を入力して下さい。
項目 | 値 |
---|---|
名前 | cpuUsageRule_<参加者番号> |
説明 | a rule for gghandson |

続いてルールの以下にメッセージのリソースの設定を入力します。 [条件]には何も指定しません。

[一つ以上のアクションを設定する]から[アクションの追加]をクリックします。

[アクションを選択してください]から[メッセージデータを渡す Lambda 関数を呼び出す]を選択し、[アクションの設定]をクリックします。


[リソースの選択]ドロップダウンリストで先ほど作成したLambda関数名[cpuUsageChecker-<参加者番号>]を選択し、[アクションの追加]をクリックします。

[一つ以上のアクションを設定する]にLambda関数のアクションが追加されたことが確認できます。 続いて[ルールを作成する]をクリックして下さい。

ルールの作成が完了しました。

Raspberry Piの設定¶
組み立て¶
SDカードをRaspberry Piに装着します。向きがあるので注意して下さい。

電源プラグをマイクロUDBソケットに差し込みます。

電源を投入すると、SDカードスロット右の赤LEDが点灯します。OSブートが始まり、SDカードへのアクセスがあると、、緑LEDが点滅します。
WiFi接続¶
お手持ちのPCをハンズオンのWiFiアクセスポイントに接続します。WiFi設定は、下記になります。
- SSID:awshandson
- パスフレーズ:awshandson
お手持ちのPCにインストールした、VNC Viewer を起動して下さい。下記の画面が表示されます。
接続先として、'raspberrypi-<参加者番号>.local'と入力して[Enter]を押します。
「一人で1つのAWSアカウントを利用する場合は「参加者番号」は "01" としてください。」 としていましたが、ここでの<参加者番号>は、SDカードに書かれた番号にして下さい・。

Username と、Password を入力して [OK] を押します。

無事、Raspberry Piに接続出来たら、Raspberry Piのリモート画面が表示されます。

警告が出ますが、無視して、[OK] を押して下さい。
Raspberry Piは、WiFi SSID = awshandson に接続するように設定してあります。 VNC Viewerでの接続ができれば、Raspberry PiもWiFiに接続出来ているはずです。
うまく接続出来ない場合は、Ethernet接続を試してみましょう。 Raspberry PiのEthernetは、固定IPアドレス 192.168.11.100 に設定されています。 PCとRaspberry PiをEthernetで接続し(ストレートケーブルでも構いません。)
PC側のIPアドレスを、固定IP 192.168.11.xxx に設定して下さい。 VNC Viewerの接続先を、192.168.11.100 にして、接続してみてください。
シリアルケーブルでコンソール接続する場合、下記のファイルにWiFi設定が入っていますので、適宜変更して下さい。
/etc/wpa_supplicant/wpa_supplicant.conf
Raspberry Piの環境を初期化する¶
コンソールを表示¶
コンソールは、メニューバーのアイコンをクリックすると表示されます。

コンソールに下記を入力し、greengrassとAWS IoT Device SDKの環境、及び証明書をクリーンアップします。
./handson_cleanup
rm ~/Desktop/*-certificate.pem.crt
rm ~/Desktop/*-private.pem.key
ダウンロード済みの証明書をRaspberry Piにコピー¶
センサーデバイス、アラートデバイス用に証明書を2セットダウンロードしていました。 Raspberry Piに転送、します。VNC Viewrのタイトルバーの中心にマウスを移動させると、ツールが表示されます。矢印が交差したアイコンをクリックします。

ファイル転送の画面が表示されます。 [Send files...] ボタンを押します。

ファイルの選択画面が表示されるので、全ての証明書を選択して、[Open] を押します。(図は6つのファイル転送していますが、ここでは4つのファイルを転送します)

ファイルがRaspberry Piのデスクトップに転送されます。

設定のおさらい、
ここで、設定のおさらいをしてみましょう。Raspberry Piの設定のために記録した内容は、下記の様になっているはずです。この内容をテキストファイルにして、Raspberry Piに転送しておきましょう。PC側でコピーしてVNCの画面にペーストすることも出来ますが、うまくいかないこともあり、ファイルを転送することをお勧めします。(cleanupスクリプトで削除するために、拡張子は.txtとしてください。)
AWS IoT endpoint
"endpoint": "xxxxxxxxxxxx.iot.us-west-2.amazonaws.com"
Alarm Device: Alert-<参加者番号>
"device_certificate_relative_path": "yyyyyyyyyy-certificate.pem.crt",
"device_private_key_relative_path": "yyyyyyyyyy-private.pem.key",
Sensor Device: Sensor-<参加者番号>
"device_certificate_relative_path": "zzzzzzzzzz-certificate.pem.crt",
"device_private_key_relative_path": "zzzzzzzzzz-private.pem.key",
Raspberry Pi上のファイル¶
Raspbery Piのメニューバーをクリックしてファイラーを開きます。 /home/pi以下に下記ファイルがあります。
- aws-iot-greengrass-handson-basic.tar.gz 本ハンズオンで利用する、センサーデバイス、アラートデバイスのアプリが入っています。
下記のコマンドで解凍して GGhandsonパッケージを解凍して下さい。
tar -zxf ./aws-iot-greengrass-handson-basic.tar.gz -C .
デバイスの設定と起動¶
アラートデバイス、センサーデバイスは、AWS IoT Device SDK Pythonで作成します。今回のハンズオンでは、Device SDKの開発環境と、各デバイスのコードは、導入済みです。証明書を所定のパスにコピーし、アプリケーションを実行します。
アラートデバイス及びセンサーデバイスの設定と起動は、~/aws-iot-greengrass-handson-basic で行います。
デバイス用の証明書をコピー¶
~/aws-iot-greengrass-handson-basic にアラートデバイス用の証明書をコピーして下さい。
コピーするファイルは、デスクトップ上の下記の2つのファイルになります。
- yyyyyyyyyy-certificate.pem.crt
- yyyyyyyyyy-private.pem.key
同様に~/aws-iot-greengrass-handson-basic にセンサーデバイス用の証明書をコピーして下さい。
コピーするファイルは、デスクトップ上の下記の2つのファイルになります。
- zzzzzzzzzz-certificate.pem.crt
- zzzzzzzzzz-private.pem.key
また、~/aws-iot-greengrass-handson-basicには、root-ca.pemが事前に配置されています。 こちらはAWS IoTのサーバ証明書となっており、各デバイスがAWS IoTに接続するために必要になります。
- root-ca.pem
※ 本証明書はサイトからダウンロードすることが可能です。詳細は下記を参照して下さい。
http://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/managing-device-certs.html
アプリケーションの動作確認¶
アプリケーションを実際に動かして、動作を確認します。 本ハンズオンでは、センサーデバイスはRaspberry Pi上のCPU使用率を定期的にAWS IoTのsensing/dataにuploadし、これをトリガーに実行されたlambda関数がCPU使用率を確認、閾値を超える、もしくは下回るとアラートデバイスのalertのon/offを切り替えます。
本ハンズオンでは、センサーデバイスのCPU使用率を制御するため、センサーデバイスは、高負荷の処理を実行するswitchをシャドウとして保持します。このswitchをonにすることで、センサーデバイスを閾値を超える高負荷状態にすることができます。

デバイスの起動¶
アラートデバイスを起動する¶
コンソールを開き、下記を入力して、アラートデバイスを起動します。
cd aws-iot-greengrass-handson-basic
python ./ThingShadowAlarm.py -e xxxxxxxxxxxx.iot.us-west-2.amazonaws.com -r root-ca.pem -c yyyyyyyyyy-certificate.pem.crt -k yyyyyyyyyy-private.pem.key -n Alert-<参加者番号> -id Alert-<参加者番号>
各実行パラメータの説明は以下になります。
short オプション | long オプション | 説明 | 値 |
---|---|---|---|
-e | --endpoint | AWS IoTのEndpoint | xxxxxxxxxxxx.iot.us-west-2.amazonaws.com |
-r | --rootCA | AWS IoTのサーバ証明書 | root-ca.pem |
-c | --cert | アラートデバイスの証明書 | yyyyyyyyyy-certificate.pem.crt |
-k | --key | アラートデバイスの秘密鍵 | yyyyyyyyyy-private.pem.key |
-n | --thingName | アラートデバイス名 | Alert-<参加者番号> |
-id | --clientId | アラートデバイスのクライアントID | Alert-<参加者番号> |
アラートデバイスは、デバイスシャドウ のキー Alert の更新を待ち続けます。
エラーが出る場合、オプションに指定したパラメータが正しいか、モノに証明書がアタッチされているか、証明書にポリシーがアタッチされているか、ポリシーの内容は適切か、再度確認して下さい。
センサーデバイスを起動する¶
新規にコンソールを開き、下記を入力して、アラートデバイスを起動します。
cd aws-iot-greengrass-handson-basic
python ./ThingShadowSensor.py -e xxxxxxxxxxxx.iot.us-west-2.amazonaws.com -r root-ca.pem -c zzzzzzzzzz-certificate.pem.crt -k zzzzzzzzzz-private.pem.key -n Sensor-<参加者番号> -id Sensor-<参加者番号> -t sensing/data/Sensor-<参加者番号>
各実行パラメータの説明は以下になります。
short オプション | long オプション | 説明 | 値 |
---|---|---|---|
-e | --endpoint | AWS IoTのEndpoint | xxxxxxxxxxxx.iot.us-west-2.amazonaws.com |
-r | --rootCA | AWS IoTのサーバ証明書 | root-ca.pem |
-c | --cert | センサーデバイスの証明書 | zzzzzzzzzz-certificate.pem.crt |
-k | --key | センサーデバイスの秘密鍵 | zzzzzzzzzz-private.pem.key |
-n | --thingName | センサーデバイス名 | Sensor-<参加者番号> |
-id | --clientId | センサーデバイスのクライアントID | Sensor-<参加者番号> |
-t | --topic | 送信先のtopic名 | sensing/data/Sensor-<参加者番号> |
センサーデバイスは、Raspberry PiのCPUロードをトピック sensing/data にPublishし続けます。
エラーが出る場合、オプションに指定したパラメータが正しいか、モノに証明書がアタッチされているか、証明書にポリシーがアタッチされているか、ポリシーの内容は適切か、再度確認して下さい。
この時点で、アラートデバイスとセンサーデバイス の2つのソフトウェアが同時に起動していることになります。
動作確認¶
AWS コンソールのAWS IoT に移動します。
メニューから [登録] をクリックし、センサーデバイスをクリックします。

メニューから、[シャドウ] をクリックし、センサーデバイスのシャドウを表示します。

"LoadSwitch": "off" の状態では、CPUロードは、数% 程度です。CPUロードを上げてみましょう。
右上の [編集] をクリックして、下記の様に書き換えて下さい。
{
"desired": {
"LoadSwitch": "on"
}
}
その後、右上の [保存] をクリックして下さい。クラウド上の "LoadSwitch" センサーデバイスのシャドウと同期し、"reported"の"LoadSwitch"が"on" になります。

Raspberry Piのリモート画面を見て下さい。
センサーデバイスが、"LoadSwitch" の状態が "on" になったことを認識し、内部でCPU負荷のかかる計算を実行します。 その結果、Raspberry PiのCPU usageが 70% 程度に上がります。 AWS IoTのsensing/data トピックにデータがinputされると、Lambdaが実行されており、Lambda関数内の処理でCPU負荷が閾値を上回るとアラートデバイスのシャドウ "Alert"を "on"に更新します。アラートデバイスが、"Alert": "on" を確認すると、アラートデバイス アプリが、“!!!!!alert!!!!!" と表示します。
続いて、AWS IoTのコンソールで、"desired"内の”LoadSwitch"を "off"にしてみて下さい。

センサーデバイスはシャドウの変更を受けて計算を終了し、その結果Lambdaがアラートデバイスのシャドウ"Alert"を"off"に更新するため、アラートデバイスの "!!!!!alert!!!!!" 表示は停止します。
これでAWS IoTを介して、センサーデバイスとアラートデバイスが連携できていることを確認しました。
アラートデバイス、センサーデバイスそれぞれのアプリケーションをCtl-Cで終了して下さい。
AWS Greengrass基本設定¶
この章からは、今まで見てきたアプリケーションをエッジで実行するため、 Greengrassの設定を行います。

Greengrassグループの作成¶
サービス一覧から [AWS Greengrass] をクリックして開きます。

AWS Greengrass の開始画面が表示されます。[今すぐ始める]をクリックします。

Greengrasクループ を作成します。[簡単な作成の使用] をクリックします。

[グループ名] に”GGHandsonGroup-<参加者番号>” と入力し、[次へ] をクリックします。
項目 | 値 |
---|---|
グループ名 | GGHandsonGroup-<参加者番号> |

[名前] に "GGHandsonGroup-<参加者番号>_Core" と出ますが、”GGC_Thing-<参加者番号>” に変更して、[次へ] をクリックします。
項目 | 値 |
---|---|
名前 | GGC_Thing-<参加者番号> |

[グループとコアの作成] をクリックすると、GreengrassグループとGreengrassコアが作成されます。

自動的に、新しいGreengrassグループが作成され、Greengrassコアデバイス用の証明書とセキュリティーポリーシーが作成されGreengrassコアにアタッチされます。
次の [コアデバイスへの接続] 画面で、Greengrassコアデバイス用の証明書とプライベートキーをPCにダウンロードして下さい。
ダウンロードした証明書とプライベートキーは、後にRaspberry Piにコピーし、Greengrassコアデバイスで使用します。(/greengrass/configuration/certs/ 下にコピーします。) また、証明書の番号は、Greengrassコアデバイス用と分かる様にノートパッドなどに記録しておいて下さい。
証明書の番号とは、ファイル名が "xxxxxxxxxx-certificate.pem.crt" の場合、冒頭の "xxxxxxxxxx" になります。
記録
Greengrass core device: GGC_Thing-01
"certPath": "xxxxxxxxxx-certificate.pem.crt",
"keyPath": "xxxxxxxxxx-private.pem.key",
Greengrass自身のダウンロードもこの画面で可能ですが、このハンズオンでは、Greengrass導入済みのRaspberry PiのSDカードを使用しますので、ダウンロードは不要です。[完了] をクリックして、Greengrassグループの作成を終了します。

Greengrassグループが作成されました。

モノ(Thing)を確認する¶
メニューから[コア]をクリックします。以下の様な画面が表示されますので、作成したGreengrassコアが表示されている事を確認します。

Greengrassコア [GGC_Thing-<参加者番号>] をクリックして下さい。Greengrassコアの詳細が表示されます。 モノのARNは、後にRaspberry Pi上のGreengrassコアの設定で必要になりますので、記録しておいて下さい。

記録
Greengrass core device: GGC_Thing-<参加者番号>
"certPath": "xxxxxxxxxx-certificate.pem.crt",
"keyPath": "xxxxxxxxxx-private.pem.key",
"thingArn": "arn:aws:iot:us-west-2:<アカウントID>:thing/GGC_Thing-<参加者番号>"
[←]をクリックして下さい。メニューから [セキュリティー] をクリックして、自動的に生成された証明書を確認します。

証明書を確認する¶
作成された証明書が表示されます。先ほど記録しておいたGreengrassコアデバイス用の証明書の番号があるか確認して下さい。また、証明書が アクティブ になっているかも確認して下さい。Greengrassコアデバイス用の証明書をクリックして下さい。

発行者、発行日、有効期限などの証明書の詳細情報が表示されます。

メニューから [ポリシー] をクリックして下さい。 自動的に生成されたポリシー [GGC_Thing-<参加者番号>-policy] が、証明書と関連付けれていることが分かります。

ポリシーの内容は、ポリシーをクリックすれば、ポリシードキュメントの内容が表示されます。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"iot:Publish",
"iot:Subscribe",
"iot:Connect",
"iot:Receive"
],
"Resource": [
"*"
]
},
{
"Effect": "Allow",
"Action": [
"iot:GetThingShadow",
"iot:UpdateThingShadow",
"iot:DeleteThingShadow"
],
"Resource": [
"*"
]
},
{
"Effect": "Allow",
"Action": [
"greengrass:*"
],
"Resource": [
"*"
]
}
]
}
モノへの接続、トピックのパブリッシュ/サブスクライブ、デバイスシャドウの操作、greengrassの操作など、AWS IoTおよび、Greengrassへの全ての操作が可能になっています。
AWS IoTメニューから [登録] > [モノ] をクリックして下さい。 自動的に生成されたGreengrassコアデバイス [GGC_Thing-<参加者番号>] が、モノとして表示されるはずです。

これで、AWS Greengrass のクラウド側の設定は、終わりです。
デバイスをGreengrassグループに追加する¶
センサーデバイス、アラートデバイスをGreengrassコアに接続するため、必要な権限の追加、Greengrass Groupへの追加を行います。

ポリシーの変更(アラートデバイス)¶
アラートデバイス(用の証明書)に付与するポリシーにGreengrassへの権限を追加します。
AWS IoTのメニューから[セキュリティー]>[ポリシー]をクリックします。 一覧が表示されますので、Alert-<参加者番号>-policyを選択して下さい。

アラートデバイス用の証明書に付与するポリシーを編集します。 [ポリシードキュメントの編集]をクリックし、下記で上書きして下さい。 既存のポリシーに、Greengrass全般の権限を追加しています。

ポリシードキュメント(変更前)
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "iot:*",
"Resource": "*"
}
]
}
ポリシードキュメント(変更後)
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "iot:*",
"Resource": "*"
},
{
"Effect": "Allow",
"Action": "greengrass:*",
"Resource": "*"
}
]
}
編集後、[新しいバージョンとして保存。]をクリックして更新します。

アラートデバイスのポリシーにGreengrassの権限が追加されました。

※ 今回のハンズオンでは簡易化のため、アラートデバイスがAWS Greengrassにおける全アクションを全リソースに対して行えるポリシーを付与しますが、実際に使用する場合は、デバイスが必要とするアクションとリソースに制限することを検討して下さい。
ポリシーの変更(センサーデバイス)¶
センサーデバイス(用の証明書)に付与するポリシーにGreengrassへの権限を追加します。
AWS IoTのメニューから[セキュリティー]>[ポリシー]をクリックします。 一覧が表示されますので、Sensor-<参加者番号>-policyを選択して下さい。

センサーデバイス用の証明書に付与するポリシーを編集します。 [ポリシードキュメントの編集]をクリックし、下記で上書きして下さい。 既存のポリシーに、Greengrass全般の権限を追加しています。

ポリシードキュメント(変更前)
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "iot:*",
"Resource": "*"
}
]
}
ポリシードキュメント(変更後)
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "iot:*",
"Resource": "*"
},
{
"Effect": "Allow",
"Action": "greengrass:*",
"Resource": "*"
}
]
}
編集後、[新しいバージョンとして保存。]をクリックして更新します。

センサーデバイスのポリシーにGreengrassの権限が追加されました。

※ 今回のハンズオンでは簡易化のため、センサーデバイスがAWS Greengrassにおける全アクションを全リソースに対して行えるポリシーを付与しますが、実際に使用する場合は、デバイスが必要とするアクションとリソースに制限することを検討して下さい。
デバイスをGreengrassグループに追加する¶
作成した、センサーデバイス、アラートデバイスをGreengrassグループに追加します。
Greengrassの設定画面に戻り、[Greengrass] > [グループ]をクリックします。 一覧が表示されますので、GGHandsonGroup-<参加者番号> を選択して下さい。

メニューから [デバイス] をクリックします。以下の様な画面が表示されますので、[デバイスの追加] をクリックします。

[IoT Thingを選択する] をクリックします。

アラートデバイス:Alert-<参加者番号> にチェックを入れ、[完了] をクリックします。

アラートデバイスが追加されました。[デバイスの追加] をクリックして、センサーデバイスも追加します。

センサーデバイス、アラートデバイスをGreengrassグループに追加されました。

ここでデバイスのシャドウの設定を行います。 AWS IoTを介して動作させた時と同様に、センサーデバイスのCPU使用率を制御するシャドウとアラートデバイスの状態を制御するシャドウを利用します。

センサーデバイスのデバイス シャドウは、クラウド上で状態を変更するため、クラウドのシャドウと同期できるよう、設定を変更します。
センサーデバイスの右の [●●●] をクリックして、[クラウドに同期] をクリックして下さい。

[クラウドへのシャドウ同期] に変更されました。

一方、アラートデバイスのデバイス シャドウは、デバイス上のLambdaで状態を変更するため、クラウドのシャドウと同期する必要はありません。
Greengrass向けLambda関数の更新とサブスクリプションの設定¶
クラウド上で動作させていたlambda関数をGreengrassコアにデプロイ、動作できるよう更新します。

AWS IoT Lambdaルールの無効化¶
クラウド上で動作させていたlambda関数を、無効化します。 AWS IoTのメニューから[ルール]をクリックします。 一覧が表示されますので、cpuUsageRule-<参加者番号>を選択して下さい。

[アクション]をクリックし、プルダウンメニューから[無効化]をクリックして下さい。

ルールが無効化されました。

Lambda関数の更新¶
Lambda関数をGreengrassコアにデプロイ、動作できるよう更新します。
サービス一覧から[Lambda] をクリックして開きます。

Lambda関数一覧が表示されます。 先ほど作成したcpuUsageChecker-<参加者番号>を選択します。

コードをインラインで編集します。 boto3の代わりにgreengrasssdkを利用するよう、修正して下さい。 このSDKは、Greengrassコアとの通信を可能にします。

コード(変更前)
import sys
import logging
import json
import boto3
# import greengrasssdk
# Setup logging to stdout
logger = logging.getLogger(__name__)
logging.basicConfig(stream=sys.stdout, level=logging.DEBUG)
client = boto3.client('iot-data')
# client = greengrasssdk.client('iot-data')
コード(変更後)
import sys
import logging
import json
# import boto3
import greengrasssdk
# Setup logging to stdout
logger = logging.getLogger(__name__)
logging.basicConfig(stream=sys.stdout, level=logging.DEBUG)
# client = boto3.client('iot-data')
client = greengrasssdk.client('iot-data')
コードを変更したら[保存]をクリックして下さい。

Lambda関数のバージョンを設定します。[アクション ▼] メニューから、[新しいバージョンを発行] をクリックします。

[バージョンの説明] に、"Handson" と入力し、[発行] をクリックします。

これで、Lambda関数の登録は、終了です。
次に、このLambda関数をGreengrassクループに追加します。
Greengrassの設定画面に戻り、[Greengrass] > [グループ]をクリックし、 一覧からGGHandsonGroup-<参加者番号> を選択して下さい。

メニューから [Lambda] をクリックします。

[Lambdaの追加] をクリックします。

[既存のLambdaの使用] をクリックします。

[cpuUsageChecker-<参加者番号>] にチェックを入れ、[次へ] をクリックします。

先ほど作成したLambda関数のバージョンにチェックを入れ、[次へ] をクリックします。

Lambda関数のバージョンが、Greengrassグループに追加されました。

シナリオ¶
今回のハンズオンでは、下記のシナリオでGreengrassの動作を確認します。 動作確認を容易化するため、センシングしたデータはエッジだけでなくクラウドにも送信します。
- ① センサーデバイスが、Raspberry PiのCPUロードを定期的にトピック"sensing/data"にPublish
- ② トピック"sensing/data"をローカルLambdaにも流す
- ③ ローカルLambdaが、CPUロードを確認し、シャドウ "Alert"を更新する
- ④ アラートデバイスは、シャドウ "Alert"がセットされると、アラートを出す
- ⑤ センサー用のシャドウ "LoadSwitch"は、クラウドとSyncする設定にしておき、クラウド側でシャドウを更新すると、センサーデバイスでRaspberry Piに負荷がかかる処理を実行する

サブスクリプションの設定¶
サブスクリプションは、ローカルデバイス、Greengrassコア、クラウド間のメッセージの送信先を定義するものです。今回のハンズオンでは、下記のサブスクリプションを設定します。
ルート | ソース | ターゲット | トピックフィルター |
---|---|---|---|
① | デバイス:Sensor-<参加者番号> | サービス:IoT Cloud | sensing/data/Sensor-<参加者番号> |
② | デバイス:Sensor-<参加者番号> | Lambda:cpuUsageChecker-<参加者番号> | sensing/data/Sensor-<参加者番号> |
③ | Lambda:cpuUsageChecker-<参加者番号> | サービス:Local Shadow Service | $aws/things/Alert-<参加者番号>/shadow/# |
④-1 | デバイス:Alert-<参加者番号> | サービス:Local Shadow Service | $aws/things/Alert-<参加者番号>/shadow/# |
④-2 | サービス:Local Shadow Service | デバイス:Alert-<参加者番号> | $aws/things/Alert-<参加者番号>/shadow/# |
⑤-1 | デバイス:Sensor-<参加者番号> | サービス:Local Shadow Service | $aws/things/Sensor-<参加者番号>/shadow/# |
⑤-2 | サービス:Local Shadow Service | デバイス:Sensor-<参加者番号> | $aws/things/Sensor-<参加者番号>/shadow/# |
このテーブルに従って、サブスクリプションの設定を行います。
Greengrassの設定画面に戻り、Greengrassグループ:GGHandsonGroup-<参加者番号> をクリックして下さい。

メニューから [サブスクリプション] をクリックします。

まずは、①のソースのセンサーデバイスを設定します。ソースの [選択] をクリックします。

[デバイス] をクリックし、Sensor-<参加者番号> をクリックします。

次に、①のターゲットの IoT Cloud を設定します。ターゲットの [選択] をクリックします。

[サービス] をクリックし、IoT Cloud をクリックします。

[次へ] をクリックします。

オプションのトピックのフィルターに sensing/data/Sensor-<参加者番号> を入力し、[次へ] をクリックします。

確認画面が出てきますので、[完了] をクリックして、設定を保存します。

上記の操作を繰り返して、残りのサブスクリプションの設定を行って下さい。
②の設定

③の設定

④-1の設定

④-2の設定

⑤-1の設定

⑤-2の設定

最終的には、下記の様になります。

トピックが長い場合、入力したフィルター全体が表示されませんが、トピックが隠れている所にマウスポインタを置くと、トピックの隠れていた部分も含めて全体が表示されます。
これで、クラウド側の設定は、終わりです。
Raspberry Piの設定¶
ダウンロード済みの証明書をRaspberry Piにコピー(Greengrassコア)¶
Greengrassコアの証明書をダウンロードしていました。 これをRaspberry Piに転送します。VNC Viewrのタイトルバーの中心にマウスを移動させると、ツールが表示されます。矢印が交差したアイコンをクリックします。

ファイル転送の画面が表示されます。 [Send files...] ボタンを押します。

ファイルの選択画面が表示されるので、全ての証明書を選択して、[Open] を押します。 (図は6つのファイル転送していますが、ここでは2つのファイルを転送します)

ファイルがRaspberry Piのデスクトップに転送されます。

設定のおさらい、
ここで、Greengrass 設定のおさらいをしてみましょう。Raspberry Piの設定のために記録した内容は、下記の様になっているはずです。この内容をテキストファイルにして、Raspberry Piに転送しておきましょう。PC側でコピーしてVNCの画面にペーストすることも出来ますが、うまくいかないこともあり、ファイルを転送することをお勧めします。(cleanupスクリプトで削除するために、拡張子は.txtとしてください。)
Greengrass core device: GGC_Thing-<参加者番号>
"certPath": "xxxxxxxxxx-certificate.pem.crt",
"keyPath": "xxxxxxxxxx-private.pem.key",
"thingArn": "arn:aws:iot:us-west-2:000000000000:thing/GGC_Thing-01"
Greengrassコアの設定ファイルは、下記になります。
- Greengrassコアの設定 /greengrass/configuration/config.json
Raspberry Pi上のファイル¶
Raspbery Piのメニューバーをクリックしてファイラーを開きます。 /home/pi以下に下記ファイルがあります。
- greengrass-linux-armv7l-1.0.0.tar.gz ARMv7版のAWS Greengrass パッケージです。 証明書を格納するパスや、設定ファイル、Greengrassコアが入っています。
下記のコマンドで解凍して Greengrassパッケージを解凍して下さい。
tar -zxf greengrass-linux-armv7l-1.0.0.tar.gz -C .
Greengrassコアの設定と起動¶
Greengrassコアの設定は、~/greengrass/configuration で行います。

Greengrassコア用の証明書をコピー¶
~/greengrass/configuration/certs にGreengrassコア用の証明書をコピーして下さい。
コピーするファイルは、デスクトップ上の下記の3つのファイルになります。
- root-ca.pem
- xxxxxxxxxx-certificate.pem.crt
- xxxxxxxxxx-private.pem.key
設定ファイルの修正¶
~/greengrass/configuration/config.json をダブルクリックします。Text Editorが開きます。

赤線の部分を書き換えて下さい。
{
"coreThing": {
"caPath": "root-ca.pem",
"certPath": "xxxxxxxxxx-certificate.pem.crt",
"keyPath": "xxxxxxxxxx-private.pem.key",
"thingArn": "arn:aws:iot:us-west-2:000000000000:thing/GGC_Thing-01",
"iotHost": "xxxxxxxxxxxx.iot.us-west-2.amazonaws.com",
"ggHost": "greengrass.iot.us-west-2.amazonaws.com"
},
"runtime": {
"cgroup": {
"useSystemd": "yes"
}
}
}
"iotHost"は、AWS IoTのエンドポイント(endpoint)です。
"ggHost"のリージョン(AWS_REGION_HERE)も、us-west-2に書き換えて下さい。"useSystemd"は、yesにして下さい。
Greengrassを起動する¶
コンソールを開き、下記を入力して、Greengrassを起動します。
cd greengrass
sudo ./greengrassd start
Greengrassが正常に起動できれば、下記が表示されます。

エラーが出る場合、~/greengrass/configuration/config.json を確認して下さい。 証明書("caPath","certPath","keyPath")に誤りがあると、greengrassdの起動に失敗します。 "thingArn","iotHost","ggHost"に誤りがあっても、起動は成功しますが、デプロイに失敗します。
Greengrassコアへのデプロイと動作確認¶
アプリケーションを実際に動かして、動作を確認します。 本ハンズオンでは、センサーデバイスはRaspberry Pi上のCPU使用率を定期的にGreengrassコアのsensing/dataにuploadし、 これをトリガーに実行されたlambda関数が、Greengrassコア上でCPU使用率を確認、閾値を超える、もしくは下回るとアラートデバイスのalertのon/offを切り替えます。
本ハンズオンでは、センサーデバイスのCPU使用率を制御するため、 センサーデバイスは、高負荷の処理を実行するswitchをシャドウとして保持します。 このswitchをonにすることで、センサーデバイスを閾値を超える高負荷状態にすることができます。 また、動作確認を容易化するため、センシングしたデータはエッジだけでなくクラウドにも送信します。

Greengrassの設定をデプロイする¶
AWS コンソールのGreengrassに戻ります。
Greengrassの設定画面に戻り、Greengrassグループ:GGHandsonGroup-<参加者番号> をクリックして下さい。

Greengrassグループの設定画面が出てきます。右上の [アクション] メニューから [デプロイ] を撰んで下さい。

初回のでデプロイ時、「デバイスによるコア検出方法の設定」画面が表示されます。[自動検出] をクリックします。

デプロイが完了すると、「 デプロイメントが正常に完了しました」と表示されます。

下記は、デプロイのGIFアニメーションです。画像をクリックするとアニメーションがスタートします。このケースでは、デプロイにおよそ30秒程度かかっています。

デプロイに失敗する場合があります。その場合は、再度、デプロイを行って下さい。

1分以上経ってもデプロイが完了しない場合、config.json 内の設定に誤りがある可能性があります。特に、"thingArn","iotHost","ggHost"を確認して下さい。コンソールを開き、~/greengrass/var/log/system/ 下のログを確認して下さい。
~/greengrass/var/log/ 下のファイルは、ユーザー "pi"ではアクセス出来ませんので、root権限でアクセスします。
sudo su -
cd /home/pi/greengrass/var/log/system
特に、下記のログファイルを確認してみて下さい。
connection_manager.log
ip_detector.log
localwatch
runtime.log
syncmanager.log
これで、デプロイは、完了しました。
動作確認¶
アラートデバイスを起動する¶
コンソールを開き、下記を入力して、アラートデバイスを起動します。 -gを指定することで、Greengrass CoreのendpointをAWS IoTに確認し、Greengrass Coreに接続します。
cd aws-iot-greengrass-handson-basic
python ./ThingShadowAlarm.py -e xxxxxxxxxxxx.iot.us-west-2.amazonaws.com -r root-ca.pem -c yyyyyyyyyy-certificate.pem.crt -k yyyyyyyyyy-private.pem.key -n Alert-<参加者番号> -id Alert-<参加者番号> -g
各実行パラメータの説明は以下になります。
short オプション | long オプション | 説明 | 値 |
---|---|---|---|
-e | --endpoint | AWS IoTのEndpoint | xxxxxxxxxxxx.iot.us-west-2.amazonaws.com |
-r | --rootCA | AWS IoTのサーバ証明書 | root-ca.pem |
-c | --cert | アラートデバイスの証明書 | yyyyyyyyyy-certificate.pem.crt |
-k | --key | アラートデバイスの秘密鍵 | yyyyyyyyyy-private.pem.key |
-n | --thingName | アラートデバイス名 | Alert-<参加者番号> |
-id | --clientId | アラートデバイスのクライアントID | Alert-<参加者番号> |
-g | --greengrass | Greengrassモードで動作 |
アラートデバイスは、デバイスシャドウ のキー Alert の更新を待ち続けます。
エラーが出る場合、オプションに指定したパラメータが正しいか、モノに証明書がアタッチされているか、証明書にポリシーがアタッチされているか、ポリシーの内容は適切か、再度確認して下さい。
センサーデバイスを起動する¶
新規にコンソールを開き、下記を入力して、アラートデバイスを起動します。 アラートデバイス同様、-gをオプションに指定します。
cd aws-iot-greengrass-handson-basic
python ./ThingShadowSensor.py -e xxxxxxxxxxxx.iot.us-west-2.amazonaws.com -r root-ca.pem -c zzzzzzzzzz-certificate.pem.crt -k zzzzzzzzzz-private.pem.key -n Sensor-<参加者番号> -id Sensor-<参加者番号> -t sensing/data/Sensor-<参加者番号> -g
各実行パラメータの説明は以下になります。
short オプション | long オプション | 説明 | 値 |
---|---|---|---|
-e | --endpoint | AWS IoTのEndpoint | xxxxxxxxxxxx.iot.us-west-2.amazonaws.com |
-r | --rootCA | AWS IoTのサーバ証明書 | root-ca.pem |
-c | --cert | センサーデバイスの証明書 | zzzzzzzzzz-certificate.pem.crt |
-k | --key | センサーデバイスの秘密鍵 | zzzzzzzzzz-private.pem.key |
-n | --thingName | センサーデバイス名 | Sensor-<参加者番号> |
-id | --clientId | センサーデバイスのクライアントID | Sensor-<参加者番号> |
-t | --topic | 送信先のtopic名 | sensing/data/Sensor-<参加者番号> |
-g | --greengrass | Greengrassモードで動作 |
センサーデバイスは、Raspberry PiのCPUロードをトピック sensing/data にPublishし続けます。
エラーが出る場合、オプションに指定したパラメータが正しいか、モノに証明書がアタッチされているか、証明書にポリシーがアタッチされているか、ポリシーの内容は適切か、再度確認して下さい。
この時点で、Greengrassコアとアラートデバイス、センサーデバイス の3つのソフトウェアが同時に起動していることになります。
動作確認¶
AWS コンソールのAWS IoT に移動します。
メニューから [登録] をクリックし、センサーデバイスをクリックします。

メニューから、[シャドウ] をクリックし、センサーデバイスのシャドウを表示します。

センサーデバイスのシャドウは、クラウドと同期する設定にしていましたので、この様に表示されます。
シャドウステータスに何も表示されない場合、サブスクリプションの設定かセンサーデバイスのクラウドに同期の設定に誤りが有る可能性があります。確認してみて下さい。
また、/home/pi/greengrass/var/log/system/router.log も確認してみて下さい。
"LoadSwitch": "off" の状態では、CPUロードは、数% 程度です。CPUロードを上げてみましょう。
右上の [編集] をクリックして、"desired"の"LoadSwitch"を"on"にして下さい。
{
"desired": {
"LoadSwitch": "on"
}
}
その後、右上の [保存] をクリックして下さい。クラウド上の "LoadSwitch" センサーデバイスのシャドウと同期し、"reported"の"LoadSwitch"が"on" になります。

Raspberry Piのリモート画面を見て下さい。
センサーデバイスが、"LoadSwitch" の状態が "on" になったことを認識し、内部でCPU負荷のかかる計算を実行します。その結果、Raspberry PiのCPU usageが 70% 程度に上がります。Greengrassのsensing/data トピックにデータがinputされると、Greengrassコア上でLambdaが実行されており、Lambda関数内の処理でCPU負荷が閾値を上回るとアラートデバイスのシャドウ "Alert"を "on"に更新します。アラートデバイスが、"Alert": "on" を確認すると、アラートデバイス アプリが、“!!!!!alert!!!!!" と表示します。
AWS IoTのコンソールで、"desired"内の”LoadSwitch"を "off"にすると、"!!!!!alert!!!!!" は停止します。

オフライン動作の確認¶
オフラインでも、Lambdaが動作し、アラートが出るか確認してみましょう。
AWS IoTのコンソールで、センサーデバイスのシャドウで ”LoadSwitch"を "off"にして、"alert!!!" を停止させて下さい。
次に、Raspberry Piのリモート画面で4つ目のコンソールをオープンして下さい。コマンドラインに下記を入力して、ディフォルトルートを削除し、インターネットとの通信を遮断します。
sudo route del default gw 192.168.1.1
ping amazon.com と入力して、インターネットとの接続が遮断されていることを確認して下さい。

インターネットとの接続は遮断されましたが、VNCでのリモートアクセスは、継続して使用できます。
オフライン動作を確認¶
インターネットとの接続が遮断されているため、"LoadSwitch" は、使えません。ローカルコマンドで、CPUロードを上げてみましょう。
4つ目のコンソール画面に下記のコマンドを入力します。
yes >> /dev/null
これで、CPUロードが 25% 程度上がります。"alert!!!"が発生するか、確認しましょう。 閾値を超えない場合は、もう一つコンソールを起動して、さらに負荷をかけて下さい。

yes >> /dev/null と入力した、コンソール画面で CTRL + C を押して、yes を停止させます。
確認が終わったら、下記のコマンドを入力して、ディフォルトルートを元に戻しておいて下さい。
sudo route add default gw 192.168.1.1
その他の設定(オプション)¶
CloudWatch Logsの設定¶
AWS IoTのログはCloudWatch Logsで取得可能です。トラブルシューティングなどに使用する事ができます。
マネージメントコンソールのAWS IoTを開き、[設定]を選択し、[更新]をクリックします。

次に[新しいロールの作成]をクリックしてください。

次に"IAM role name"欄に、"AWSIoTCloudWatch"と入力し、[新しいロールの作成]をクリックします。

再度"IAM role name"欄から、"AWSIoTCloudWatch"を選択し、[ロールの更新]をクリックします。 "ロールは正常に更新されました"と表示されるので、"ログレベル"で"情報"を選択し、[完了]をクリックします。

CloudWatchログが有効になりました。

ログを確認するには、マネージメントコンソールのサービスメニューから[CloudWatch]をクリックして開き、左側のメニューの[ログ]を選択します。ロググループ一覧に”AWSIotLogs”が表示されていることを確認し、クリックします。

ログストリーム一覧にエントリが存在することを確認します。ログストリームの名前をクリックすることで、ログを閲覧することができます。

GreengrassのCloudWatch Logsの設定¶
Greengrassの設定画面に移動し、Greengrassグループ:GGHandsonGroup-<参加者番号> をクリックして下さい。

[ローカルログ設定]の編集をクリックします。

[別のログタイプの追加] をクリックします。

[ユーザー Lambda(推薦)] と、[Greengrass システム] をチェックし、[更新] をクリックします。

最後に、[保存] をクリックします。

本書はAWS Greengrassおよび、AWSの各サービスを利用してGreengrassの基本的なシステムを構築するためのハンズオン手順 について記述しております。
前提条件¶
Raspberry Pi 3、電源アダプター、マイクロSDカード を使用 (弊社で準備致します。)
- Wi-Fiでインターネットに接続できる環境
- 企業内のWiFiは、証明書を使って接続するものが多いですが、ハンズオンキットはこれに対応していません。
- Guest WiFiの様なパスワード(WPA-PSK方式)で接続可能なWiFi環境が必要です。
- AWSアカウント
- 基本的に参加者お一人様につき、個別のAWSアカウント持って頂くことが前提です。
- 一つのアカウントでの実施も可能です。その場合。事前にIAMユーザーを作って頂くことになります。
- AWS アカウント内での IAM ユーザーの作成方法 http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_users_create.html
- PC、もしくは Mac
- WiFi接続可能なWindows PCもしくは、Macを使用します。参加者お一人に1台のマシンが必要です。
- ACコンセント
- 参加者お一人につき、ハンズオンキットとPC用にAC電源が、2口必要です。
- 対象者として以下の方を想定
- IoTを活用したアプリケーション構築をご検討されているデベロッパーの方
- AWSクラウドを活用したシステム・アプリケーション開発に従事されている方
注意事項¶
- 複数の参加者で1つのAWSアカウントを共用する場合は「参加者番号」を 01 〜 99 で定めて、各自で重複しないようにして下さい。一人で1つのAWSアカウントを利用する場合は「参加者番号」は "01" としてください。
- AWSアカウントは作成後1年間ご利用頂ける無料枠があります。本ハンズオンはその通り実施頂き、ハンズオン終了後に削除することで無料利用枠の範囲で収まるようになっております。無料枠を越えたAWSサービスのご利用料金は受講者の方にご負担いただきますよう、ご了承ください。
- 本番利用されているAWSアカウントでハンズオンを実施するのは避けて下さい。
- ハンズオンに必要な機材は貸出品となりますので、終了後は必ず返却をお願いします。