0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

terraform で QuickSight の S3 データセット作成時にハマったポイント

Posted at

特定の 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"
    ...
  }
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?