特定の QuickSight アクションの組み合せで権限を付与する必要がある
UI 上は「所有者 (Owner)」のような名称で、データセットやデータソースに対して権限付与ができます。
しかし QuickSight API / terraform では、Owner というロール名を指定することはできず、対応するアクションの集合を明示的に指定する必要があります。
この UI と API の対応関係が分かりづらいため、terraform で構築する際にハマりやすいポイントになります。
しかし、このアクションの組み合わせは 少なくとも 2026/02/04 時点では 公式ドキュメント上で明示されておらず、
そのため実際に UI で Owner 権限を付与したリソースを CLI で確認して調査する必要がありました。
また、IAM プリンシパルではなく、QuickSight 上のプリンシパル
(arn:aws:quicksight:...) に対する権限設定になる点にも注意が必要です。
UI 上の Owner (所有者) 権限に相当するアクションについて調査した結果を、以下にまとめます。
※ 以下は UI で Owner 権限を付与した状態を CLI で確認した結果です。
QuickSight 側の仕様変更により、将来的に Actions が追加・変更される可能性があります。
データソースの Owner 権限
手動で Owner 権限を付与したデータソースに対して、AWS CLI で権限情報を取得すると下記のようになりました。
$ aws quicksight describe-data-source-permissions --aws-account-id xx --data-source-id xx
{
...
"Permissions": [
{
"Principal": "arn:aws:quicksight:...",
"Actions": [
"quicksight:PassDataSource",
"quicksight:DescribeDataSourcePermissions",
"quicksight:UpdateDataSource",
"quicksight:UpdateDataSourcePermissions",
"quicksight:DescribeDataSource",
"quicksight:DeleteDataSource"
]
}
]
}
つまり terraform で設定する場合は、以下のように権限を指定すれば UI 上の Owner 権限と同等になるようです。
resource "aws_quicksight_data_source" "this" {
...
permission {
principal = ...
actions = [
"quicksight:DescribeDataSource",
"quicksight:DescribeDataSourcePermissions",
"quicksight:PassDataSource",
"quicksight:UpdateDataSource",
"quicksight:UpdateDataSourcePermissions",
"quicksight:DeleteDataSource",
]
}
}
データセットの Owner 権限
手動で Owner 権限を付与したデータセットに対して、AWS CLI で権限情報を取得すると下記のようになりました。
$ aws quicksight describe-data-set-permissions --aws-account-id xx --data-set-id xx
{
...
"Permissions": [
{
"Principal": "arn:aws:quicksight:...",
"Actions": [
"quicksight:DeleteDataSet",
"quicksight:UpdateDataSetPermissions",
"quicksight:PutDataSetRefreshProperties",
"quicksight:CreateRefreshSchedule",
"quicksight:CancelIngestion",
"quicksight:ListRefreshSchedules",
"quicksight:PassDataSet",
"quicksight:UpdateRefreshSchedule",
"quicksight:DeleteRefreshSchedule",
"quicksight:DescribeDataSetRefreshProperties",
"quicksight:DescribeDataSet",
"quicksight:CreateIngestion",
"quicksight:DescribeRefreshSchedule",
"quicksight:ListIngestions",
"quicksight:UpdateDataSet",
"quicksight:DescribeDataSetPermissions",
"quicksight:DeleteDataSetRefreshProperties",
"quicksight:DescribeIngestion"
]
}
]
}
terraform で設定する場合は、以下のように記載すれば良さそうです。
resource "aws_quicksight_data_set" "this" {
...
permissions {
principal = ...
actions = [
"quicksight:DeleteDataSet",
"quicksight:UpdateDataSetPermissions",
"quicksight:PutDataSetRefreshProperties",
"quicksight:CreateRefreshSchedule",
"quicksight:CancelIngestion",
"quicksight:DeleteRefreshSchedule",
"quicksight:UpdateRefreshSchedule",
"quicksight:PassDataSet",
"quicksight:ListRefreshSchedules",
"quicksight:DescribeDataSetRefreshProperties",
"quicksight:DescribeDataSet",
"quicksight:CreateIngestion",
"quicksight:DescribeRefreshSchedule",
"quicksight:ListIngestions",
"quicksight:UpdateDataSet",
"quicksight:DescribeDataSetPermissions",
"quicksight:DeleteDataSetRefreshProperties",
"quicksight:DescribeIngestion",
]
}
}
※ データソースは
permission、データセットはpermissionsと
ブロック名が異なる点に注意してください。
S3 のデータソースのアクセス許可方法
QuickSight から S3 にアクセスするには、以下のいずれかの方法で権限を付与する必要があります。
- QuickSight のサービスロールに S3 バケットへのアクセス権限を付与する
- データソース専用の IAM ロールを作成し、それを使用する
(もちろん、S3 バケットポリシーで明示的に拒否していないことが前提です)
QuickSight を複数チームで利用している場合、前者は中央管理が必要になり運用が複雑になりがちです。
そのため、データソース用に IAM ロールを用意する方法の方が管理しやすいケースが多いと感じました。
以下はその例です。
resource "aws_iam_role" "quicksight_s3_access" {
name = "xx"
assume_role_policy = jsonencode({
Version = "2012-10-17"
Statement = [
{
Effect = "Allow"
Principal = {
Service = "quicksight.amazonaws.com"
}
Action = "sts:AssumeRole"
}
]
})
}
resource "aws_iam_role_policy" "quicksight_s3_access" {
name = "xx"
role = aws_iam_role.quicksight_s3_access.id
policy = jsonencode({
Version = "2012-10-17"
Statement = [
{
Effect = "Allow"
Action = [
"s3:GetObject",
"s3:GetObjectVersion",
"s3:ListBucket"
]
Resource = [
"arn:aws:s3:::${var.s3_bucket_id}",
"arn:aws:s3:::${var.s3_bucket_id}/*"
]
}
]
})
}
この IAM ロールを、QuickSight のデータソース定義で指定します。
resource "aws_quicksight_data_source" "this" {
...
parameters {
s3 {
manifest_file_location {
bucket = var.s3_bucket_id
key = ...
}
role_arn = aws_iam_role.quicksight_s3_access.arn # これ !!
}
}
}
S3 のデータセットは増分更新が使えない
公式ドキュメントにも記載がありますが、S3 をデータソースとするデータセットはフル更新のみ可能で、増分更新は利用できません。
このため、aws_quicksight_data_set リソースの
refresh_configuration 引数は指定できません(指定するとエラーになります)。
必要に応じて、aws_quicksight_refresh_schedule を使って更新スケジュールを設定します。
resource "aws_quicksight_refresh_schedule" "this" {
...
schedule {
refresh_type = "FULL_REFRESH"
...
}
}