AlibabaCloud IoTPlatformにおけるデータの流れを理解する②　-IoT Platformが受信したデータをTableStoreに格納する-

##　前回まで
前回は、IoT platformとECSを構築し、ECSが送信したデータをIoT platformが受信できるところまでを確認した。
今回は、IoTplatformが受信したデータをTableStoreに格納するまでの流れを説明する。

前回の記事
[AlibabaCloud IoTPlatformにおけるデータの流れを理解する①　-デバイスからIoT Platformにデータを送信する-](https://qiita.com/TakuyaMihara/items/0e5546215140bade77e7)

## 環境構築順序の続き
続いて、TableStoreを構築する。
**マネジメントコンソール**の**[Table Store]**→[インスタンスを作成]を選択する。
ポップアップが出るので、**[インスタンス名]**と**[インスタンスの説明]**を入力して**[OK]**を選択。**[インスタンスタイプ]**は今回高性能インスタンスを選択した。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449825/c1e20d9c-7275-fc62-d8fb-b86cb1318a81.png)

しばらく待つと作成したTableStoreが表示されるので、インスタンス名をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449825/6ee573de-7f9b-d02e-368d-45d1f2a43a72.png)

今回はVPCにバインドしないので、**[テーブルの作成]**を選択し、**[テーブル名]**,**[プライマリキー]**を入力して、**[OK]**を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449825/248fb31c-2cd7-b891-3082-24da94dd5b06.png)
これで、TableStoreの設定は完了。

##IoT Platform→TableStoreのデータ連携設定

### ルールの作成(データの処理)
ここまで出来たら、いよいよIoTPlatform→TableStoreのデータ連携設定を行う。
**マネジメントコンソール**で**[IoTPlatform]**→**[ルールエンジン]**→**[ルールの作成]**を選択。
データ型はJSON型を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449825/6fc6de91-410c-43c2-6af6-45a62cc5f7ea.png)

次に、SQLの作成。
<font color = "red">**ここが難しい！（少なくとも自分は理解に時間がかかりました・・・。）**</font>
作成したるルール名を選択し、**[SQLの作成]**を選択。
データ取得方法のTipsは「AlibabaCloud IoTPlatformにおけるデータの流れを理解する③」で詳しく説明しようと思う。
ここでは、まずTableStoreにデータを転送することを目的としているので、必要最小限の設定のみ行っている。
詳細なSQLの記載方法は、[公式サイト参照](https://jp.alibabacloud.com/help/doc-detail/30554.htm?spm=a21mg.p38356.b99.53.2eb12dbbOa4Hdg)に詳しく書かれている。



- `フィールド`:受信したデータから、抽出したいフィールドを選択。今回は * として全部抽出した。
- `Topic`:トピックとは、プロダクト単位に定義されるデータ格納場所だと思ってもらえればいい。デバイスから受信したデータはトピックに格納される。ここで、クイックスタートからダウンロードできるモジュールを使ってデータを送信した場合、そのデータは**`/sys/${productKey}/${deviceName}/thing/event/property/post`**に格納される。なお、**`/sys/${productKey}/${deviceName}/thing/event/property/post`**は プロパティを報告するデバイス用のトピックである。IoT Platformのトピックについては、[公式サイト](https://jp.alibabacloud.com/help/doc-detail/73731.htm?spm=a21mg.p38356.b99.30.5b031715HWBDgj)を参照のこと。また、システム定義されたトピックについては[こちら](https://jp.alibabacloud.com/help/doc-detail/73732.htm?spm=a21mg.p38356.b99.43.28065872uOy58C)にまとまっている。
- `条件`：ここには、抽出すべきデータの抽出条件を記載する。今回はとりあえずすべて抽出するので設定していない。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449825/b72636ce-94a9-03cf-8b3a-4ca7040e47e4.png)

以上で説明した`フィールド`、`トピック`、`条件`の関係は下図のイメージである。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449825/0d796c5e-8b5d-05b3-732b-65343c34a9a7.png)


### ルールの作成(データ転送)
最後にデータ転送の設定だ。
**[操作の追加]**を選択し、ポップアップに下記を入力。
`対処方法の選択`：Table Storeに保存
`リージョン`：格納したいTableStoreのリージョン指定
`データシート`格納したいTableStoreのデータシート名を指定
`プライマリキー`：データシートまで記入すると、PKが保管されるのでPKに格納する値を設定する。
``${}``で囲むことで変数として定義できる。囲まない場合は固定値になる。今回はまず転送できることを確認したいので、固定値を入力。

すべて入力が完了したら、**[OK]**を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449825/b1349214-89df-c49a-d215-a72859079297.png)

ここまで出来たら、ルールエンジンを開始する。

##データ連携の確認

**[マネジメントコンソール]**から、**[TableStore]**→**[インスタンス名]**→**[テーブル名]**→**[データエディタ]**を選択。
これで、デバイスから送信されたデータがTableStoreに格納されているのが分かる。
なお、データ転送の設定でPKを1として設定したので、デバイスから送られたデータはPKが1のレコードを常に上書きし続けている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449825/fc12e00a-e354-11b0-5b12-626af3f608ce.png)
また、**[データ]**を選択すれば、データの内容が表示できる。
(少し長いがすべて記載。)

```
{
    "primaryKeys":[
        {
            "columnName":"id",
            "type":"INTEGER",
            "value":"1"
        }
    ],
    "columns":[
        {
            "columnName":"deviceName",
            "columnUnits":[
                {
                    "value":"AR863hEI5qa63F8BpQKV",
                    "type":"STRING",
                    "timestamp":1566281030798
                }
            ]
        },
        {
            "columnName":"deviceType",
            "columnUnits":[
                {
                    "value":"None",
                    "type":"STRING",
                    "timestamp":1566281030798
                }
            ]
        },
        {
            "columnName":"gmtCreate",
            "columnUnits":[
                {
                    "value":"1566281030787",
                    "type":"STRING",
                    "timestamp":1566281030798
                }
            ]
        },
        {
            "columnName":"iotId",
            "columnUnits":[
                {
                    "value":"AR863hEI5qa63F8BpQKV000100",
                    "type":"STRING",
                    "timestamp":1566281030798
                }
            ]
        },
        {
            "columnName":"items",
            "columnUnits":[
                {
                    "value":"{"Status":{"time":1566281030789,"value":1},"Data":{"time":1566281030789,"value":"Hello, world!"}}",
                    "type":"STRING",
                    "timestamp":1566281030798
                }
            ]
        },
        {
            "columnName":"productKey",
            "columnUnits":[
                {
                    "value":"a1qZJMZC4UT",
                    "type":"STRING",
                    "timestamp":1566281030798
                }
            ]
        },
        {
            "columnName":"requestId",
            "columnUnits":[
                {
                    "value":"58",
                    "type":"STRING",
                    "timestamp":1566281030798
                }
            ]
        }
    ]
}
````

## 次回に向けて
今回は、デバイスからIoT Platformを経由してTableStoreにデータを格納するところまでを説明した。
次回はこの環境を使って、データの加工方法やデータの項目追加方法、SQLでのデータ抽出方法などに関するTipを、データの流れを意識しながら説明する。