この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
いわさです。
少し前に、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管理画面を挟まずにデータセット作成まで行ってみます。
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のアクセス許可をカスタムロールを使うことで設定不要にさせてみました。
これで大部分は自動化出来るようになったのでは...。