R-Car/Boards/Yocto-Gen3/AWS IoT Greengrass/v5.5.0

はじめに
このページは、 R-Car にて AWS GreenGrass を使用するための、Yocto環境の構築および実行手順を記載している.

ビルド手順

 * 1) 事前準備(パッケージのインストール)
 * gccのバージョンが古いとビルドエラーとなるため、 gcc-9/g++-9 以降のバージョンを使用すること.
 * 1) gitの設定
 * 2) ビルドスクリプトを任意のディレクトリに作成
 * ビルドスクリプトはボードにCCPFが付いている場合とついていない場合で違うため、注意すること
 * H3SK / M3SK の場合の build.sh
 * CCPF+H3SK / CCPF+M3SK の場合の build.sh
 * 1) ビルドスクリプトを実行
 * target_board_name は使用しているボードによって変える必要があるため、以下のように設定すること.
 * R-car-sk-target-board-name.png
 * 1) local.conf の修正
 * 以下を実行して、イメージに「python3-pip」のパッケージが含まれるようにコンフィグファイルを修正します.
 * 1) ビルド実行
 * イメージのビルドは、ホストシステムの性能によっては数時間かかることがある.
 * ビルドが正常に完了すると、以下のような出力が表示される.
 * 1) ビルド生成物
 * bitbake を実行して生成されたファイルは以下に格納される
 * /build/tmp/deploy/images//
 * 1) イメージを SD カードに書き込む
 * SDカードにイメージを書き込む方法は、Loading kernel and rootfs via eMMC/SD cardを参照.
 * 上記の例はイメージが"weston"のため、"minimal"に置き換えることに注意すること
 * イメージのビルドは、ホストシステムの性能によっては数時間かかることがある.
 * ビルドが正常に完了すると、以下のような出力が表示される.
 * 1) ビルド生成物
 * bitbake を実行して生成されたファイルは以下に格納される
 * /build/tmp/deploy/images//
 * 1) イメージを SD カードに書き込む
 * SDカードにイメージを書き込む方法は、Loading kernel and rootfs via eMMC/SD cardを参照.
 * 上記の例はイメージが"weston"のため、"minimal"に置き換えることに注意すること
 * SDカードにイメージを書き込む方法は、Loading kernel and rootfs via eMMC/SD cardを参照.
 * 上記の例はイメージが"weston"のため、"minimal"に置き換えることに注意すること

ターゲットボード Greengrass Core の起動確認

 * 1) R-Car SK の起動
 * R-Car SK に uSD カードを挿入して、LANケーブルを接続する.
 * USB デバッグシリアルケーブルを PC と接続して、AC 電源を投入する.
 * PC 側では、ターミナルソフトを起動して、シリアル接続を行う.
 * 電源 ON は POWER SW(SW8) を押下する.
 * 1) SD ブートを U-Boot で設定
 * SDブートの設定方法は、Configure U-Boot to boot from SD cardを参照.
 * 1) Greengrass Core の起動確認
 * Greengrass Core が Active となっていることを確認する.
 * Aws-status.png
 * Aws-status.png

AWS IoT Greengrass の設定/動作確認
以降の章では、以下のようなルールでタイトルにタグを記載する.
 * ターゲットボード(R-Car SK)での作業は、<端末>と記載する.
 * AWS クラウドの作業は、と記載する.
 * ビルドPCでの作業は、<ビルドPC>と記載する.
 * 1)  AWSアカウントを作成
 * https://console.aws.amazon.com/console/home
 * AWS のアカウントを作成して、AWS マネジメントコンソールにルートユーザでログインする.
 * 1)  IAM ユーザの作成
 * 下記を参考に作業用のIAM ユーザを作成する.
 * https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_users_create.html#id_users_create_console
 * 作成時に以下のポリシーをアタッチしておくこと.
 * AWSLambda_FullAccess
 * IAMFullAccess
 * AWSIoTFullAccess
 * AWSGreengrassFullAccess
 * IAMAccessAnalyzerFullAccess
 * ユーザアクセス時に表示される、「アクセスキーID」、「シークレットアクセスキー」、「パスワード」を必ずメモすること. なお、シークレットアクセスキーとパスワードは、このタイミングでしか確認できないため、注意すること.
 * これら3点は、セキュリティ上、非常に重要な情報であるため、管理に十分注意すること. 
 * AWS のルートユーザをサインアウトして、作成した IAM ユーザでログインする.
 * https://console.aws.amazon.com/console/home
 * 1)  リージョンの設定
 * 画面右上から「アジアパシフィック (東京)　ap-northeast-1」を設定する.
 * Aws-region.png
 * 1) <端末> IoT Core デバイスの作成
 * 事前に「ターゲットボード Greengrass Core の起動確認」を行い、端末はLANケーブルを接続してインターネットに接続できることを確認しておくこと.
 * 1)  AWS のサービスから「IoT Core」を選択する.
 * Aws-iot-core.png
 * 1)  左側面の領域から「Greengrass」→「使用を開始する」を選択する.
 * 2)  「1つの Core デバイスをセットアップ」を押下する.
 * 3) <端末> 画面の指示に従い以下の作業を実施する.
 * 4)  「ステップ 1: Greengrass コアデバイスを登録する」
 * 任意の名称を入力する.
 * 本手順では、コアデバイス名を "R-CarH3SKDevice" とする.
 * 1)  「ステップ 2: モノのグループに追加して継続的なデプロイを適用する」
 * 「新しいグループ名を入力」をチェックして、任意の名称を入力する.
 * 本手順では、モノのグループ名を "R-CarH3SKDeviceGroup"とする.
 * 1) <端末> 「ステップ 3: Greengrass コアソフトウェアをインストール」
 * 2) 「ステップ 3.1: Java をデバイスにインストールする」
 * R-Car SK のビルドで生成したイメージに含まれているため、作業不要.
 * 1) 「ステップ 3.2: デバイスで AWS 認証情報を設定する」
 * 以下のコマンドを実行し、 AWS へアクセスする情報を環境変数として設定する.
 * 1) 「ステップ 3.3: インストーラを実行する」
 * 「インストーラのダウンロード」は作業不要.
 * 「インストーラの実行」は、Web ブラウザに表示されているものでは、Path が合わないため、端末にて、以下のコマンドを実行する.
 * 「R-CarH3SKDevice」と「R-CarH3SKDeviceGroup」部分は「ステップ 1」と「ステップ 2」で設定した値に置き替えること.
 * 上記コマンドを実行すると、R-Car SK 端末が AWS IoT と通信して Greengrass コアデバイスとして登録される.
 * コマンドが終了して、しばらくすると Greengrass CLI が端末へデプロイされるため、以下のコマンドが実行できるか確認する.
 * デプロイの状況は、以下のログで確認できる.
 * 1)  IoT Core に送信するポリシーを追加
 * 端末で動作する Lambda 関数が AWS クラウドの IoT Core に対して メッセージを Publish するためにポリシーを追加する.
 * 1) AWS のサービスから「IAM」を選択する.
 * 2) サイドメニューから「ポリシー」を選択する.
 * 3) 「ポリシーを作成」を選択する.
 * 4) サービスに「IoT」を選択、アクションに「Publish」を選択、リソースに「すべてのリソース」を選択する.
 * Aws-iot-core-policy.png
 * 1) 「次のステップ：タグ」、「次のステップ：確認」を押下していき、ポリシーの確認で任意の「名前」を入力し、「ポリシーの作成」ボタンを押下する.
 * 本手順では、名前を「R-CarH3SKDevice-IoT-Publish」とする.
 * 1) IAM の画面に戻るので、サイドメニューから「ロール」を選択する.
 * 2) 検索に「GreengrassV2TokenExchangeRole」を入力して、同名のロールを選択する.
 * 3) 「ポリシーをアタッチします」を押下して、先ほど作成したポリシーを検索して「ポリシーのアタッチ」を押下する.
 * 4) <端末> Lambda 関数の実行環境準備
 * 端末でサンプルプログラムを動作させるための環境構築を行う.
 * 以下のコマンドを実行する.
 * 1) <Web><ビルドPC> Lambda 関数の作成
 * 端末へデプロイする Lambda 関数を作成する.
 * 1) <ビルドPC> 以下のコマンドを実行して、Lambda 関数のひな形を作成する.
 * 2) <ビルドPC> 作成した lambda_function.py に以下のコードをコピペする.
 * 上記コードの以下の部分は、自身のエンドポイントに置き替える必要がある.
 * https://xxxxxxxxxxxxxxx-ats.iot.ap-northeast-1.amazonaws.com
 * エンドポイントは、以下から確認できる.
 * 1) <Web> AWS のサービスから「IoT Core」を選択する.
 * 2) <Web> サイドメニューから「設定」を選択する.
 * 3) <Web> デバイスデータエンドポイントの「エンドポイント」を参照する.
 * 4) <ビルドPC> パッケージの zip 化
 * 作成した lambda_function.py と boto3 パッケージを zip 圧縮する.
 * 圧縮した zip ファイルは、クラウドへアップロードするため、AWS クラウドへアクセスしているPCにコピーする.
 * 1) <Web> Lambda 関数の登録
 * 作成した Lambda 関数を AWS クラウドへ登録する.
 * 1) AWS のサービスから「Lambda」を選択する.
 * 2) サイドメニューから「関数」を選択する.
 * 3) 「関数の作成」を選択する.
 * Aws-lambda-function-create-1.png
 * 1) 「一から作成」にチェックを付ける.
 * 2) 「関数名」に任意の名称を付ける. 本手順では「DummyTemperatureSensor」とする.
 * 3) 「ランタイム」に Python3.8 を選択する.
 * 4) 「アーキテクチャ」に arm64 を選択する.
 * 5) それ以外は、デフォルト値で「関数の作成」を押下する.
 * 6) 画面が切り替わったら「コードソース」の右側から、「アップロード元」→「.zip ファイル」を選択し、作成した zip ファイルをアップロード→保存する.
 * 7) 右上の「アクション」→「新しいバーションを発行」を選択し、発行を押下する.
 * 8) <Web> Lambda 関数のデプロイ
 * 登録した Lambda 関数を端末へデプロイする.
 * 1) AWS のサービスから「IoT Core」を選択する.
 * 2) サイドメニューから「Greengrass」→「コンポーネント」を選択する.
 * 3) 「コンポーネントを作成」を押下する.
 * Aws-lambda-function-deploy-1.png
 * 1) 「Lambda 関数をインポートする」にチェックを入れる.
 * 2) 「Lambda 関数」に作成した、関数を選択する.
 * Aws-lambda-function-deploy-2.png
 * 1) イベントソースの「トピック」に「topic/sensor/get」を入力する.
 * 2) イベントソースの「タイプ」に「AWS IoT Core MQTT」を選択する.
 * Aws-lambda-function-deploy-3.png
 * 1) コンテナパラメータの「メモリサイズ」を「64」MB とする.
 * Aws-lambda-function-deploy-4.png
 * 1) それ以外は、デフォルト値のまま「コンポーネントを作成」を押下する.
 * 2) 画面が切り替わったら、右上の「デプロイ」を押下する.
 * 3) デプロイ先に作成したグループを選択して「次へ」を押下する.
 * 4) あとは、デフォルト値のまま「次へ」を押下していき、最後の確認画面でデプロイを押下する.
 * 5) <WEB> <端末> 動作確認
 * 端末側に作成した関数がデプロイされることを確認する.
 * また、端末側のログを確認して、AWS IoT → 端末へメッセージが受信できているかを確認する.
 * 1) <端末> R-Car SK の動作確認
 * 2) Lambda 関数がデプロイされているか確認する.
 * 以下のコマンドを実行して確認する.
 * 実行すると以下のようなログが出力され、デプロイした関数(DummyTemperatureSensor)が、リストに表示されたことが確認できる.
 * 1) ログを確認する.
 * 以下のコマンドを実行してログを確認する.
 * 以下のようなログが出力されていることを確認する.
 * 1) <Web><端末> AWS クラウドの動作確認
 * 2) <Web> AWS のサービスから「IoT Core」を選択する.
 * 3) <Web> サイドメニューから「テスト」→「MQTT テストクライアント」を選択する.
 * 4) <Web> 「トピックをサブスクライブする」で「topic/sensor/temperature」を入力して「サブスクライブ」を押下する.
 * 5) <Web> 「トピックに公開する」で「topic/sensor/get」を入力して「発行」を押下する.
 * デフォルトのメッセージペイロードだと、端末側で文字化けするため、必要に応じて任意の英数字の文章へ変更すること.
 * 1) <端末> 以下のようにログにメッセージ受信内容が表示される.
 * 2) <Web> サブスクリプションにメッセージが受信される.
 * Aws-result1.png
 * 以下のようなログが出力されていることを確認する.
 * 1) <Web><端末> AWS クラウドの動作確認
 * 2) <Web> AWS のサービスから「IoT Core」を選択する.
 * 3) <Web> サイドメニューから「テスト」→「MQTT テストクライアント」を選択する.
 * 4) <Web> 「トピックをサブスクライブする」で「topic/sensor/temperature」を入力して「サブスクライブ」を押下する.
 * 5) <Web> 「トピックに公開する」で「topic/sensor/get」を入力して「発行」を押下する.
 * デフォルトのメッセージペイロードだと、端末側で文字化けするため、必要に応じて任意の英数字の文章へ変更すること.
 * 1) <端末> 以下のようにログにメッセージ受信内容が表示される.
 * 2) <Web> サブスクリプションにメッセージが受信される.
 * Aws-result1.png
 * 1) <Web> サブスクリプションにメッセージが受信される.
 * Aws-result1.png
 * Aws-result1.png