QuickSightでカスタムロールを使ってCloudFormationテンプレートでのデータセット作成を自動化する
いわさです。
少し前に、CloudFormationでS3バケットからQuickSightのデータソースとデータセットを作成する方法をご紹介させて頂きました。
しかし、この記事ではS3バケットへのアクセス権限についてはQuickSight管理画面からアクセス権限の設定を行っていました。
出来ればせっかく自動化を行おうとしているので、都度管理者の手でS3バケットのアクセス許可を追加するのは避けたいところです。
本日はQuickSightにカスタムロールを追加することで、アクセス許可の追加を不要にしてみましたのでその方法をご紹介します。
そもそもQuickSight管理画面で設定しているのって何なのか
そもそもこのQuickSight管理画面で設定している内容はどこに反映されているのでしょうか。
この件について、以下で少し触れられています。
IAM ユーザーが Amazon QuickSight にサインアップすると、QuickSight 管理ロール (これがデフォルトのロールです) の使用を選択できます。
ここでいうデフォルトの管理ロールがaws-quicksight-s3-consumers-role-v0
と aws-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管理画面を挟まずにデータセット作成まで行ってみます。
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
バケット作成後にデータファイルとマニフェストファイルをアップロードします。
このあたりは前回の記事と同じ方法です。
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のアクセス許可をカスタムロールを使うことで設定不要にさせてみました。
これで大部分は自動化出来るようになったのでは...。