いわさです。
Amazon QuickSight ではサービスロール経由で AWS の各サービスをデータソースとして構成します。
以下の記事ではデフォルトのサービスロールに毎回新しいバケットを追加するのが面倒だったのでカスタムロールで処理する方法を紹介しました。
本日 QuickSight のアップデートでデータソース作成時にカスタムロールを指定することが出来るようになっていました。
ユースケースとしては、管理者がアカウント全体のサービスロールで全ての S3 バケットへのアクセスをオフする運用だった場合でも、データソース作成時に S3 バケットへアクセス出来るカスタムロールを指定することで S3 へのアクセスを許可出来るというものです。
これによって QuickSight 全体で広い範囲で S3 バケットへのアクセスを提供するのではなく、カスタムロールを使った特定のデータソース経由でのみ指定の S3 バケットへアクセスが出来るので、より細かい権限の運用が必要な場合に利用出来そうです。
What's New at AWS の情報はこちらです。
こちらでは Athana についても可能になったと言及されていますが Athena データソースのカスタム IAM ロールは 2022 年 11 月中旬の API アップデートで利用が出来ていました。今回のアップデートで S3 データソースでも使えるようになった形です。
権限なしの状態で普通のデータソース作成してみる
以下のような CSV を S3 バケットにアップロードし、マニフェストファイルを使って QuickSight からデータソースを作成しましょう。
まずはサービスロールに S3 バケットへのアクセス権限が無い場合を試してみます。
hoge1,hoge2
aaa,111
bbb,222
マニフェストファイルはこのようなものを使いました。
{
"fileLocations": [
{
"URIs": [
"https://hoge0223quicksight.s3.amazonaws.com/hoge0223.csv"
]
}
],
"globalUploadSettings": {
"textqualifier": "\""
}
}
次のように取り込みに失敗しました。
AWS CLI でも試してみると次のように失敗になりますね。
% aws-v1 quicksight create-data-source --aws-account-id 123456789012 --data-source-id hoge0223dsbefore --name hoge0223dsbefore --type S3 --data-source-parameters file://hoge0223manifest-param.json
An error occurred (AccessDeniedException) when calling the CreateDataSource operation: Insufficient permission to access the manifest file
カスタムロールを指定する
ではカスタムロールを指定してみましょう。
この機能は AWS CLI の create-data-source コマンドで実装されました。
AWS CLI のバージョン 1.27.76 と 2.10.2 以上から利用が可能です。
ちなみに、この記事を書き始めたときはコマンドのリファレンスバージョンが 1.27.76 だったのですが、書いてる最中に 1.27.77 になっていてリファレンスドキュメントの更新スピード速いなと思いました。
IAM ロールを用意
カスタムロールの信頼ポリシーで QuickSight を信頼する必要があります。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "quicksight.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
今回は適当なマネージドポリシーをアタッチしていますが、運用時にはこのポリシーをデータソースごとにどのような条件を設定するべきか検討が必要だと思います。
データソースを作成
ではカスタムロールを指定してデータソースを作成します。
% cat hoge0223manifest-param.json
{
"S3Parameters": {
"ManifestFileLocation": {
"Bucket": "s3://hoge0223quicksight",
"Key": "hoge0223manifest-param.json"
},
"RoleArn": "arn:aws:iam::123456789012:role/hoge0223s3accessrole"
}
}
% aws-v1 quicksight create-data-source --aws-account-id 123456789012 --data-source-id hoge0223ds --name hoge0223ds --type S3 --data-source-parameters file://hoge0223manifest-param.json
{
"Status": 202,
"Arn": "arn:aws:quicksight:ap-northeast-1:123456789012:datasource/hoge0223ds",
"DataSourceId": "hoge0223ds",
"CreationStatus": "CREATION_IN_PROGRESS",
"RequestId": "45a3963f-9ea2-4770-88d2-5e8e128ee8ff"
}
データソースへパーミッションを追加します。
% cat hoge0223permission.json
[
{
"Principal": "arn:aws:quicksight:ap-northeast-1:123456789012:user/default/cm-iwasa.takahito/cm-iwasa.takahito",
"Actions": [
"quicksight:UpdateDataSourcePermissions",
"quicksight:DescribeDataSource",
"quicksight:DescribeDataSourcePermissions",
"quicksight:PassDataSource",
"quicksight:UpdateDataSource",
"quicksight:DeleteDataSource"
]
}
]
% aws-v1 quicksight update-data-source-permissions --aws-account-id 123456789012 --data-source-id hoge0223ds --grant-permissions file://hoge0223permission.json
{
"Status": 200,
"DataSourceArn": "arn:aws:quicksight:ap-northeast-1:123456789012:datasource/hoge0223ds",
"DataSourceId": "hoge0223ds",
"RequestId": "53076600-61f1-497d-8700-55deff57d92f"
}
データソースを使う
作成したデータソースを使ってデータセットを作成します。
S3 バケットへアップロードした CSV データが取り込まれていますね。
ちなみに、カスタムロールを指定した場合はデータソースの編集画面でどのカスタムロールが構成されているのかを確認することが出来ます。
このプロパティは読み取り専用でコンソール上では確認のみが可能でした。
指定していない場合は特に表示されません。
さいごに
本日は Amazon QuickSight の S3 データソース作成時にカスタムロールを指定して、権限をオーバーライド出来るようになったので使ってみました。
ロールやポリシーの運用が必要なので手間は増えますが、デフォルトの広い範囲で権限を QuickSight の与えておく必要がなくなるので、データソースの権限管理を細かく行いたいという方針の場合に役に立ちそうです。