Skip to the content.

ステップ4. ログデータをクラウドにアップロードする(スマートフォンとAWSサービスを用いた画像認識サービスの構築する)

当コンテンツは、エッジデバイスとしてスマートフォン、クラウドサービスとしてAWSを利用し、エッジデバイスとクラウド間とのデータ連携とAWSサービスを利用した画像認識を体験し、IoT/画像認識システムの基礎的な技術の習得を目指す方向けのハンズオン(体験学習)コンテンツ「スマートフォンとAWSサービスを用いた画像認識サービスの構築する」の一部です。

ステップ4. ログデータをクラウドにアップロードする

ステップ4アーキテクチャ図

ステップ4では、前回までのステップでWeb APIから受け取った顔画像分析結果データを、クラウドに送信し蓄積する仕組みを構築します。 データを格納することで、次のステップでデータの可視化が行えるようになります。

AWS IoT Coreで作成したトピックに対して、デバイスからHTTPアクセスで各種データを送信します。 次にIoT Coreでルールを作成します。 このルールは待ち受けているトピックで受信したデータをS3に格納するように設定します。

顔画像分析ログデータについては、各所から集められる大量のストリーミングログデータを欠損なく扱うユースケースとして、Amazon Kinesis Data Firehose経由でデータの保存を行います。

今回の手順では、先にデータの格納先を準備し、次にルールを作成、最後にデバイスからログデータを送信するプログラムを作成します。

注意:今回のIoT通信の方法について 今回のハンズオンではIoTで通常よく使われるMQTT通信ではなく、HTTP通信を利用しています。 MQTT通信を利用する場合は、端末ごとの認証や証明書の準備が必要なため、HTTP通信を利用し簡素化しています。 また、デバイス側でトピックのサブスクライブ(データ受信)は行わず、トピックへのパブリッシュ(データ送信)のみ実施しています。


目的

概要


<AWS IoT Coreとは?>

AWS IoT Coreは、インターネットに接続されたデバイスから、クラウドアプリケーションやその他のデバイスに簡単かつ安全に通信するためのフルマネージド型クラウドサービスです。 AWS IoT Core を使用すると、AWS Lambda、Amazon Kinesis、Amazon S3、Amazon SageMaker、Amazon DynamoDB、Amazon CloudWatch、AWS CloudTrail、Amazon QuickSight といった AWS の各種サービスを簡単に使用できます。 これにより、インフラストラクチャの管理をせずに、接続されたデバイスで生成されたデータを収集、処理、分析し、そのデータに基づいてアクションを起こすIoTアプリケーションを構築できます。

より詳しく知りたい場合は公式サイトをご確認ください。

<Amazon Kinesis Data Firehoseとは?>

Amazon Kinesis Data Firehoseは、数十万のデータソースから継続的に生成されるようなリアルタイムなストリーミングデータを、データストアや分析ツールにロードするためのフルマネージド型のクラウドサービスです。 フルマネージドサービスのため、データスループットに応じて自動的にスケールされ、継続的な管理は不要です。 また、ロード前にデータのバッチ処理、圧縮処理、暗号化が行われるため、送信先でのストレージ量を最小化し、セキュリティを強化できます。 Kinesis Data Firehoseでは、同じAWSリージョン内にある3つの拠点でデータが同期的に複製されるため、データ転送時の高い可用性と耐久性を確保できます。

より詳しく知りたい場合は公式サイトをご確認ください。

4-1. 顔画像分析ログデータを格納するためのS3バケットを作成

まずは、顔画像分析ログデータを格納するためのS3バケットを作成します。

4-2. Kinesis Data Firehose経由でS3バケットにログデータを格納するルールを作成

「顔画像分析ログデータ」は、Kinesis Data Firehoseを使用して60秒間に送信されてきたデータを1ファイルとして集約した状態でS3に保存します。 データを1ファイルに集約させることで、次ステップで実施するBIツールへのデータロード時間を短縮することが可能です。

今回のハンズオンでは60秒間のデータを1ファイルとしていますが、実際のプロダクションで使用する場合はなるべく大きな単位でファイル集約する方が後続での取り扱いが容易くなると思いますので、ユースケースに応じて調整してください。


<ルールとは?>

AWS IoTでは、ルールはSQLに似た構文を使用して定義されています。 SQLステートメントは3つのタイプの句で構成されます。

今回使用するクエリは「SELECT*FROM 'handson/analysisLogData'」ですので、「handson/analysisLogData」トピックのメッセージの全文にアクションを適用する意味となります。

使用出来る構文は以下をご参照ください。 https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/iot-sql-reference.html

<アクションとは?>

AWS IoTでは、ルールがトリガーされたときに行う動作を指定するためにアクションが使用されます。 アクション実行時にエラーが発生した場合は複数回の試行を行い、一定回数の試行後にメッセージを破棄し、エラーアクションが実行されます。

https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/iot-rule-actions.html


4-2-1. アクションを追加する

4-2-2. KinesisFirehoseの設定を行う

項目
Buffer size 5 MB
Buffer interval 60 secounds
S3 compression Disabled
S3 encryption Disabled

4-2-2_9

4-3. ルールの動作を確認する

ステップ4-2で作成したルールが期待通りの動作をするか、AWSのコンソールからトピックを指定しメッセージを発行(パブリッシュ)してテストしてみましょう。

{
	"Datetime": "2019-01-01 00:00:10",
	"AgeRange-Low": 20,
	"AgeRange-High": 24,
	"Gender": "Male",
	"Smile": false,
	"Eyeglasses": false,
	"Sunglasses": true,
	"Beard": false,
	"Mustache": true,
	"EyesOpen": false,
	"MouthOpen": false
}
{
	"Datetime": "2019-01-01 00:00:20",
	"AgeRange-Low": 40,
	"AgeRange-High": 45,
	"Gender": "Male",
	"Smile": true,
	"Eyeglasses": false,
	"Sunglasses": true,
	"Beard": true,
	"Mustache": true,
	"EyesOpen": true,
	"MouthOpen": false
}

【注意】 ルールの動作確認が終わったら、テストデータを削除しましょう

このステップでテストとしてパブリッシュしたデータは、ダミーデータです。 本来のデータと混ざり合ってしまうと、ステップ5での分析に影響が出ますので、必ず削除しましょう。

ステップ4-1で作成したS3バケット(例: yamada-analysis-log-data)の項目一覧から、テストで送信したデータ項目にチェックを入れ、[アクション]から[削除]を行なってください。

4-4. IoT Coreのトピックにデータをパブリッシュできる権限を作成

デバイスからIoT Coreのトピックにデータを送信するためには、そのための権限が必要です。 ステップ1-3,1-4のIAMユーザー・ポリシーの作成方法を参考にして、新たに特定トピックにデータ送信するためだけの権限を持ったIAMユーザーを作成しましょう。

4-4-1. トピックへ送信可能なポリシーの作成

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "iot:Connect",
                "iot:Publish"
            ],
            "Resource": [
                "arn:aws:iot:ap-northeast-1:*:topic/handson/*",
                "arn:aws:iot:*:*:client/*"
            ]
        }
    ]
}

上記設定内容は、IoT Coreへの接続とトピック「handson/*」への送信(パブリッシュ)のみを許可するポリシーとなります

4-4-2. トピックへ送信可能なIAMユーザーの作成

トピックへデータ送信するためのIAMユーザーを作成し、ステップ4-4-1で作成したポリシーを関連付けします。

4-5. デバイスからIoT Coreにデータをパブリッシュする

デバイス(スマホのWebアプリケーション)から顔画像分析結果ログデータをトピックに送信する処理を行います。

今回の通信方式は、IoTでよく使われているMQTT通信ではなく、AWS SDKを使ったHTTP通信で行います。 MQTT通信を使用する場合は、クラウド側で証明書を発行し、デバイス側のストレージに保管しSDKから証明書を指定させる必要があります。

AWSとMQTT通信でデータの送受信を試してみたい場合は、弊社の別のIoTハンズオン記事をお試しください。

<MQTTとは?>

MQTTはHTTPのようにヘッダサイズが大きくない為、軽量に送信することができるプロトコルです。 MQTTはパブリッシュ(Publish)・サブスクライブ(Subscribe)、そしてブローカー(Broker)という独自の概念を持ちます。 データを送信することを「パブリッシュする」、特定のトピックに届くデータを待ち受けることを「サブスクライブする」と言います。 パブリッシュする場合、トピックを指定し、ブローカー(今回はIoT Core)にメッセージを渡します。 ブローカーはトピックをサブスクライブしている(待ち受けている)Actにメッセージを受け渡します。 この受け渡しはQoSによって保証されています。

<QoSとは?>

QoSは通信の品質のことです。このQoSのレベルを指定することで、どのように通信を保証するかを決めることができます。 このレベルは3段階あり、それぞれ下記の通りです。

AWS IoT Coreでは、QoS2はサポートしていません。 QOS0あるいはQOS1を使用してください。

このようにAWS IoT Coreでは、QoS2をサポートしていないため複数回同じデータが届くことを考慮した設計にする必要があることをご留意ください。 センシティブなデータを取り扱う場合は、必ず1回しか処理されないように別途管理して制御する必要があります。

4-5-1. ログデータをIoT Coreのトピックにパブリッシュするプログラムを作成する

ログデータをIoT CoreのトピックにpublishするJavaScriptプログラムをコーディングします。 今回は、Webアプリケーションとしてプログラムは事前に準備済みですのでコードの解説のみを行います。

以下にプログラムに最低限必要な要素を挙げています。 注意点もありますのでご確認ください。

Webアプリケーションのプログラムはこちらになります。 上記プログラム内の execPublish メソッドが Publish処理を行なっている箇所となります。

作成プログラムの解説

4-5-2. デバイスからIoT Coreへの接続設定情報を登録する

デバイスからIoT Coreに接続するために必要な情報を設定します。

Webアプリケーションの設定画面からも設定可能にしていますが、スマートフォンから設定情報を打ち込むのは大変なため、設定ファイルに設定情報を記載して、再ビルド・デプロイを行います。

4-5-2-1. Cloud9画面を開く

4-5-2-2. 対象ファイルを開く

4-5-2-3. 対象ファイルを編集し保存する


※ IoT Core エンドポイントの確認方法


4-5-2-4. アプリケーションの再ビルドを行う

4-5-2-5. 静的リソースディレクトリを圧縮する

4-5-2-6. S3にファイルをアップロードする

$ aws s3 cp archive.zip s3://yamada-reko-handson-deployment/

4-5-2-7. AWS Amplifyで再デプロイを行う

4-5-3. デバイスから結果データをパブリッシュする

スマートフォンでWebアプリケーションを立ち上げて「顔画像分析」ページを開いて「Publish設定完了」が表示されていることを確認してください。 4-5-3_1

ステップ4−5−2の設定が正しく行われていれば、顔画像分析を実行した結果データをバックグラウンドで、IoT Coreの指定トピックにPublishし、S3にファイルとして保存されます。

4-5-4. データが保存されていることを確認する

顔画像分析した結果として画面に表示されているデータと同じ内容のファイルが、作成したS3バケットに格納されていたら成功です。


★データが格納されていなかった場合

ステップ4-3で使用した「テスト」の「サブスクリプション」画面にて、以下を行ってください。

データが表示されない場合