AWS IoT SiteWiseとAmazon Managed Grafanaの連携は超簡単


AWS IoT SiteWiseとAmazon Managed Grafanaを連携させてみます。


本手順の前提条件
 - AWS SSOのユーザが既に作成されていること
 - Managed Grafanaのバージョン：8.4
## IoT Sitewise

まず、デモデータを用意します。
AWSマネジメントコンソールのIoT SiteWiseを開きます。
ランディングページでボタン１発で数日間利用可能なデモデータを生成することができます。
作成すると以下のように風力発電のアセットが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538058/dccd5dbd-4cbb-6615-d6cb-3ac4eacbb439.png)

## Managed Grafana

### 初期設定

Amazon Managed Grafanaを開き、ランディングページにて「ワークスペースを作成」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538058/2698f990-2e77-3625-a717-610482de87c3.png)

認証に利用できるのはAWS SSOか、SAMLかのいずれかです。
今回は、AWS SSOユーザでマネジメントコンソールにログインしているため、SSOを選択します。
（なお、本例のAWS SSOは親アカウントのバージニア北部リージョンで設定されています。一方、SiteWiseやGrafanaは東京リージョンです）
「アクセス許可タイプ」は、今回は「サービスマネージド」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538058/76597091-6c68-a626-7287-92623e2bebe6.png)

「IAMアクセス許可アクセス設定」は「現在のアカウント」が選択されているので、そのままにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538058/47414ffe-b297-c0f7-241d-36e0f6770d81.png)

「データソースと通知チャネル」は「AWS IoT SiteWise」を選択します。
これにより、Grafana用のIAMロールに、IoT SiteWiseへのReadonlyポリシーが付与されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538058/309d303a-ce65-7f53-3c56-6d977928b492.png)

「通知チャネル」はAmazon SNSを選択します。
これにより、Grafana用のIAMロールに、AWS SNSの「grafana*」がついたトピックへのPublish可能なポリシーが付与されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538058/840a3e47-213e-dd5b-d339-d5911f4809a9.png)

確認画面がでますので、「ワークスペースを作成」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538058/91e81d45-d72c-015b-dc6b-62871133f866.png)

ワークスペースが作成されたら、Grafanaへのログインユーザの設定をしていきます。
対象のワークスペースの「認証」タブの「AWS SSO」より、「新しいユーザーまたはグループの割り当て」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538058/adebfa80-52d7-694c-e63d-9d44d807b429.png)

ここでリストアップされるユーザはAWS SSOから取得されたものだと思われます。
いまマネジメントコンソールにログインしているSSO用のユーザが表示されたので、それを選択し「ユーザーとグループを割り当て」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538058/ba95c539-e6df-4065-3868-984b29d0a7c5.png)

割り当てたユーザを管理者に変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538058/3f846d08-5b13-d02b-fc83-5c8d0b889ff9.png)

## AWS SSO
AWS SSOのログインURLにアクセスすると、Grafana用のアイコンが作成されているのでクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538058/4aef3feb-41a5-1aec-34e0-aa30d4a34cdc.png)

## Managed Grafana コンソール
Grafanaにログインできました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538058/d9d8f819-7245-9de3-a588-c1b16133f473.png)

### データソースの設定

データソースを設定していきます。
左ペインの「AWS」アイコンから、AWS Data Sourcesとして、「AWS services」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538058/6a8eb09f-e02e-2d7e-9de5-6a46b350f255.png)

データソースのサービスに「IoT SiteWise」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538058/da159bab-3df9-ad1f-9d8a-5678825b52b6.png)

参照したい SiteWiseがデプロイされているリージョンを選択し、「Add data source」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538058/fa219ff5-ae7f-0297-6ead-61c4a1b199b6.png)

「Go to settings」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538058/5e58cfbf-b830-264a-fa43-e6ebbb00ac79.png)

「Settings」タブでは、デフォルトのまま「Save & test」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538058/3a7e485d-1677-26b0-e277-f63743f09203.png)

GrafanaがIoT Sitewiseに正常に接続できると、「OK」が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538058/282aac7d-2382-222d-69b3-81c7308ec60c.png)

### ダッシュボードの作成

左の＋メニューをクリックし、[Add a new panel]を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538058/0ece1748-f445-36a6-5a97-b082c05e9ff2.png)

デフォルトではGrafanaのサンプルデータが選択されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538058/67161cf0-a037-32a3-3b5c-2083df6b1b70.png)

「Data source」を選択し、該当リージョンの IoT SiteWiseを選択します。
「Query type」の選択肢から「Get property value aggregates(集計値)」を選択してみます。

このように、実際のデータを選択する前に「データの取り方」を先に選択するのが、ちょっとトリッキーに感じました。
実際のデータを見てからでないと、集計したいかどうかなんて決定できないですし。
後述しますがSiteWiseのAPI仕様に基づくものなので、致し方ないですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538058/37dba55c-9ed2-cd42-e49d-4f488a638d99.png)

このQuery typeは、データソース毎に異なるようです。
https://grafana.com/docs/grafana/latest/panels/query-a-data-source/about-queries/
RDBMSなどであれば普通にSQL文として解釈できるQueryTypeになるようですが、今回はIoT Sitewiseがデータソースなので、SiteWiseのデータ取得関数にあわせたクエリタイプになっています。


| Quety type | 意味 | 詳細(SiteWiseの関数仕様) |
|:-----------|:------------|:------------:|
| Get property value aggregates       | 集計の値        | https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_GetAssetPropertyAggregates.html |
| Get property value history     | 過去の値      | https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_GetAssetPropertyValueHistory.html |
| Get property value       | 現在の値        |https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_GetAssetPropertyValue.html |
| List assets       | SiteWiseアセットのリスト        | https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_ListAssets.html |
| List asset models       | SiteWiseアセットモデルのリスト        |https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_ListAssetModels.html |



では、「Asset」の選択肢から「Demo Wind Farm Asset」を選択してみます。
これはSiteWiseにおける「アセット」としてデモデータが作成したデータです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538058/61bb4ee1-204c-d569-b5db-3bfaca2204a8.png)

先程選択した「アセット」の「プロパティ」(このへんもSiteWiseの概念)として、実際のデータとして発電量の合計値を選択します。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538058/22a2dff3-b9f7-0d4b-2899-976259a4a4e6.png)

また、QuetyTypeで集計値を選択したので、[Aggregate]という選択項目が出現しています。
とりあえずグラフを表示したいだけなので、[Average]を選択してみますが、値の数(Count)、最大値(Max)、最小値(Min)、合計値(sum)、標準偏差(Stddev)などが選択できるようです。

この集計単位もSiteWiseで定義された集計機能に基づくもののようです。
https://docs.aws.amazon.com/ja_jp/iot-sitewise/latest/userguide/query-industrial-data.html#aggregates
https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_Aggregates.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538058/bc86aecc-dd75-28bc-a66d-1efebbef27de.png)

Aggregateの右側に[Resolution]という項目があり、ここで集計範囲を指定できます。

日時分が指定できますが、[Auto]の場合は「時間枠に基づいて解像度を選択します。1分 を超える解像度が必要な場合は、生データに切り替えます」ということらしいです。表示の目盛りにあわせてくれるということでしょうかね？今度検証してみようと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538058/0ea253a9-1b0e-cf18-c4e7-cffdf6149244.png)

グラフ右上に表示する時間範囲を指定できます。
今回はデモデータを作成したばかりで、デフォルトの範囲だと何も表示されなかったので、1時間にしてみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538058/790bcfdc-328b-9d96-39c5-1abd87e9e1ef.png)

対象のグラフが出てきました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538058/99abe12c-9869-3b09-c919-4eaeaed356da.png)

# 料金体系について

Grafanaの課金はユーザ数単位になっており、AWSでいうとQuickSightに似ています。
サーバレスなのでインスタンスやクラスタの料金はかかりません。

https://aws.amazon.com/jp/grafana/pricing/

# 所感

AWSの時系列グラフ化サービスでは、これまでAmazon OpenSearch Service(旧Amazon ElasticSearch Service)が使われるケースがありましたが、OpenSearchはデータの腹持ちができるかわりにクラスタの料金が高額だったり、データ投入にあたりインデックス等の概念を理解しないといけなかったり、kibanaの認証設定が難解だったりと、素早く可視化を行うには不便な点が多くありました。

Managed Grafanaは、データソースに簡単に連携できるようになっていますし、本例でみたようにAWS SSOであれば非常に簡単に認証ができます。

いっぽう、Grafanaはデータの腹持ちができないためのでデータソースとして別途高速なデータストアが必要な点は注意が必要になりそうです。
GrafanaはWeb上に日本語の情報が少ないことも注意が必要です。日本語書籍も出ていないように見えますので、割と自力で学習する必要があります。

また、本家のGrafana Cloudでは「Grafana Incident」というインシデント管理機能がリリースされています。

https://grafana.com/blog/2022/02/02/announcing-grafana-incident-smart-incident-management-for-your-teams/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538058/c66e4501-af69-242f-e70f-2019f008b0e9.png)

この機能はサーバ障害のインシデント対応のみならず、工場のラインの停止（通称チョコ停・ドカ停）の分析にも役立つのではと、個人的に大変期待しており、Amazon Managed Grafanaへの実装を激しく待ち望んでいます。

以上です。