Amazon QuickSight 名前空間を活用したマルチテナント構成の実装
2025.7.23
概要
Amazon QuickSight でマルチテナント環境を構築する際は、各テナントのデータとユーザーを適切に分離することは重要な要件です。
本記事では、QuickSight の名前空間機能とグループ管理を組み合わせて、セキュアなマルチテナント環境を構築する方法をご紹介します。
構成概要
今回構築するマルチテナント構成は以下の通りです。

- 名前空間:default (テナント全体を管理する名前空間)
- 管理者ユーザー(ADMIN 権限)
- NS1 名前空間: テナント 1 用の独立した名前空間
- グループ:GroupA
- ユーザー:QSDemoUser1(AUTHOR 権限・IAM ユーザー)
- NS2 名前空間: テナント 2 用の独立した名前空間
- グループ:GroupB
- ユーザー:QSDemoUser2(AUTHOR 権限・IAM ユーザー)
今回設定するグループの権限設定は以下の通りです。

事前に用意した Glue のデータカタログを使って、Athena から S3 のデータを読み取ります。
- NS1 名前空間からはテナント 1 用の S3 バケットのみアクセスを許可する
- NS2 名前空間からはテナント 2 用の S3 バケットのみアクセスを許可する
自テナントの S3 バケットのデータにアクセスできることと、別テナントの S3 バケットのデータにアクセスできないことの両方を確認します。
Terraform による実装
カスタム名前空間の作成は、コンソールからは行えません。
また、CloudFormation を使ったとしても、ユーザーやグループのリソースがありません。
そのため、本記事では、作成時の利便性を考慮して Terraform を用いて構築します。
また、QuickSight の設定の紹介が主のため、S3 や Glue のコードについては割愛します。
IAM ユーザーの作成
それぞれの名前空間で使用するユーザーを作成します。
# IAM ユーザー作成
resource "aws_iam_user" "ns1" {
name = "QSDemoUser1"
path = "/"
}
resource "aws_iam_user" "ns2" {
name = "QSDemoUser2"
path = "/"
}
QuickSight 名前空間の作成
NS1 と NS2 の名前空間を作成します。
# 現在のAWSアカウントIDを取得するためのデータソース
data "aws_caller_identity" "current" {}
# QuickSight 名前空間 NS1
resource "aws_quicksight_namespace" "ns1" {
namespace = "NS1"
aws_account_id = data.aws_caller_identity.current.account_id
identity_store = "QUICKSIGHT"
}
# QuickSight 名前空間 NS2
resource "aws_quicksight_namespace" "ns2" {
namespace = "NS2"
aws_account_id = data.aws_caller_identity.current.account_id
identity_store = "QUICKSIGHT"
}
QuickSight ユーザーの作成
作成した IAM ユーザーを指定して、QuickSight ユーザーを作成します。
# QuickSightユーザー(NS1用)
resource "aws_quicksight_user" "user_ns1" {
aws_account_id = data.aws_caller_identity.current.account_id
namespace = aws_quicksight_namespace.ns1.namespace
email = var.quicksight_user_email
identity_type = "IAM"
user_role = "AUTHOR"
iam_arn = aws_iam_user.ns1.arn
depends_on = [aws_quicksight_namespace.ns1]
}
# QuickSightユーザー(NS2用)
resource "aws_quicksight_user" "user_ns2" {
aws_account_id = data.aws_caller_identity.current.account_id
namespace = aws_quicksight_namespace.ns2.namespace
email = var.quicksight_user_email
identity_type = "IAM"
user_role = "AUTHOR"
iam_arn = aws_iam_user.ns2.arn
depends_on = [aws_quicksight_namespace.ns2]
}
QuickSight グループの作成と割当
NS1 と NS2 の名前空間用にグループを作成します。
# QuickSightグループ(NS1用)
resource "aws_quicksight_group" "groups_ns1" {
aws_account_id = data.aws_caller_identity.current.account_id
namespace = aws_quicksight_namespace.ns1.namespace
group_name = "QSDemo-NS1-GroupA"
depends_on = [aws_quicksight_namespace.ns1]
}
# QuickSightグループ(NS2用)
resource "aws_quicksight_group" "groups_ns2" {
aws_account_id = data.aws_caller_identity.current.account_id
namespace = aws_quicksight_namespace.ns2.namespace
group_name = "QSDemo-NS2-GroupB"
depends_on = [aws_quicksight_namespace.ns2]
}
作成したグループに各テナント用のユーザーを紐づけます。
# NS1グループメンバーシップ
resource "aws_quicksight_group_membership" "authors_ns1_membership" {
aws_account_id = data.aws_caller_identity.current.account_id
namespace = aws_quicksight_namespace.ns1.namespace
group_name = aws_quicksight_group.groups_ns1.group_name
member_name = aws_iam_user.ns1.name
depends_on = [
aws_quicksight_group.groups_ns1,
aws_quicksight_user.user_ns1
]
}
# NS2グループメンバーシップ
resource "aws_quicksight_group_membership" "authors_ns2_membership" {
aws_account_id = data.aws_caller_identity.current.account_id
namespace = aws_quicksight_namespace.ns2.namespace
group_name = aws_quicksight_group.groups_ns2.group_name
member_name = aws_iam_user.ns2.name
depends_on = [
aws_quicksight_group.groups_ns2,
aws_quicksight_user.user_ns2
]
}
IAM ポリシーの定義と割り当て
基本的には同じポリシーですが、S3 のリソースはテナントごとに作成したバケットのみを許可するポリシーにしています。
# QuickSight GroupA用IAMポリシー
resource "aws_iam_policy" "quicksight_group_a_policy" {
name = "QuickSightGroupAPolicy"
description = "Policy for QuickSight Author access - Group A (NS1)"
policy = jsonencode({
Version = "2012-10-17"
Statement = [
{
Effect = "Allow"
Action = [
"s3:*"
]
Resource = [
"${aws_s3_bucket.ns1.arn}",
"${aws_s3_bucket.ns1.arn}/*",
"arn:aws:s3:::aws-athena-query-results-us-east-1-${data.aws_caller_identity.current.account_id}",
"arn:aws:s3:::aws-athena-query-results-us-east-1-${data.aws_caller_identity.current.account_id}/*",
]
},
{
Effect = "Allow"
Action = [
"athena:*"
]
Resource = "*"
},
{
Effect = "Allow"
Action = [
"glue:*"
]
Resource = "*"
}
]
})
}
# QuickSight GroupB用IAMポリシー
resource "aws_iam_policy" "quicksight_group_b_policy" {
name = "QuickSightGroupBPolicy"
description = "Policy for QuickSight Author access - Group B (NS2)"
policy = jsonencode({
Version = "2012-10-17"
Statement = [
{
Effect = "Allow"
Action = [
"s3:*"
]
Resource = [
"${aws_s3_bucket.ns2.arn}",
"${aws_s3_bucket.ns2.arn}/*",
"arn:aws:s3:::aws-athena-query-results-us-east-1-${data.aws_caller_identity.current.account_id}",
"arn:aws:s3:::aws-athena-query-results-us-east-1-${data.aws_caller_identity.current.account_id}/*",
]
},
{
Effect = "Allow"
Action = [
"athena:*"
]
Resource = "*"
},
{
Effect = "Allow"
Action = [
"glue:*"
]
Resource = "*"
}
]
})
}
# NS1グループへのIAMポリシー割り当て
resource "aws_quicksight_iam_policy_assignment" "group_ns1" {
assignment_name = "group1"
assignment_status = "ENABLED"
policy_arn = aws_iam_policy.quicksight_group_a_policy.arn
namespace = aws_quicksight_namespace.ns1.namespace
identities {
group = [aws_quicksight_group.groups_ns1.group_name]
}
}
# NS2グループへのIAMポリシー割り当て
resource "aws_quicksight_iam_policy_assignment" "group_ns2" {
assignment_name = "group2"
assignment_status = "ENABLED"
policy_arn = aws_iam_policy.quicksight_group_b_policy.arn
namespace = aws_quicksight_namespace.ns2.namespace
identities {
group = [aws_quicksight_group.groups_ns2.group_name]
}
}
作成したユーザーでログインを確認
作成した IAM ユーザーのコンソールログインを有効化して、QuickSight のセットアップを完了させます。
アカウント名がそれぞれ名前空間の名前になっています。
QSDemoUser1 でログインした画面

QSDemoUser2 でログインした画面

権限管理の設定
グループを作成しましたが、リソースを作成しただけでは意図した権限設定が適用されないため、コンソールから QuickSight 自体の設定を変更します。
QuickSight では、以下の 3 つの設定を行い詳細な権限を定義します。
- QuickSight の AWS サービスへのアクセス
- デフォルトのリソースアクセス
- 個々のユーザーとグループのリソースへのアクセス
AWS リソースへのアクセス – Amazon QuickSight

「QuickSight の AWS サービスへのアクセス」で、今回作成した S3 バケットを 2 つともにチェックを付けます。

続いて、「デフォルトのリソースアクセス」でアクセスを拒否する設定に変更します。
- すべてのユーザーおよびグループに対しすべての AWS のデータおよびリソースに対するアクセスを拒否する
こうすることにより、「個々のユーザーとグループのリソースへのアクセス」で詳細な権限設定が可能になります。

最後に、「個々のユーザーとグループのリソースへのアクセス」を設定を確認します。
Terraform で名前空間と合わせて作成しているため、すでに作成してある状態です。
なお、デフォルトの名前空間からポリシーを確認していますが、別の名前空間にあるグループを設定した場合だと正しくグループ名が表示されません。
ただし、実際にはグループにポリシーが適用されています。

それぞれのポリシーで、テナントごとの S3 のみのアクセスを許可しています。
テナント 1 用の Group A ポリシー

テナント 2 用の Group B ポリシー

名前空間の動作確認
では、準備が整ったためそれぞれの名前空間でデータセットを作成してデータに正しくアクセスできるかを確認します。
想定の挙動
- テナント 1(NS1 名前空間)での確認
- テナント 1 用の S3 バケットのデータ:アクセス可能
- テナント 2 用の S3 バケットのデータ:アクセス拒否
- テナント 2(NS2 名前空間)での確認
- テナント 2 用の S3 バケットのデータ:アクセス可能
- テナント 1 用の S3 バケットのデータ:アクセス拒否
テナント 1(NS1 名前空間)での確認
データセットで Athena から、テナント 1 用のテーブルを選択します。

このデータセットは、権限で許可されているためデータが表示されます。

続いては、権限が与えられていないテナント 2 用のテーブルを参照します。

データセットは作成できますが、データが表示されずにエラーになっています。

テナント 2(NS2 名前空間)での確認
こちらも同じ動作になりますが、テナント 2 用のバケットだけデータが表示されて、テナント 1 用のバケットはエラーになってます。
テナント 2 用のバケット

テナント 1 用のバケット

まとめ
名前空間を使うことで、マルチテナント用にセキュアな環境を作成することができます。
さらに、グループ管理を行うことにより、詳細な権限管理を楽に運用することができます。
また、Terraform を活用することで、各リソースの作成・管理作業も楽になるため合わせて使用することをおすすめします。
参考情報
ハンズオン資料
名前空間の作成 :: Amazon QuickSight ハンズオン
セッション資料
QuickSight の SaaS での活用
Amazon QuickSight の運用設計
Amazon QuickSight アカウント/ユーザー管理におけるポイント
Blog
Amazon S3 と Amazon Athena に対する Amazon QuickSight のきめ細かなアクセス制御のご紹介 | AWS ビッグデータブログ
Amazon QuickSight の分析機能をマルチテナントのアプリケーションに埋め込む | Amazon Web Services ブログ
Amazon QuickSight を利用した SaaS 環境でのマルチテナントアプリケーションのサポート | Amazon Web Services ブログ
テックブログ新着情報のほか、AWSやGoogle Cloudに関するお役立ち情報を配信中!
Follow @twitter2021年新卒入社。インフラエンジニアです。RDBが三度の飯より好きです。 主にデータベースやAWSのサーバレスについて書く予定です。あと寒いのは苦手です。
Recommends
こちらもおすすめ
-
AWS Summit Tokyo 2018 数字でみるAWSのすごさ
2018.6.1
-
QuickSightとAthenaを活用!データ分析入門
2017.12.11
Special Topics
注目記事はこちら
データ分析入門
これから始めるBigQuery基礎知識
2024.02.28

AWSの料金が 10 %割引になる!
『AWSの請求代行リセールサービス』
2024.07.16
