運用が楽なQuickSightダッシュボードを作る_1（環境構築）

# はじめに
弊社でよくありそうな課題に対して、QuickSightが簡単に解決できそうだったので、少しずつ調べて記事にしていこうと思います。

# よくありそうな課題

1. データをすぐに見える化したい。
1. そのデータはCSV等で、得意先からメールなど人手で送られてくる。
    -  得意先が操作できるシステムからCSV出力したものを、弊社がお預かりする、という感じ。
1. 人手なので期間指定を誤って抽出するなどのミスが生じるため、データの削除や差替えが簡単であること。

# よくありそうな解法

- DB構築してテーブル作成。
- CSV取り込み処理作成。
- テーブルをダッシュボードのデータソースとする。

上記で構築した場合、課題の2.までであれば、これだけ作れば運用できると思います。
ですが3.があると、難易度が一気に跳ね上がる、と思っています。

- 取り込んだデータの中から、削除するデータを特定できるようにしておかなくてはならない。
    - 取り込み日付や、取り込みファイル名など、特定できるカラムを作っておく必要がある。
- 削除操作（SQLであればDELETE文）を、リテラシーの高い人がやることになる。
    - 現場の人は、SQLなんてやりたがらない。
    - 発生頻度が低い操作のためにわざわざ画面を作るのも、手間に対して割に合わない。

# QuickSightでの解法

- SPICE(QuickSightのインメモリDB？)に、S3のフォルダ内のデータを取り込むよう設定。
    - マニフェストファイルが必要。
        - QuickSightに、「S3のどこのファイルを、どういう風に読み込むのか」を説明するファイル。
- フォルダ内のファイルが変更都度、SPICEをフル更新。

QuickSightでは、S3の**CSV群**をそのまま取り込んで扱えるため、追加の際はファイルを置きすべて取り込むことで実現でき、削除や差替えも、対象のCSVファイルを削除しすべて取り込みなおしで、データの削除ができます。
ファイルの追加、削除程度の操作であれば、現場の人でも対応できます。
DBインスタンスの管理も無いので、非常に運用が楽です。

上記のようなダッシュボード環境をコツコツ構築していきます。

# 用いたデータ

以下のサイトから取得できる、東京都の新型コロナウイルス陽性患者のデータを用いました。

https://catalog.data.metro.tokyo.lg.jp/dataset/t000010d0000000068

「複数のCSVを追加、削除」の運用を想定してるので、年ごとに3ファイルに分けました。

# 構築
## 用意するもの
- S3
- マニフェストファイル
- QuickSightの管理者ユーザ
    - S3の権限や、IAMが編集できる権限が必要
- QuickSight

## S3
フォルダ階層を以下のようにしました。

```
dashboard
├── data
│   ├── dataset01
│   │   ├── aaaa.csv
│   │   └── bbbb.csv
│   └── tokyo_covid19
│       ├── 2021.csv
│       └── 2022.csv
└── manifest
    ├── dataset01.json
    └── tokyo_covid19.json
```
- dataフォルダの下に、データセット名でフォルダを作成し、その下にCSVを置く。
    - 今回はtokyo_covid19だけですが、今後データセットを増やす場合を想定して、仮としてdataset01も記載しています。
- manifestフォルダの下に、対象のマニフェストファイルを、<データセット名>.json という名前で置く。

## マニフェストファイル
今回のデータは比較的整っているので、必須部分だけで事足りました。

```
{
    "fileLocations": [
          {"URIPrefixes": ["s3://<S3バケット名>/dashboard/data/tokyo_covid19/"]}
     ]
}
```

- 「フォルダ以下のファイル群全部」とするため、`fileLocations.URIPrefixes`を指定しました。

フォーマットやデリミタを指定するなど、詳細なマニフェストファイルの記載方法は以下のページにあります。

https://docs.aws.amazon.com/ja_jp/quicksight/latest/user/supported-manifest-file-format.html#quicksight-manifest-file-format

## QuickSightの管理者ユーザ
公式にユーザの作り方があります。

https://docs.aws.amazon.com/ja_jp/quicksight/latest/user/setting-up-create-iam-user.html

上記ページの場合かなり強い権限を付与していて、そのままこのユーザを運用の方に渡すのは危険かと思います。

「作るときだけ一時的に強い権限が欲しいが、運用中は必要十分な権限にしたい」というユーザを作るCloudFormationについて、以前記事にしましたので、必要に応じてそちらをご利用ください。

https://qiita.com/a_b_/items/4d342da5968edb389f47

## QuickSight
QuickSihgtの初回設定方法は公式をご覧ください。（UIが度々変更されるので、公式を見るのが正しいと思います。公式も時々古かったりしますが。）

https://docs.aws.amazon.com/ja_jp/quicksight/latest/user/signing-up.html

## データセット作成

公式のページにやり方があります。ほぼこれに従えばOKです。

https://docs.aws.amazon.com/ja_jp/quicksight/latest/user/getting-started-create-analysis-s3.html#step-1-create-s3-data-set-and-analysis

今回のやり方で説明が異なる点は以下の場所になります。

> 
1.「Amazon S3 のマニフェストファイルでサポートされている形式」で指定されているいずれかの形式を使用して、インポートする S3 ファイルを識別するためのマニフェストファイルを作成します。
8.[Upload a manifest file (マニフェストファイルをアップロードする)] で、以下のいずれかのオプションを実行します。
・ [URL] を選択し、マニフェストファイルの URL を入力するか貼り付けます。URL は、Amazon S3 コンソールでマニフェストファイルを右クリックして [Properties (プロパティ)] を選択すると、[Link (リンク) ] フィールドに表示されます。

上記で作成したマニフェストファイルをS3において、そのファイルのURLを指定してください。
先のフォルダ構造であれば`s3://<S3バケット名>/dashboard/manifest/tokyo_covid19.json`になります。

## ビジュアル作成

先の公式のページに従うと、次はビジュアルを作成する画面になります。
今回はデータの総件数と、日ごとの件数のグラフを作成してみます。

### 総件数

まずは左上の[追加]-[ビジュアルを追加]でエリアを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/02597656-719a-ed55-f712-2ce747b27f30.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/80b3d171-2d1b-315a-ef1f-80286df3b88a.png)

作ったばかりの場合は既に1つ追加済みかと思います。
それを選択した状態で、フィールドリストから"No"をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/3700da76-dc35-7837-bbb6-1dd877ab7528.png)

ビジュアルのタイトルにもあるように、"No"は数値型なので、自動で合計になってしまいました。
これを　カウント　に変えるためには、ビジュアルを選択した状態で画面上部にあるフィールドウェルを開きます。

開く前
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/ddbb996e-be53-8a8c-8e51-3164830e92ef.png)

開いた後
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/b926fdca-36e9-eaad-7dbf-c0372d4cf7e7.png)

"No(合計)"の右側の矢印をクリックして、[集計:合計]-[カウント]で集計方法を選びなおします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/fa9cde20-e7ff-80e1-0245-b1f1e6c9a3a3.png)

総件数になりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/0cfc69c7-94eb-8ab5-265d-ef2451d42c04.png)

タイトルを変えるには、タイトル部分をダブルクリックします。タイトルを編集する画面が出てきますので、適切なタイトルに変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/9f3a19b3-2274-5775-b25a-cc9441f0110f.png)

### 日別の件数

次に日別の件数のグラフを作ります。先の様にビジュアルを追加した後、追加した空のビジュアルを選択したまま、左下のビジュアルタイプから垂直棒グラフを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/9aa16719-e1b9-55ef-4598-de7d082c108a.png)

次にフィールドリストから"公表_年月日"を選択します（他の年月日はNULL値があり、フィールドの型が文字列型なので、思ったようなデータになっていません）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/a23c785d-2362-7065-0dcc-3f49f19bf34d.png)

X軸が読みづらいので、フォーマットを変えます。
総件数と同じように、画面上部のフィールドウェルから[形式:xxxxxx]で別の形式が選べます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/e1d581c7-5977-b3ed-242d-8998b44d8a21.png)

よさそうなのがないので、"その他のフォーマットオプション"を選択すると、左ペインで詳細に編集ができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/8325e097-0c2b-e497-a61b-97cadaa5610d.png)

後はタイトルを変えたり、総件数の大きさを変え、配置をし直すなどで全体の見栄えを良くします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/3c87e342-bf82-722b-e0cc-ad90c5b7545f.png)

## ダッシュボード
自分一人でデータをグラフ等にして確認するのであればこれでよいですが、他の人用に閲覧専用にするためには「ダッシュボードの公開」を行います。
言葉が紛らわしいので、QuickSightでの（私が理解している）構造を解説します。

### QuickSightの構造
QuickSightは、「**"データセット"**の内容を、**"分析"**でビジュアル化し、**"ダッシュボード"**にして公開する」という風になっているようです。
図にすると以下のイメージです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/8948a8a7-06c5-3d58-ffd5-1ef3109ebe1c.png)
**"分析"**と**"ダッシュボード"**は、ビジュアルで関連しているため、「ビジュアルを変更する場合は"分析"を編集して、"ダッシュボード"に反映」ということをします。
データは各々で見ているようですので、データに変更があった場合は各々新しいデータを参照するため、「"分析"を"ダッシュボード"に反映」はする必要はないです。

### ダッシュボードの公開
"ダッシュボード"の公開は、"分析"の右上にある[共有]-[ダッシュボードの公開]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/b26d454b-b8d6-2af3-d0c1-711376a1fa70.png)

新しく"ダッシュボード"にする場合は、「新しいダッシュボードとして公開」を選択し、名前を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/11a8ac71-03da-7e94-0cbf-a76b130af13f.png)
既に対象の"分析"から派生した"ダッシュボード"がある場合は、画像の様に「既存のダッシュボードを置き換える」というのが出ます。修正したビジュアルを"ダッシュボード"に反映する場合は、こちらを選びます。

"ダッシュボード"が作られました。こちらではビジュアルが変更できず、閲覧専用になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/ad66ce77-9ed1-2aa9-7c67-7762c0b5c4dd.png)

これで、DBを使わない、CSVファイルで運用できるダッシュボード環境ができました。

# 運用
操作は単純に、以下で更新できます。
1. S3上の対象のフォルダへ、ファイルを追加・削除。
1. QuickSightのデータセットを更新。

試しに、CSVファイルを追加・削除して反映されるか確認します。

## データ追加

### 追加前
S3の対象のフォルダには、2020年のファイルだけあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/8a9cb71e-45ea-3b81-acdb-53f142163701.png)

件数は60,312件、日付は2020年が1年分です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/3c87e342-bf82-722b-e0cc-ad90c5b7545f.png)

### 追加手順
対象のフォルダに、2021年のファイルを置きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/89eb2287-5a08-1c51-a535-9e5d2779e55e.png)

QuickSightで、対象のデータセットを選択し、「今すぐ更新」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/c28c7f32-4363-21ca-9902-6174f2929a7e.png)
確認ポップアップが何度か出てきますので、クリックして進めます。

更新中はその旨表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/789a41cc-986f-daf3-0ab5-93e571c26d92.png)

更新が終わると、結果が表示されます。スキップされた行が無かったので、全件取り込めました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/2947e59a-217a-bdd2-4c49-716079df6889.png)

### 追加後
では作った**"ダッシュボード"**を見てみます。
件数も増えていますし、2021年のデータも入っているのが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/06987afb-0907-4c52-5d51-ede0ff8b073e.png)

## データ削除
続いて、2020年のデータの削除もやってみます。

### 削除手順
S3フォルダから、2020年のデータを削除します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/1c897d06-cc34-6097-dd27-e813462a7809.png)

その後、追加の際と同様にQuickSightのデータセットを更新します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/ba6b8a27-4a10-3254-c3f3-709ac94c2425.png)

### 削除後
再び**"ダッシュボード"**を見てみます。
件数も先ほどより減少しており、データも2020年がなくなっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/c89e196b-cf3e-d6b1-334a-211b64a688f0.png)


# おわりに
CSVのファイルを管理してQuickSightにダッシュボードを作る方法を紹介しました。
DB不要でGUIで更新できるので、非常に楽な運用でデータの可視化ができると思います。

次はこのダッシュボードに、説明文を入れ込む方法を記事にしたいと思います。