AWS IoT ハンズオン Dojo ~Greengrass~

イントロダクション

AWS IoT ハンズオン Dojo コース

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

_images/dojo_course.png

ハンズオンシナリオ

本ハンズオンではセンサーデバイスに異常が発生した場合、アラートデバイスで通知する、というユースケースを、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使用率、通知方法はコンソールへの出力とします。

クラウドを通じてデバイスを連携させる

_images/overview-iot.png

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

_images/overview-gg.png

利用するデバイス、アプリケーション、サービス

Raspberry Pi

ARMプロセッサーを搭載したシングルボードコンピュータ。 Linuxで動作し、microSDメモリーカード (microSD) を起動および長期保存用のストレージに利用します。


AWSアカウント

AWSを利用・管理するためのアカウント。アカウント作成の手順はこちらの通りです。
https://aws.amazon.com/jp/register-flow/

AWS IoT

接続されたデバイスが安全かつ簡単にクラウドアプリケーションやその他のデバイスとやりとりするためのマネージド型プラットフォームです。
https://aws.amazon.com/jp/iot/
_images/AWS_IoT.png

AWS Greengrass

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

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の設定

この章ではAWS IoTにセンサーデバイス、アラートデバイスを作成し、セキュリティーやポリシーの設定を行います。

_images/overview-iot-thing.png

AWS マネジメントコンソールにログイン

まずは、下記のURLにアクセスして、アカウントID、ユーザー名、パスワードを入力しAWSマネージメントコンソールにサインインして下さい。

https://console.aws.amazon.com/

項目
アカウント AWSのアカウントID (12桁の数字)
ユーザー名 IAMユーザー名
パスワード IAMユーザー パスワード
_images/aws-login.png

AWS IoT エンドポイント

Raspberry Pi上のGreengrassコア、センサーデバイス、アラートデバイスの設定ファイルに、AWS IoTのエンドポイントを記入する必要があります。

AWSマネージメントコンソールを開き、右上のリージョン一覧から [米国西部(オレゴン)]を選択します。

_images/regions-us@2x.png

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

_images/service-list.png

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

_images/endpoint.png

ノートパッドなどに記録しておいて下さい。

記録

AWS IoT endpoint
  "endpoint": "xxxxxxxxxxxx.iot.us-west-2.amazonaws.com"

モノ(Thing)の作成

メニューから [登録] をクリックして下さい。 まだ何も登録していない場合は下記が表示されますので[モノの登録]をクリックして下さい。

_images/iot-thing-first.png

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

_images/iot-thing-list.png

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

項目
Name Alert-<参加者番号>
_images/create-thing-Alert.png

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

_images/create-thing-Alert-2.png

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

[作成]をクリックします。

_images/iot-thing-list.png

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

項目
Name Sensor-<参加者番号>
_images/create-thing-Sensor-2.png

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

_images/create-thing-Sensor-3.png

[←]をクリックして下さい。

アラートデバイスとセンサーデバイスが作成されました。

_images/iot-thing-created.png

証明書の作成(アラートデバイス)

アラートデバイス用の証明書を作成します。

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

_images/iot-cert-first.png

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

_images/create-certificate.png

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

_images/create-certificate-one-click.png

下記の様に、"証明書が作成されました!" と表示されます。

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

_images/iot-cert-created.png

ダウンロードした証明書とプライベートキーは、後に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",

ポリシーの作成(アラートデバイス)

アラートデバイス(用の証明書)に付与するポリシーを追加します。

メニューから[セキュリティー]>[ポリシー]をクリックします。 まだ何も登録していない場合は下記が表示されますので[ポリシーの作成]をクリックして下さい。

_images/iot-policy-first.png

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

_images/iot-policy-list.png

アラートデバイス用の証明書に付与するポリシーを作成します。 下記のとおり入力し、[作成]をクリックして下さい。

アクションを選択するとリソースARNとして[arn:aws:iot:us-west-2:<アカウント番号>:topic/replaceWithATopic]が自動で記入されますが、[*]に置き換えて下さい。

項目
名前 Alert-<参加者番号>-policy
アクション iot:*
リソース ARN *
_images/iot-cert-create-policy-alert.png

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

_images/iot-cert-policy-created-alert.png

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

証明書にポリシーをアタッチする(アラートデバイス)

証明書の画面に戻ります。アラートデバイス用の証明書をクリックしてください。

_images/attach-thing-Alert.png

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

_images/iot-cert-policy-attach.png

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

_images/iot-cert-policy-attach2.png

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

_images/iot-cert-policy-attached.png

証明書にモノをアタッチする(アラートデバイス)

ポリシーが紐付けられたを証明書にモノをアタッチすることで、モノの認証と権限の設定が完了します。

続けて証明書の詳細にて、右上の [アクション] メニューから [モノをアタッチする] を撰んで下さい。

_images/attach-thing-Alert-2.png

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

_images/attach-thing-Alert-3.png

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

_images/iot-cert-thing-attached.png

センサーデバイスについても、同様の操作を行い、証明書の作成、ポリシーの作成、証明書にポリシーをアタッチ、証明書にモノをアタッチしていきます。

証明書の作成(センサーデバイス)

センサーデバイス用の証明書を作成します。

メニューから[セキュリティー]をクリックします。 一覧が表示されますので右上の[作成]をクリックして下さい。

_images/create-certificate.png

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

_images/create-certificate-one-click.png

下記の様に、"証明書が作成されました!" と表示されます。

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

_images/iot-cert-created.png

ダウンロードした証明書とプライベートキーは、後に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",

ポリシーの作成(センサーデバイス)

センサーデバイス(用の証明書)に付与するポリシーを追加します。

メニューから[セキュリティー]>[ポリシー]をクリックします。 一覧が表示されますので画面右上の[作成]をクリックして下さい。

_images/iot-policy-list.png

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

項目
名前 Sensor-<参加者番号>-policy
アクション iot:*
リソース ARN *
_images/iot-cert-policy-create-sensor.png

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

_images/iot-cert-policy-created-sensor.png

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

証明書にポリシーをアタッチする(センサーデバイス)

証明書の画面に戻ります。センサーデバイス用の証明書をクリックしてください。

_images/attach-thing-Alert.png

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

_images/iot-cert-policy-attach.png

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

_images/iot-cert-policy-attach2-sensor.png

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

_images/iot-cert-policy-attached-sensor.png

証明書にモノをアタッチする(センサーデバイス)

ポリシーが紐付けられたを証明書にモノをアタッチすることで、モノの認証と権限の設定が完了します。

続けて証明書の詳細にて、右上の [アクション] メニューから [モノをアタッチする] を撰んで下さい。

_images/attach-thing-Alert-2.png

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

_images/iot-cert-thing-attach-sensor.png

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

_images/iot-cert-thing-attached-sensor.png

これで、AWS IoTの基本設定は、終わりです。

Lambda関数の登録とAWS IoT Lambdaルールの作成

この章ではAWS IoTのTopicに入力されたデータに対するルールの設定と、そのルールをトリガーに実行されるLambda関数の設定を行います。

_images/overview-rule-lambda.png

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] をクリックして開きます。

_images/lambda.png

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

_images/lambda-2.png

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

_images/lambda-3.png

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

_images/lambda-4.png

ダウンロード済みのLambda関数パッケージ(GGhandsonLambda.zip)をアップロードします。 下記のような画面が表示されるので、必要事項を入力して下さい。

項目 設定
名前 cpuUsageChecker-<参加者番号>
説明 a Lambda func. for gghandson
ランタイム Python 2.7
コード エントリ タイプ .ZIPファイルをアップロード
関数パッケージ GGhandsonLambda.zip
ハンドラ cpuUsageChecker.message_handler
ロール カスタムロールの作成
_images/lambda-5.png

ロール:[カスタムロールの作成] を選択すると、別画面で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": [
        "*"
      ]
    }
  ]
}

_images/lambda-role.png

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

_images/lambda-6.png

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

_images/lambda-create.png

Lambda関数の作成に成功すると、下記の様な画面が表示されます。

Uploadしたzipファイルに含めたLambda関数で実行したいコードが表示されます。 本コードは入力されたデータからCPUの値を取り出し、閾値に応じてアラートデバイスのシャドウを変更する簡単なプログラムとなっています。

コード内の "thingName" が、"Alert-01" となっていますので、01 の所をご自分の参加者番号に置き換えて下さい。CPUロードが 50% を越えると、アラートを"on"にするようになっています。

修正したら、 [保存] をクリックします。

_images/lambda-save.png

これで、Lambda関数の登録は、終了です。

AWS IoT Lambdaルールの作成

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

_images/iot-rule-first.png

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

_images/iot-rule-list.png

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

項目
名前 cpuUsageRule_<参加者番号>
説明 a rule for gghandson
_images/iot-rule-create.png

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

_images/iot-rule-create-message-resource.png

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

_images/iot-rule-create-add-action.png

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

_images/iot-rule-create-choose-action.png

_images/iot-rule-create-choose-action2.png

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

_images/iot-rule-create-set-action.png

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

_images/iot-rule-create2.png

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

_images/iot-rule-created.png

Raspberry Piの設定

ハードウェアの確認

下記の3つのハードウエアを確認して下さい。

① Raspberry Pi 3

_images/RaspberryPi3.jpg

② 電源アダプタ

_images/PowerAddapter.png

③ マイクロSDカード

_images/SDCard.png

参加者番号の紙が入っています。確認して下さい。

組み立て

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

_images/SDCard-2.png

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

_images/USB-Plug-in.png

電源を投入すると、SDカードスロット右の赤LEDが点灯します。OSブートが始まり、SDカードへのアクセスがあると、、緑LEDが点滅します。

WiFi接続

お手持ちのPCをハンズオンのWiFiアクセスポイントに接続します。WiFi設定は、下記になります。

- SSID:awshandson
- パスフレーズ:awshandson

お手持ちのPCにインストールした、VNC Viewer を起動して下さい。下記の画面が表示されます。

接続先として、'raspberrypi-<参加者番号>.local'と入力して[Enter]を押します。

「一人で1つのAWSアカウントを利用する場合は「参加者番号」は "01" としてください。」 としていましたが、ここでの<参加者番号>は、SDカードに書かれた番号にして下さい・。

_images/VNC_Viewer.png

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

_images/VNC_Connect.png

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

_images/VNC_login-OK.png

警告が出ますが、無視して、[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の環境を初期化する

コンソールを表示

コンソールは、メニューバーのアイコンをクリックすると表示されます。

_images/console.png

コンソールに下記を入力し、greengrassとAWS IoT Device SDKの環境、及び証明書をクリーンアップします。

./handson_cleanup
rm ~/Desktop/*-certificate.pem.crt
rm ~/Desktop/*-private.pem.key

ダウンロード済みの証明書をRaspberry Piにコピー

センサーデバイス、アラートデバイス用に証明書を2セットダウンロードしていました。 Raspberry Piに転送、します。VNC Viewrのタイトルバーの中心にマウスを移動させると、ツールが表示されます。矢印が交差したアイコンをクリックします。

_images/file-txfer.png

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

_images/file-txfer-2.png

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

_images/file-txfer-3.png

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

_images/file-txfer-done.png

設定のおさらい、

ここで、設定のおさらいをしてみましょう。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にすることで、センサーデバイスを閾値を超える高負荷状態にすることができます。

_images/overview-iot1.png

デバイスの起動

アラートデバイスを起動する

コンソールを開き、下記を入力して、アラートデバイスを起動します。

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 に移動します。

メニューから [登録] をクリックし、センサーデバイスをクリックします。

_images/awsiot-sensor-device.png

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

_images/sensor-shadow.png

"LoadSwitch": "off" の状態では、CPUロードは、数% 程度です。CPUロードを上げてみましょう。

右上の [編集] をクリックして、下記の様に書き換えて下さい。

{
  "desired": {
    "LoadSwitch": "on"
  }
}

その後、右上の [保存] をクリックして下さい。クラウド上の "LoadSwitch" センサーデバイスのシャドウと同期し、"reported"の"LoadSwitch"が"on" になります。

_images/shadow-sync.gif

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"にしてみて下さい。

_images/shadow-load-switch-off.gif

センサーデバイスはシャドウの変更を受けて計算を終了し、その結果Lambdaがアラートデバイスのシャドウ"Alert"を"off"に更新するため、アラートデバイスの "!!!!!alert!!!!!" 表示は停止します。

これでAWS IoTを介して、センサーデバイスとアラートデバイスが連携できていることを確認しました。

アラートデバイス、センサーデバイスそれぞれのアプリケーションをCtl-Cで終了して下さい。

AWS Greengrass基本設定

この章からは、今まで見てきたアプリケーションをエッジで実行するため、 Greengrassの設定を行います。

_images/overview-gg1.png

Greengrassグループの作成

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

_images/greengrass-servicemenu.png

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

_images/greengrass-welcome.png

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

_images/geengrass-easy-creation.png

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

項目
グループ名 GGHandsonGroup-<参加者番号>
_images/greengrass-group-name.png

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

項目
名前 GGC_Thing-<参加者番号>
_images/greengrass-core-name.png

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

_images/geengrass-create-group.png

自動的に、新しい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グループの作成を終了します。

_images/geengrass-create-group-complete.png

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

_images/geengrass-group-status.png

モノ(Thing)を確認する

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

_images/greengrass-core-verify.png

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

_images/geengrass-core-ARN.png

記録

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-<参加者番号>"

[←]をクリックして下さい。メニューから [セキュリティー] をクリックして、自動的に生成された証明書を確認します。

_images/geengrass-security-check.png

証明書を確認する

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

_images/geengrass-security-check-2.png

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

_images/geengrass-security-check-3.png

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

_images/geengrass-security-check-policy.png

ポリシーの内容は、ポリシーをクリックすれば、ポリシードキュメントの内容が表示されます。

{
  "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-<参加者番号>] が、モノとして表示されるはずです。

_images/geengrass-security-check-thing.png

これで、AWS Greengrass のクラウド側の設定は、終わりです。

デバイスをGreengrassグループに追加する

センサーデバイス、アラートデバイスをGreengrassコアに接続するため、必要な権限の追加、Greengrass Groupへの追加を行います。

_images/overview-gg-thing.png

ポリシーの変更(アラートデバイス)

アラートデバイス(用の証明書)に付与するポリシーにGreengrassへの権限を追加します。

AWS IoTのメニューから[セキュリティー]>[ポリシー]をクリックします。 一覧が表示されますので、Alert-<参加者番号>-policyを選択して下さい。

_images/iot-policy-list-alert.png

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

_images/iot-policy-edit-alert.png

ポリシードキュメント(変更前)

{
  "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": "*"
    }
  ]
}

編集後、[新しいバージョンとして保存。]をクリックして更新します。

_images/iot-policy-edit-alert2.png

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

_images/iot-policy-editted-alert.png

※ 今回のハンズオンでは簡易化のため、アラートデバイスがAWS Greengrassにおける全アクションを全リソースに対して行えるポリシーを付与しますが、実際に使用する場合は、デバイスが必要とするアクションとリソースに制限することを検討して下さい。

ポリシーの変更(センサーデバイス)

センサーデバイス(用の証明書)に付与するポリシーにGreengrassへの権限を追加します。

AWS IoTのメニューから[セキュリティー]>[ポリシー]をクリックします。 一覧が表示されますので、Sensor-<参加者番号>-policyを選択して下さい。

_images/iot-policy-list-sensor.png

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

_images/iot-policy-edit-sensor.png

ポリシードキュメント(変更前)

{
  "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": "*"
    }
  ]
}

編集後、[新しいバージョンとして保存。]をクリックして更新します。

_images/iot-policy-edit-sensor2.png

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

_images/iot-policy-editted-sensor.png

※ 今回のハンズオンでは簡易化のため、センサーデバイスがAWS Greengrassにおける全アクションを全リソースに対して行えるポリシーを付与しますが、実際に使用する場合は、デバイスが必要とするアクションとリソースに制限することを検討して下さい。

デバイスをGreengrassグループに追加する

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

Greengrassの設定画面に戻り、[Greengrass] > [グループ]をクリックします。 一覧が表示されますので、GGHandsonGroup-<参加者番号> を選択して下さい。

_images/greengrass-group.png

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

_images/add-thing-to-group.png

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

_images/add-thing-to-group-2.png

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

_images/add-thing-to-group-3.png

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

_images/add-thing-to-group-4.png

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

_images/sync-thing-shadow.png

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

_images/overview-gg-shadow.png

センサーデバイスのデバイス シャドウは、クラウド上で状態を変更するため、クラウドのシャドウと同期できるよう、設定を変更します。

センサーデバイスの右の [●●●] をクリックして、[クラウドに同期] をクリックして下さい。

_images/sync-thing-shadow-2.png

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

_images/sync-thing-shadow-3.png

一方、アラートデバイスのデバイス シャドウは、デバイス上のLambdaで状態を変更するため、クラウドのシャドウと同期する必要はありません。

Greengrass向けLambda関数の更新とサブスクリプションの設定

クラウド上で動作させていたlambda関数をGreengrassコアにデプロイ、動作できるよう更新します。

_images/overview-gg2.png

AWS IoT Lambdaルールの無効化

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

_images/iot-rule-list1.png

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

_images/iot-rule-disable.png

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

_images/iot-rule-disabled.png

Lambda関数の更新

Lambda関数をGreengrassコアにデプロイ、動作できるよう更新します。

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

_images/lambda1.png

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

_images/lambda-list.png

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


_images/lambda-edit.png

コード(変更前)

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')

コードを変更したら[保存]をクリックして下さい。

_images/lambda-edit2.png

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

_images/lambda-version.png

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

_images/lambda-version-2.png

これで、Lambda関数の登録は、終了です。

次に、このLambda関数をGreengrassクループに追加します。

Greengrassの設定画面に戻り、[Greengrass] > [グループ]をクリックし、 一覧からGGHandsonGroup-<参加者番号> を選択して下さい。

_images/greengrass-group1.png

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

_images/add-lambda-to-group.png

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

_images/add-lambda-to-group-2.png

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

_images/add-lambda-to-group-3.png

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

_images/add-lambda-to-group-4.png

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

_images/add-lambda-to-group-5.png

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

_images/add-lambda-to-group-6.png

シナリオ

今回のハンズオンでは、下記のシナリオでGreengrassの動作を確認します。 動作確認を容易化するため、センシングしたデータはエッジだけでなくクラウドにも送信します。

  • ① センサーデバイスが、Raspberry PiのCPUロードを定期的にトピック"sensing/data"にPublish
  • ② トピック"sensing/data"をローカルLambdaにも流す
  • ③ ローカルLambdaが、CPUロードを確認し、シャドウ "Alert"を更新する
  • ④ アラートデバイスは、シャドウ "Alert"がセットされると、アラートを出す
  • ⑤ センサー用のシャドウ "LoadSwitch"は、クラウドとSyncする設定にしておき、クラウド側でシャドウを更新すると、センサーデバイスでRaspberry Piに負荷がかかる処理を実行する
_images/subscription-overview.png

サブスクリプションの設定

サブスクリプションは、ローカルデバイス、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-<参加者番号> をクリックして下さい。

_images/greengrass-group1.png

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

_images/subscription.png

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

_images/source-1.png

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

_images/source-1-select.png

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

_images/target-1.png

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

_images/target-1-select.png

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

_images/next.png

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

_images/topic-filter-1.png

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

_images/subscription-confirm.png

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

②の設定

_images/subscription-2.png

③の設定

_images/subscription-3.png

④-1の設定

_images/subscription-4-1.png

④-2の設定

_images/subscription-4-2.png

⑤-1の設定

_images/subscription-5-1.png

⑤-2の設定

_images/subscription-5-2.png

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

_images/subscription-result.png

トピックが長い場合、入力したフィルター全体が表示されませんが、トピックが隠れている所にマウスポインタを置くと、トピックの隠れていた部分も含めて全体が表示されます。

これで、クラウド側の設定は、終わりです。

Raspberry Piの設定

ダウンロード済みの証明書をRaspberry Piにコピー(Greengrassコア)

Greengrassコアの証明書をダウンロードしていました。 これをRaspberry Piに転送します。VNC Viewrのタイトルバーの中心にマウスを移動させると、ツールが表示されます。矢印が交差したアイコンをクリックします。

_images/file-txfer1.png

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

_images/file-txfer-21.png

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

_images/file-txfer-31.png

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

_images/file-txfer-done1.png

設定のおさらい、

ここで、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 で行います。

_images/greengrass-core-setting.png

Greengrassコア用の証明書をコピー

~/greengrass/configuration/certs にGreengrassコア用の証明書をコピーして下さい。

コピーするファイルは、デスクトップ上の下記の3つのファイルになります。

  • root-ca.pem
  • xxxxxxxxxx-certificate.pem.crt
  • xxxxxxxxxx-private.pem.key

設定ファイルの修正

~/greengrass/configuration/config.json をダブルクリックします。Text Editorが開きます。

_images/greengrass-core-text-editor.png

赤線の部分を書き換えて下さい。

{
    "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が正常に起動できれば、下記が表示されます。

_images/greengrass-start.png

エラーが出る場合、~/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にすることで、センサーデバイスを閾値を超える高負荷状態にすることができます。 また、動作確認を容易化するため、センシングしたデータはエッジだけでなくクラウドにも送信します。

_images/overview-gg-all.png

Greengrassの設定をデプロイする

AWS コンソールのGreengrassに戻ります。

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

_images/greengrass-group2.png

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

_images/deploy.png

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

_images/auto-detect.png

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

_images/deploy-completed.png

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

_images/deploy.gif

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

_images/deploy-fail.png

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 に移動します。

メニューから [登録] をクリックし、センサーデバイスをクリックします。

_images/awsiot-sensor-device1.png

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

_images/sensor-shadow1.png

センサーデバイスのシャドウは、クラウドと同期する設定にしていましたので、この様に表示されます。

シャドウステータスに何も表示されない場合、サブスクリプションの設定かセンサーデバイスのクラウドに同期の設定に誤りが有る可能性があります。確認してみて下さい。

また、/home/pi/greengrass/var/log/system/router.log も確認してみて下さい。

"LoadSwitch": "off" の状態では、CPUロードは、数% 程度です。CPUロードを上げてみましょう。

右上の [編集] をクリックして、"desired"の"LoadSwitch"を"on"にして下さい。

{
  "desired": {
    "LoadSwitch": "on"
  }
}

その後、右上の [保存] をクリックして下さい。クラウド上の "LoadSwitch" センサーデバイスのシャドウと同期し、"reported"の"LoadSwitch"が"on" になります。

_images/shadow-sync1.gif

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!!!!!" は停止します。

_images/shadow-load-switch-off1.gif

オフライン動作の確認

オフラインでも、Lambdaが動作し、アラートが出るか確認してみましょう。

AWS IoTのコンソールで、センサーデバイスのシャドウで ”LoadSwitch"を "off"にして、"alert!!!" を停止させて下さい。

次に、Raspberry Piのリモート画面で4つ目のコンソールをオープンして下さい。コマンドラインに下記を入力して、ディフォルトルートを削除し、インターネットとの通信を遮断します。

sudo route del default gw 192.168.1.1

ping amazon.com と入力して、インターネットとの接続が遮断されていることを確認して下さい。

_images/default-gw-del.png

インターネットとの接続は遮断されましたが、VNCでのリモートアクセスは、継続して使用できます。

オフライン動作を確認

インターネットとの接続が遮断されているため、"LoadSwitch" は、使えません。ローカルコマンドで、CPUロードを上げてみましょう。

4つ目のコンソール画面に下記のコマンドを入力します。

yes >> /dev/null

これで、CPUロードが 25% 程度上がります。"alert!!!"が発生するか、確認しましょう。 閾値を超えない場合は、もう一つコンソールを起動して、さらに負荷をかけて下さい。

_images/offline-alert.gif

yes >> /dev/null と入力した、コンソール画面で CTRL + C を押して、yes を停止させます。

確認が終わったら、下記のコマンドを入力して、ディフォルトルートを元に戻しておいて下さい。

sudo route add default gw 192.168.1.1

その他の設定(オプション)

CloudWatch Logsの設定

AWS IoTのログはCloudWatch Logsで取得可能です。トラブルシューティングなどに使用する事ができます。

マネージメントコンソールのAWS IoTを開き、[設定]を選択し、[更新]をクリックします。

_images/IoT-Settings.png

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

_images/create-new-role.png

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

_images/create-new-role-2.png

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

_images/IoT-Settings-Update-save.png

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

_images/CloudWatch-Logenabled.png

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

_images/CloudWatch-Log.png

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

_images/CloudWatch-Log-2.png

GreengrassのCloudWatch Logsの設定

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

_images/greengrass-group3.png

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

_images/greengrass-localwatch.png

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

_images/greengrass-localwatch-2.png

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

_images/greengrass-localwatch-3.png

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

_images/greengrass-localwatch-save.png

本書はAWS Greengrassおよび、AWSの各サービスを利用してGreengrassの基本的なシステムを構築するためのハンズオン手順 について記述しております。

前提条件

  • Raspberry Pi 3、電源アダプター、マイクロSDカード を使用 (弊社で準備致します。)

  • Wi-Fiでインターネットに接続できる環境
    • 企業内のWiFiは、証明書を使って接続するものが多いですが、ハンズオンキットはこれに対応していません。
    • Guest WiFiの様なパスワード(WPA-PSK方式)で接続可能なWiFi環境が必要です。
  • AWSアカウント
    • 基本的に参加者お一人様につき、個別のAWSアカウント持って頂くことが前提です。
    • 一つのアカウントでの実施も可能です。その場合。事前にIAMユーザーを作って頂くことになります。
  • PC、もしくは Mac
    • WiFi接続可能なWindows PCもしくは、Macを使用します。参加者お一人に1台のマシンが必要です。
  • ACコンセント
    • 参加者お一人につき、ハンズオンキットとPC用にAC電源が、2口必要です。
  • 対象者として以下の方を想定
    • IoTを活用したアプリケーション構築をご検討されているデベロッパーの方
    • AWSクラウドを活用したシステム・アプリケーション開発に従事されている方

注意事項

  • 複数の参加者で1つのAWSアカウントを共用する場合は「参加者番号」を 01 〜 99 で定めて、各自で重複しないようにして下さい。一人で1つのAWSアカウントを利用する場合は「参加者番号」は "01" としてください。
  • AWSアカウントは作成後1年間ご利用頂ける無料枠があります。本ハンズオンはその通り実施頂き、ハンズオン終了後に削除することで無料利用枠の範囲で収まるようになっております。無料枠を越えたAWSサービスのご利用料金は受講者の方にご負担いただきますよう、ご了承ください。
  • 本番利用されているAWSアカウントでハンズオンを実施するのは避けて下さい。
  • ハンズオンに必要な機材は貸出品となりますので、終了後は必ず返却をお願いします。

参考情報