QuickSightでカスタムロールを使ってCloudFormationテンプレートでのデータセット作成を自動化する

2022.04.05

いわさです。

少し前に、CloudFormationでS3バケットからQuickSightのデータソースとデータセットを作成する方法をご紹介させて頂きました。

しかし、この記事ではS3バケットへのアクセス権限についてはQuickSight管理画面からアクセス権限の設定を行っていました。
出来ればせっかく自動化を行おうとしているので、都度管理者の手でS3バケットのアクセス許可を追加するのは避けたいところです。

本日はQuickSightにカスタムロールを追加することで、アクセス許可の追加を不要にしてみましたのでその方法をご紹介します。

そもそもQuickSight管理画面で設定しているのって何なのか

そもそもこのQuickSight管理画面で設定している内容はどこに反映されているのでしょうか。

この件について、以下で少し触れられています。

IAM ユーザーが Amazon QuickSight にサインアップすると、QuickSight 管理ロール (これがデフォルトのロールです) の使用を選択できます。

ここでいうデフォルトの管理ロールがaws-quicksight-s3-consumers-role-v0aws-quicksight-service-role-v0です。
デフォルトはservice-roleを私用し、Athena、S3、Athenaクエリフェデレーション接続の場合はconsumers-roleを使用します。

Enterprise Editionであればカスタムロールが使える

先程のドキュメントには以下のようにも記載がありました。

既存の IAM ロールを QuickSight に渡すこともできます。

カスタムロールを割り当てて、管理画面を介さずに独自でIAMポリシーをメンテナンスする方法ですね。
こちらを活用するとCloudFormationで自動化する際もうまくいきそうです。
本日はこちらを使ってみましょう。

カスタムロール作成時にQuickSightを信頼させますが、本日時点でAWSのサービスから選択が出来ないので、カスタム信頼ポリシーから作成します。

信頼ポリシー

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "quicksight.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

カスタムロールに適切なポリシーをアタッチします。
CloudFormationで生成されたバケットを対象に動的にポリシーをアタッチしても良いと思います。

さいごに、QuickSightを信頼したカスタムロールは以下で選択することが出来ます。

テンプレートを使ってデプロイする

前回は事前にS3バケットを作成し、そのバケットへのアクセス許可をQuickSight管理画面で設定していました。
今回はS3バケットを作成し、そのまま必要なデータをアップロードした後にQuickSight管理画面を挟まずにデータセット作成まで行ってみます。

bucket.yaml

AWSTemplateFormatVersion: 2010-09-09
Description: ---
Resources: 
  HogeS3Bucket:
    Type: "AWS::S3::Bucket"
    Properties:
      BucketName: !Sub ${AWS::StackName}-${AWS::AccountId}
      PublicAccessBlockConfiguration:
        BlockPublicAcls: true
        BlockPublicPolicy: true
        IgnorePublicAcls: true
        RestrictPublicBuckets: true
Outputs:
  HogeS3Bucket:
    Value: !Ref HogeS3Bucket
    Export:
      Name: HogeS3Bucket

バケット作成後にデータファイルとマニフェストファイルをアップロードします。
このあたりは前回の記事と同じ方法です。

dataset.yaml

AWSTemplateFormatVersion: 2010-09-09
Description: ---
Resources: 
  HogeDataSource:
    Type: AWS::QuickSight::DataSource
    Properties: 
      AwsAccountId: !Ref AWS::AccountId
      Name: hoge-datasource
      DataSourceId: hoge-datasource-id
      Type: S3
      DataSourceParameters:
        S3Parameters: 
          ManifestFileLocation: 
            Bucket: !ImportValue HogeS3Bucket
            Key: hoge-manifest.json
      Permissions:
        - Actions:
            - quicksight:UpdateDataSourcePermissions
            - quicksight:DescribeDataSource
            - quicksight:DescribeDataSourcePermissions
            - quicksight:PassDataSource
            - quicksight:UpdateDataSource
            - quicksight:DeleteDataSource
          Principal: !Sub arn:aws:quicksight:${AWS::Region}:${AWS::AccountId}:user/default/hogeuser

  HogeDataSet:
    Type: AWS::QuickSight::DataSet
    Properties: 
      Name: hoge-dataset
      AwsAccountId: !Ref AWS::AccountId
      DataSetId: hoge-dataset-id
      ImportMode: SPICE
      PhysicalTableMap: 
        hoge-physical:
          S3Source: 
            DataSourceArn: !GetAtt HogeDataSource.Arn
            InputColumns: 
              -   Name: hoge1
                  Type: STRING
              -   Name: hoge2
                  Type: STRING
      LogicalTableMap:
        hoge-logical:
          Alias: hoge-logi
          DataTransforms: 
            - CastColumnTypeOperation:
                ColumnName: hoge2
                NewColumnType: INTEGER
          Source: 
            PhysicalTableId: hoge-physical
      Permissions:
        - Actions:
            - quicksight:UpdateDataSetPermissions
            - quicksight:DescribeDataSet
            - quicksight:DescribeDataSetPermissions
            - quicksight:PassDataSet
            - quicksight:DescribeIngestion
            - quicksight:ListIngestions
            - quicksight:UpdateDataSet
            - quicksight:DeleteDataSet
            - quicksight:CreateIngestion
            - quicksight:CancelIngestion
          Principal: !Sub arn:aws:quicksight:${AWS::Region}:${AWS::AccountId}:user/default/hogeuser

こちらは前回使ったデータセットテンプレートとほぼ同じです。
S3バケットだけスタックからエクスポートしたものを使っています。

QuickSightのアクセス許可を行わずにデータセット作成まで完了しました!

さいごに

本日は前回手動で管理画面から操作していたQuickSightのアクセス許可をカスタムロールを使うことで設定不要にさせてみました。
これで大部分は自動化出来るようになったのでは...。