AWS QuickSightからS3のデータを可視化(初めての)

こんにちは。現在、AWSを使った仕事の手伝いをする機会に恵まれたので、全速力でAWSの実装について勉強中です。具体的には、S3に毎日追加される.tsvファイルを集計しQuickSight上でグラフ化できるようにする作業なんですが、S3から直接(SPICEを利用して)QuickSightのデータセットにインポートするのか、Athenaを使うのかを比較しながらどちらがいいのかを決めていきます。

今回は練習がてらS3に格納されたTSVファイルをQuickSightへ直接インポートしグラフ表示してみたいと思います。

単体ファイルでの表示だけでなく、複数ファイルをまとめて表示することもできるので、「データセット1:単体ファイルの場合」と「データセット2:複数ファイルの場合」を同時並行でまとめていきます。

QuickSight + S3

やりたいこと

S3に格納されたTSVファイルのデータをQuickSightへ直接インポート(SPICE)して可視化。

  1. 単体ファイルからデータセットを作成
  2. 複数ファイルからデータセットを作成

利用するサービス

  • S3
  • QuickSight
  • IAM

参考

公式チュートリアル
https://docs.aws.amazon.com/ja_jp/quicksight/latest/user/getting-started-create-analysis-s3.html

SPICE
https://docs.aws.amazon.com/ja_jp/quicksight/latest/user/spice.html

データソースのクォータ
https://docs.aws.amazon.com/ja_jp/quicksight/latest/user/data-source-limits.html

データセットの作成

流れとしては、S3にファイルを格納する → マニフェストファイルで対象とするファイルや定義を設定する → QuickSight上でSPICEを通じてデータセットを作成する → QuickSightでグラフ表示 となります。

最初思っていたイメージは、QuickSightでS3のファイルを随時読み取りに行って集計してグラフ表示だったんですが、実際はもうちょっと段階を踏んでいるようで、読み取るファイルをマニフェストファイルで指定して、その設定情報からSPICEでデータセットを作成しQuickSightへ保存、作成されたQuickSiht内のデータセットから集計・グラフ表示 という流れになります。

つまり、QuickSightは最初だけS3を覗きにいき、集計用のデータを作成するということになります。(定期的にS3を覗きにいきデータセットを更新することもできます)

マニフェストファイル

S3ファイルから直接データセットを作成する場合、マニフェストファイル(ファイルの場所や定義を設定するファイル)を作成します。

QuickSightで使う際のマニフェストファイルはJSON形式です。(例:my_manifest.json)インポート用に指定するファイル形式などの注意点は次のようになります。

  • インポート可能ファイルは文字区切り形式のテキスト (.csv や .tsv など)、ログ形式 (.clf)、拡張ログ形式 (.elf)、または JSON (.json)
  • 1 つのマニフェストファイルで識別されるすべてのファイルでは、同じファイル形式を使用する
  • (複数ファイルを指定するとき)列の数とタイプ(データ型)が同じである

マニフェストファイル形式の例

今回サンプルで取り込むTSVファイルに対するマニフェストファイルの例です。

{
    "fileLocations": [
        {
            "URIs": [
                "s3://bucket/pass/to/file/sample.tsv"
            ]
        }
    ],
    "globalUploadSettings": {
        "format": "TSV",
        "delimiter": "\t",
        "containsHeader": "true"
    }
}

globalUploadSettings内のformatはデフォルトではcsvなのでTSVを選択します。“delimiter": “\t"もセットと考えればokです。containsHeaderは1行目にヘッダー行を含めるかどうかです。デフォルトではtrueですが、今回は理解のしやすさも兼ねて書いています。

複数のS3ファイルから作成する場合

S3ファイルからデータセットを作成する場合、マニフェストファイルで作成方法を指定しますが、マニフェストファイル内で複数のS3ファイルを指定することもできます。(参考

fileLocations内の“URIs"で複数のファイルパスを指定する方法もありますが、“URIPrefixes"で対象フォルダ(複数指定可)を選択するやり方がラクです。後からファイルを追加していく場合もこの方法ならSPICEを更新するだけでデータセットを更新できます。

{
    "fileLocations": [
        {
            "URIPrefixes": [
                "s3://bucket/pass/to/folder/phpGenerated/"
            ]
        }
    ],
    "globalUploadSettings": {
        "format": "TSV",
        "delimiter": "\t",
        "containsHeader": "true"
    }
}

インポートするTSVファイル(データセット1つ目:ファイル単体)

今回表示するのはこちらです。1つのファイルを対象にする場合なら"URIs"でファイルパスを指定します。

インポートするTSVファイル(データセット2つ目:複数ファイル)

マニフェストファイル:"URIs"で複数指定するか、"URIPrefixes"で対象ファイルを含むフォルダを指定します。

サンプルファイルを用意しました。5ファイルあります。

(ちなみに)サンプルファイル生成プログラム

.tsvサンプルファイルはphpプログラムで生成しました。参考までに上げておきます。(オリジナルなので粗いかもしれません)

<?php
for ($i=0; $i < 5; $i++) {
  generateData($i + 1);
}

function generateData($fileNum = '')
{
  $tsv = [];
  $header = ["id", "name", "price", "type", "sold", "a", "b", "c"];
  $tsv[] = $header;
  for ($i=0; $i < 100; $i++) {
    $id = $i + 1;
    $name = str_shuffle('abcdef');
    $price = rand(1,50) * 100;
    $types = ["type-X", "type-Y", "type-Z"];
    $type = $types[rand(0,2)];
    $sold = rand(0, 200);
    $strs = ['a', 'b', 'c'];
    foreach ($strs as $str) {
      $$str = $str;
      for ($j=0; $j < rand(0,4); $j++) {
        $$str .= $str;
      }
    }
    $line = [$id, $name, $price, $type, $sold, $a, $b, $c];
    $tsv[] = $line;
  }

  $save_file_path = "./phpGeneratedData{$fileNum}.tsv";
  $file = new SplFileObject($save_file_path, 'w');  // ファイルは作成してくれます。
  $file->setCsvControl("\t");

  foreach ($tsv as $row) {
      $file->fputcsv($row);
  }
}

SPICEでデータセットを作成

SPICEというのは内部的にDBを含んだAWSサービスです。S3ファイルからデータセットを作成するときに利用するものですが、サーバーレスであり、特に仕組みを気にする必要もないので割愛します。(参考

Super-fast, Parallel, In-memory, Calculation Engine の略です。

参考サイトより

QuickSightの[データセット]画面で[新しいデータセット]をクリックします。

S3を選択します。

データソース名(任意)を入力し、作成したマニフェストファイル(.json)をアップロードします。

マニフェストファイルについてはこちらを参考にしています。
https://docs.aws.amazon.com/ja_jp/quicksight/latest/user/supported-manifest-file-format.html
https://dev.classmethod.jp/articles/cm-advent-calendar-2016-amazon-quicksight-23-supported-formats-for-amazon-s3-manifest-files/

データセット作成までの流れまとめ

  • S3に.tsvファイルを格納
  • マニフェストファイルで対象ファイルや定義を設定。複数ファイルを一括対象にする場合、同じフォルダにいれて"URIPrefixes"指定
  • QuickSight上でSPICEを通じてデータセットを作成。(データセット名入力とマニフェストファイルをアップロード)

こんなのができました。

[更新スケジュール]からSPICEデータを定期的に更新できるようです。

マニフェストファイルでフォルダを指定した状態なら、定期的に投げ込まれたファイルをデータセットにも入れ込むことが可能です。

分析する

あとはグラフや表を目的ごとに表示していき、ユーザー全体でシェアすることができます。

例えばこんな感じ。