はじめに
AWSサービス上で地図画像を作成できるようにしたので、次は地図画像に乗せるデータをAWSサービスに取り込みたい。
…ということで、SORACOMのGPSマルチユニットで取得した気温データをAWSサービス上に取り込むことにする。
構成
SORACOM Funnelサービスを利用し、GPSマルチユニットの情報をIoTCore経由でTimestreamに送信する。
使用するデータベースはDynamoDBとTimestreamで迷ったのだが、まだ使ったことのないサービスを使いたいという単純な理由でTimestreamを選択。

手順
1.GPSマルチユニットがデータを取得・送信していることの確認
2.Timestreamデータベースの作成
3.Funnelを利用するための準備
4.Funnelのセットアップ
5.IoTCoreの設定
手順1.GPSマルチユニットがデータを取得・送信していることの確認
まずGPSマルチユニットのデータがSORACOMのサービスまで到達していなければ元も子もないので、SORACOMのユーザコンソールでデータが届いていることを確認する。
ついでにデータの内容も確認して、Timestreamにどのデータを登録するかを検討しておく。
・SORACOMユーザコンソールで、左上のメニューマークをクリック

・GPSマルチユニット一覧画面で、データの確認をしたいマルチユニットを選択して「SORACOM Harvest Data」をクリック。

・Harvest Dataの画面にデータが表示されることを確認する。

・GPSマルチユニットから送信されるデータの種類の確認
Harvest Dataで、GPSマルチユニットから送信されているデータの種類を確認しておく。
公式ガイドの「送信されるデータフォーマット」を参照しつつ確認すると、下記データが安定して取れている様子。
| プロパティ | 内容 |
|---|---|
| lat | 緯度 |
| lon | 経度 |
| bat | 電池残量 |
| rs | 電波強度 |
| temp | 温度 |
| humi | 湿度 |
| type | 送信種別 |
加速度が取得できていないのは、移動していないので仕方ない(今回は必要ないし)。
取れているデータのうち、今回は地図上に温度データを表現したいので、緯度・経度・温度(ついでに湿度も取っておこう)が必要になる。
手順2.Timestreamデータベースの作成
次はAWSのマネジメントコンソールでTimestreamデータベースを作成する。
・Timestreamの画面で、「データベースを作成」をクリック。
・「標準データベース」を選択してデータベースの名前を入力して「データベースの作成」をクリック。
※暗号化キーは自動的に作られる。作成後、KMSコンソールでAWSマネージド型キー一覧を確認すると、aws/timestreamが作成されている。

・データベース一覧画面で、作成されたデータベース名をクリック。

・データベースの概要画面で、「テーブル」>「テーブルを作成」をクリック。

・それぞれ設定を入力して「テーブルを作成」をクリック。

今回設定した値は以下。(テーブル名は任意なので省略)
マグネティックストレージの書き込みをONにすると、保持期間より過去のデータも書き込めるとのことだが、今回は必要ないのでOFFで作成する。
| 項目 | 設定値 |
|---|---|
| メモリストアの保持期間 | 12時間 |
| マグネティックストアの保持期間 | 1月 |
| マグネティックストレージの書き込み | チェックなし |
手順3.Funnelを利用するための準備
・事前にSORACOMユーザコンソールで、Funnelを利用するIoT SIMのカバレッジタイプを確認する。
SORACOMユーザコンソールの上部に「日本」とあれば日本カバレッジ、「グローバル」とあればグローバルカバレッジとなる。

・IoTCoreへのメッセージをPublishするためのIAMロールを作成する。
AWSマネジメントコンソールでIAMのロール一覧画面へ移動し、「ロールを作成」をクリック。

・信頼されたエンティティタイプに「AWSアカウント」を選択、AWSアカウントは「別のAWSアカウント」を選択し、先に確認したカバレッジタイプが日本であればアカウントID欄に「762707677580」、グローバルであれば「950858143650」を入力する。

・画面下部の「外部IDを要求する」にチェックを入れ、外部ID欄に任意の文字列を入力して「次へ」をクリック。
※ここで入力した外部IDは、これ以降、[External-ID] で表記する。

・許可を追加画面が表示されるので、「ポリシーを作成」をクリック。

・ポリシーの作成画面のビジュアルエディタで、サービスにIoTを選択し、フィルタアクションに「Publish」と入力して"Publish"にチェックを入れる。

・「リソース」>「指定」を選択し、「ARNの追加」をクリック。

・ARNの追加画面が開くので、Region、Account、Topic nameを入力する。
ここではRegion:「すべて」にチェック、Account:自分のアカウントID、Topic name:"topic-pyGMT/*"を入力した。
※ここで入力したトピック名(この例では"topic-pyGMT")を、以降、[topic_name] として表現する。

・「追加」をクリックしてポリシーの作成画面に戻り、「次のステップ:タグ」>「次のステップ:確認」の順にクリック。
・ポリシーの確認画面でポリシーの名前を入力し、「ポリシーの作成」をクリック。

・ポリシー画面を閉じて、許可を追加画面に戻る。
・更新ボタンをクリックしてポリシー一覧を更新し、先ほど作成したポリシーの名前で検索する。

・検索で表示されたポリシーにチェックを入れ、「次へ」をクリック。

・任意のロール名を入力し、「ロールを作成」をクリック。
ロール一覧画面に戻るので、作成したロール名で検索し、作成されたロールのARNを確認・メモしておく。
※以降、このロールARNを [role_arn] で表記する。

・AWS IoTのコンソールに移動して、左メニューの「設定」をクリック。

・デバイスデータのエンドポイントの「エンドポイント」をメモする。
※ここでメモしたエンドポイントは、これ以降、[device_endpoint] で表記する。

手順4.Funnelのセットアップ
・SORACOMユーザコンソールで、画面右上のメールアドレス欄をクリック。

・SAMユーザー一覧画面が表示されるので、左メニューの「認証情報ストア」を選択し、認証情報一覧画面の「認証情報を登録」をクリック。
・認証情報を登録画面で、以下の情報を入力する。
| 項目 | 設定値 |
|---|---|
| 認証情報ID | 任意の文字列を入力 |
| 種別 | 「AWS IAM ロール認証情報」を選択 |
| ロールARN | [role_arn]を入力 |
| 外部ID | [External-ID]を入力 |
・Funnelを有効化する。
SORACOMユーザコンソールの画面左上のメニューボタンをクリックし、表示されたメニューの「SIMグループ」を選択する。

・SIMグループ一覧画面で該当のSIMグループを選択し、「SORACOM Funnel 設定」をクリックする。
※該当のSIMグループがない場合は公式のグループ設定を参照。

・表示されたスイッチをクリックしてONにする。
・各項目を設定し、「保存」をクリック。
TimestreamにSIM IDを登録させるため、「SIM IDを追加」はONにする。
| 項目 | 設定値 |
|---|---|
| 転送先サービス | 「AWS IoT」を選択 |
| 転送先 URL | 「[device_endpoint]/[topic_name]/#{imsi}」を入力 |
| 認証情報 | 先の手順で登録した認証情報を選択 |
| 送信データ形式 | 「JSON」を選択 |
| SIM ID を追加 | ON |
・AWS側へデータが連携されることを確認する。
AWSマネジメントコンソールのAWS IoT画面へ移動し、左メニューから「MQTTテストクライアント」を選択する。

・「トピックのフィルター」欄に「[topic_name]/#」と入力し(今回の例では"topic-pyGMT/#"となる)、「サブスクライブ」をクリック。

・SORACOM側からデータが送信されるまでしばらく待つ。サブスクリプション欄に送られてきたデータが表示されればFunnelの設定はOK。
手順5.IoTCoreの設定
・マネジメントコンソールのAWS IoT画面の左メニューで「ルール」を選択し、表示されたルール一覧画面で「ルールの作成」をクリック。

・ルール作成画面が開く。ルール名は任意のものを入力し、「次へ」をクリック。

・SQLステートメントに、緯度・経度・温度・湿度を取得するクエリを入力して「次へ」をクリック。
SELECT payloads.lat, payloads.lon, payloads.temp, payloads.humi FROM '[topic_name]/#'
・ルールアクションをアタッチ画面で、ルールアクションに「Timestream table」を選択し、作成しておいたTimestreamデータベース名、テーブル名を選択する。

・ディメンション欄には以下のように入力する。
また、「新しいロールを作成」をクリックして、作成するロール名を入力する。
| ディメンション名 | ディメンション値 |
|---|---|
| timestamp | ${timestamp} |
| simId | ${simId} |
・ここまで設定したら「次へ」をクリックし、確認画面で「作成」をクリック。
・AWSマネジメントコンソールでTimestreamの画面へ移動し、左メニューで「クエリエディタ」を選択。

・テーブルに対して全件検索をかける。
SELECT * FROM "[データベース名]"."[テーブル名]"
参考リンク
(SORACOM公式ドキュメント)AWS IoT アダプターを使用する
AWS IoTをつかってSORACOM GPSマルチユニットからAmazon Timestreamへ温湿度データを送信してみた







