この記事は Supershipグループ Advent Calendar 2025 の 23日目の記事です。
Supership株式会社の検索事業にてデータエンジニアをしている @matsushinDB11 と申します。
データ分析環境をAWSのBIツールであるAmazonQuickSightで提供するに当たって、Terrafromを活用した事例の紹介です。
※最近QuickSightからQuickSuiteにリブランディングしたそうですが、ここでは便宜上QuickSightの表記を使用します。
概要
QuickSightやTerrafromの基礎については理解している前提となるためやや中級者向けです。
この記事で取り上げる事
- Amazon QuickSightにおけるTerrafromの活用方法
- QuickSightのデータソース・データセットの管理にTerraformを使う
取り上げないこと
- QuickSightやTerrafromの基礎的な使い方
QuickSightの概要
QuickSightはAWSが提供しているBIツールです。
無料で利用可能なLookerStudio等と比べると高機能な分若干複雑になっており、以下のような概念から構成されています。
- データソース
- 外部データ(Athena, Redshift等)への接続情報
- データセット
- データソースから得られたデータ(Athenaテーブル等)
- 分析
- データセットを可視化したグラフや図
- テンプレート
- 分析で作成したUIを再利用可能な形で保存した物
- ダッシュボード
- 分析を公開した読み取り専用のビュー
図にすると以下です。
直面した課題
QuickSightでデータ分析環境を構築するに当たって以下のような課題に直面しました。
- dev, stg, prodと環境毎にGUIからポチポチダッシュボードを作成するのが面倒
- 環境毎に別々のダッシュボードを作成しており品質の担保が難しい
一般的なソフトウェア開発においてはローカル環境で開発を行い、同じソースコードをdev→stg→prodと順にデプロイしていくのが一般的です。
しかし一般的なBIツールにはそのような機能が無い事も多く、環境毎にダッシュボードを作成しようとすると往々にして各環境でGUIからポチポチとビジュアルを作成することになってしまいがちです。
一般的なソフトウェア開発に例えれば、環境毎に別々のソースコードを作成しているようなイメージです。
よって構築に手間がかる上に、環境毎に一貫性を保つ事が難しく品質の担保が難しいという問題が生じていました。
解決策
これらの問題に対して次の2つの方法で解決を試みました
- QuickSightのテンプレート機能を活用
- Terraform moduleとtemplatefile 機能の活用
QuickSightのテンプレート機能の活用
QuickSightの概要 で触れたようにQuickSightでは作成したUIをテンプレート機能を使って再利用する事が可能です。
これを用いて共通のテンプレートから各環境へダッシュボードのUIを複製することが可能になります。
これについては本題と外れるため、参考文献を紹介するに留めます。
フューチャー株式会社様の技術ブログにて詳しく解説されており、とても分かりやすかったです。
Terraformの活用
ここからが本題です。
テンプレート機能を活用してUIの複製は容易になりましたが、データソース・データセットの環境毎の複製がまだ煩雑なままです。
これをTerraformを用いて解決を試みます。
Module機能の活用
Terraform AWS Providerから以下のresourceを使用してデータソース・データセットを定義します。
さらにそれらのresouceをTerraformのModuleにまとめることで各環境での再利用を実現しました。
Templatefile機能の活用
さらに、データセットからAthenaへのクエリに使用するカスタムSQLをTerraformのtemplatefile機能を使って再利用可能にします。
環境によってデータセット名が異なっていても、それを変数として外から差し込めるようにする事で再利用が容易にできました。
# sample.sql.tftpl
SELECT
DATE(dt) AS day,
COUNT(*) AS imp,
FROM
${database_name}.imp_summary
GROUP BY
dt
サンプルコード
最後に簡単ではありますが、サンプルコードを紹介します。
ディレクトリ構造は以下のようになっています。
modules配下に定義したdataset moduleを各環境毎のルートモジュールから呼び出す形です。
├── environments
│ ├── dev
│ │ └── main.tf
│ ├── prod
│ │ └── main.tf
│ └── stg
│ └── main.tf
└── modules
├── dataset
│ ├── main.tf
│ ├── outputs.tf
│ ├── sql
│ │ └── sample.sql.tftpl
│ └── variables.tf
├── main.tf
└── variables.tf
データセットモジュールの定義
# module/dataset/main.tf
resource "aws_quicksight_data_source" "quicksight_sample_data_source" {
data_source_id = var.service_name
name = var.service_name
type = "ATHENA"
tags = local.tags
parameters {
athena {
work_group = aws_athena_workgroup.quicksight_sample.name
}
}
}
resource "aws_quicksight_data_set" "daily_summary" {
data_set_id = "${var.service_name}_daily_summary"
import_mode = "DIRECT_QUERY"
name = "${var.service_name}_daily_summary"
tags = local.tags
physical_table_map {
physical_table_map_id = "DailySummaryPhysical"
custom_sql {
data_source_arn = aws_quicksight_data_source.quicksight_sample_data_source.arn
name = "daily_summary"
# テンプレートファイルからカスタムSQLを生成
sql_query = templatefile("${path.module}/sql/daily_summary.sql.tftpl", {
database_name = aws_glue_catalog_database.sample_database.name
})
columns {
name = "day"
type = "DATETIME"
}
columns {
name = "imp"
type = "INTEGER"
}
}
}
}
モジュール呼び出し
# envronments/dev/main.tf
locals {
env = "dev"
service_name = "sample_dev"
}
module "sample" {
source = "../../modules/sample"
env = local.env
service_name = local.service_name
}
まとめ
AmazonQuickSightのデータソース・データセットをTerraform moduleに固めて再利用可能とした事例の紹介でした。
このほかにもフォルダや権限周りなども同様にモジュールに固める事ができるので是非活用してみてください。
最後に宣伝です。
Supershipではプロダクト開発やサービス開発に関わる人を絶賛募集しております。
ご興味がある方は以下リンクよりご確認ください。
Supership 採用サイト
是非ともよろしくお願いします。