【作業】ステップ 2-1: クラウド連携 / SORACOM Funnel + AWS IoT Core 編
本格的なデータ収集 IoT システムの構築としてクラウド連携を学びます。
ここでは AWS IoT Core を活用した構成です。
今回は Wio LTE からのデータを 「クラウド・アダプタ サービス」 SORACOM Funnel で中継し、AWS IoT Core に送ります。 ※ AWS 以降の環境は運営側で準備済みです。
AWS IoT Core に送信したデータは、最初は catch_all/
というトピック(メールボックスのようなものです)に送信します。トピックのデータ着信をトリガーに awsiotcore-post_to_slack-max_catch_all
という AWS Lambda 関数が起動します。
この AWS Lambda 関数は #max_catch_all
という、テスト用に用意した Slack チャンネルと、一覧で見やすくしている Ruby 製 Web アプリに送られるようになっており、 Wio LTE のデータは最終的に Slack もしくは Ruby 製 Web アプリで確認できます。
また、後半では SORACOM Funnel の設定を変更して AWS IoT Core に送信するトピックを filter/#
に変更します。AWS IoT Core 上でデータの判定を行ったうえで、条件に一致した時のみ AWS Lambda 関数 awsiotcore-post_to_slack-max_filter
の起動するようにしています。
利用するサービスの解説
AWS IoT Core とは
IoT デバイス向けのメッセージ処理基盤です。
フルマネージド・サービスであり、構築や運用の手間は AWS がすべて行ってくれます。
1 台のデバイスから利用することができ、また、万を超えるデバイスからのメッセージを受け付けることができます。課金も完全従量制になっています。
またルールに応じて AWS の各サービスに接続できます。
AWS Lambda とは
Python や Node.js で書かれたプログラムコードを保存しておくと、特定の条件(トリガー)でプログラムを実行してくれる仕組みです。
例えば Amazon S3 にオブジェクトが作られた時や、 CloudWatch のイベントに連動させることが可能であり、 AWS IoT Core にも対応しています。
フルマネージド・サービスであり、プログラムを実行するための環境構築や運用の手間は AWS がすべて行ってくれます。
最初に. Wio LTE の電源を OFF にする
ここから作業になります
Wio LTE の microUSB ケーブルを抜き、電源を OFF にしてください
※いきなり抜いてOKです。また、すでに OFF になっている場合は次に進んでください
1. SORACOM へ認証情報を保管する
1-1. SORACOM ユーザーコンソール で [右上のユーザー名] > [セキュリティ] をクリック
1-2. [認証情報ストア] > [認証情報を登録] をクリック
1-3. 認証情報を登録する画面では下記の通り入力して [保存] をクリック
- 認証情報 ID: 進捗表から入手 (cred-name1)
- 概要:
AWS IoT Core DataAccess
- 種別: AWS 認証情報 (これを選択すると、下記を入力するテキストボックスが増えます)
- AWS Access Key ID: 進捗表から入手 (aws-accesskey-id)
- AWS Secret Access Key ID: 進捗表から入手 (aws-secret-accesskey-id)
※進捗表から入手する情報は、本来ご自身でご用意いただくことになります。実際の準備方法は AWS IoT Core の準備 をご覧ください
2. SORACOM Funnel の設定をする
2-1. SORACOM ユーザーコンソールで 左上 [Menu] > [SIM 管理] をクリック
※ 画面が切り替わらない場合は、左上の SORACOM ロゴをクリックしてください。
2-2. SIM 管理画面で、先ほど作成した SIM グループ名をクリック
2-3. SIM グループ設定画面で [SORACOM Funnel 設定] をクリック
2-4. SORACOM Funnel の設定でスイッチを “ON” にしてから下記の通り入力して [保存] をクリック
- 転送先サービス: AWS IoT (これを選択すると、下記を入力するテキストボックスが増えます)
- 転送先URL: 進捗表から入手 (endpoint-url)
- 認証情報: (先ほど作成した認証情報 進捗表の cred-name1 を選ぶ)
- 送信データ形式: JSON
以上で SORACOM ユーザーコンソール上での作業は終了です。
3. スケッチの確認と Wio LTE の電源を ON にして通常モードで動かす
Wio LTE に電源を入れ、動かしてください。
この時、Wio LTE には 1-3 で作成されたスケッチが書き込まれている必要があります。そうでなければ 1-3 を参考に、スケッチを再度書き込んでください。
4. 確認
AWS IoT Core 上でのデータ着信は、運営側で行います。受講者番号を運営にお伝えください。
※ 標準では送信間隔が60秒です。早めたい場合は 1-2 のやってみようを参考に、 INTERVAL
を例えば 5000
(= 5秒) に変更して、Wio LTE に書込んでみてください。
※ うまく動かなかったら(トラブルシュート)
まず SORACOM Harvest を確認してみてください。
SORACOM Harvest にデータが表示されている: データ送信自体は成功しています。 SORACOM Funnel の設定不備の可能性があるため、以下のトラブルシュートを確認してください。
SORACOM Harvest でデータが確認できない: Wio LTE の接続を確認してください。
また、 SORACOM Harvest 以外にトラブルシュートで利用可能なツールは「Arduino IDE のシリアルモニター」「SORACOM ユーザーコンソール上の SIM のログ」です。
データは送られているが AWS IoT Core 上で確認できない
- 原因: SORACOM Funnel が ON なグループに SIM が所属していない
- 対策: SIM を SIM グループへ所属させるようにしてください
5. 送信先を変更し、クラウド上での条件付けを行う
温度が 28℃ を超えたら Slack にデータが送信されるようにしてみます。
5-1. 「4 確認」 まで終了していることを確認する
5-2. SORACOM Funnel 設定
5-2-1. 先ほど設定した SORACOM Funnel のグループを開きます
5-2-2. SORACOM Funnel の設定を下記の通りに入力(変更)し、保存してください
- 転送先 URL: 進捗表から入手 (filter-endpoint-url)
5-3. 確認
温湿度センサーに息を吹きかける等で温度が 28℃を超えるようにしてください。
AWS IoT Core 上でのデータ着信は、運営側で行います。受講者番号を運営にお伝えください。
以上で本章は終了です
達成状況を運営表へご記入ください。
AWS IoT Core の準備
ここからは本日使用した AWS IoT Core の環境を自分で作りたい場合の手順です。
SORACOM Funnel を利用する際の AWS IoT Core の設定
SORACOM Funnel から AWS IoT Core を利用するための準備は AWS IAM の設定 (専用の仮想ユーザーの作成) で完了します。
AWS IoT Core 上でモノやポリシーの他、X.509 証明書 の作成/設定は不要です。
AWS セットアップ内容
- IAM
- IAM で専用ユーザ作成 (e.g.
awsiot-dataaccess-for-handson
) - awsiot-dataaccess-for-handson の Access Key ID 発行
- awsiot-dataaccess-for-handson へ AWSIoTDataAccess ポリシー割り当て
- IAM で専用ユーザ作成 (e.g.
上記の設定を aws-cli で行う場合の手順
## 環境構築
$ aws iam create-user --user-name awsiotcore-dataaccess-for-funnel-handson
$ aws iam attach-user-policy --policy-arn arn:aws:iam::aws:policy/AWSIoTDataAccess --user-name awsiotcore-dataaccess-for-funnel-handson
$ aws iam create-access-key --user-name awsiotcore-dataaccess-for-funnel-handson
## 環境終了
$ aws iam list-access-keys --user-name awsiotcore-dataaccess-for-funnel-handson
$ aws iam delete-access-key --user-name awsiotcore-dataaccess-for-funnel-handson --access-key-id $OLD_ACCESS_KEY_ID
$ aws iam detach-user-policy --policy-arn arn:aws:iam::aws:policy/AWSIoTDataAccess --user-name awsiotcore-dataaccess-for-funnel-handson
$ aws iam delete-user --user-name awsiotcore-dataaccess-for-funnel-handson
AWS IoT Core 上のルールについて
AWS IoT Core のルールは 2 つ設定されています。
1つ目は監視対象のトピックに着信したメッセージは全て指定されたアクション (Lambda 関数の実行) をするようにしています。
- 監視対象:
catch_all/#
(#
はワイルドカード) - 条件: (なし = 全てのデータでアクションを実行)
- アクション:
awsiotcore-post_to_slack-max_catch_all
Lambda 関数を実行する
2つめは監視対象のトピックに着信したメッセージが条件に一致した時に、アクションが実行されるようになっています。
- 監視対象:
filter/#
(#
はワイルドカード) - 条件:
payloads.temp
が28
を上回る時 (JSON のオブジェクト指定形式で宣言可能) - アクション:
awsiotcore-post_to_slack-max_filter
Lambda 関数を実行する
awsiotcore-post_to_slack-max_* Lambda 関数について
基になる Lambda 関数は post_to_slack_on_aws-lambda.py で公開しています。
この関数一つで SLACK_CHANNEL
に基づき Slack チャンネルに送信できるようになっています。
重要な部分は以下の通りです。この Lambda 関数は AWS IoT Core のルールから、メッセージが着信した毎に実行されます。
def lambda_handler(event, context):
slack_message = {
'channel': SLACK_CHANNEL,
'text': str(event['payloads'])
}
req = Request(HOOK_URL, json.dumps(slack_message))
event
に AWS IoT Core (= SORACOM Funnel) から渡されたデータが入った状態で実行されますRequest
を利用してHOOK_URL
へ HTTP POST しますSLACK_CHANNEL
で指定された Slack チャンネルに送信します
Unified Endpoint について
本ハンズオンでは Unified Endpoint という機能を使い、 SORACOM Harvest と SORACOM Funnel へ 同時に データを送信しています。使い方としては unified.soracom.io
にデータを送信するだけで、SORACOM Beam/Funnel/Harvest へのデータ送信が制御できるようになります。
従来は SORACOM Harvest への送信は harvest.soracom.io
、そして SORACOM Funnel への送信は funnel.soracom.io
と、デバイス上での送信先切り替えが必要でしたが、Unified Endpoint により SORACOM プラットフォーム上で変更できるようになりました。
詳細はブログをご覧ください。