QuickSight でリーダーセッションキャパシティで使えるタグベースの RLS を使ってみた
いわさです。
QuickSight の Enterprise Edition では RLS(行レベルセキュリティ) 機能があります。
QuickSight の RLS にはユーザー毎設定と、匿名ユーザー向けのタグベース設定の2つが利用出来ます。
匿名ユーザー向けのタグベース設定については以前に機能だけ紹介したのですが、リーダーセッションキャパシティが前提として必要になるため試せませんでした。
しかし、先日リーダーセッションキャパシティを有効化してみたので、ついでにタグベースのRLSを試すことが出来ましたので、どんな感じになるのかをご紹介します。
データセットごとにRLSを有効化する
まずは以下のようなCSVファイルをアップロードしデータセットを作成します。
表示対象のcity
を制御したいと思います。
city,item,price city1,1,100 city1,2,200 city1,3,300 city2,1,400 city2,2,500 city2,3,600 city3,1,700 city3,2,800 city3,3,900
そして、データセット毎に行レベルのセキュリティを設定していきます。
データセットの項目には「列レベルのセキュリティ」機能もありますが、こちらはタグベースでの制御には本日時点では対応していません。
行レベルのセキュリティ設定では、前述のとおりユーザーベースのルールとタグベースのルールがあります。
今回はタグベースのルールを使って、リーダーセッションキャパシティを利用した際のRLS機能を有効にします。
タグベースのルールとしては、hogecity
タグを指定したときに、そのタグ値に一致するcity
を許可するように設定します。
RLSを有効化すると、データセットを使っている分析やダッシュボードに即時反映されます。
そのため、匿名パブリックアクセス以外で閲覧する場合のためにユーザーベースのRLSも併用すると良いようです。
以下のように作成者も明示的に権限が割り当てられていないと閲覧出来なくなることを知りました。
埋め込む
ではここからダッシュボードの埋め込みを行います。
ポイントとしては、リーダーセッションキャパシティを有効化している場合、APIから一時的なリーダーセッションを払い出します。
前回の記事ではリーダーセッションキャパシティ有効化後に1クリック埋め込みURLを使いましたがこちらは利用出来ません。
例えば、AWS CLIの場合だとgenerate-embed-url-for-anonymous-user
を使うことで、埋め込み用のURLを取得することが出来ます。
その際に、「セッションタグ」を指定することで、払い出したセッションに対してタグを指定することが出来ます。
セッションタグでhogecity:city1
を指定しています。
払い出し時の共通項目として、authorized-resource-arns
にはアクセスを許可するダッシュボードをARNのリストで指定します。
また、experience-configuration
は最初に表示するダッシュボードのIDを指定します。
$ aws quicksight generate-embed-url-for-anonymous-user \ --aws-account-id 123456789012 \ --namespace default \ --session-lifetime-in-minutes 15 \ --authorized-resource-arns '["arn:aws:quicksight:ap-northeast-1:123456789012:dashboard/bae41127-701b-45c0-a33f-6ff5ba5483c9"]' \ --experience-configuration '{"Dashboard": {"InitialDashboardId": "bae41127-701b-45c0-a33f-6ff5ba5483c9"}}' \ --session-tags '[{"Key": "hogecity", "Value": "city1"}]' \ --profile hoge { "Status": 200, "EmbedUrl": "https://ap-northeast-1.quicksight.aws.amazon.com/embed/0a0d5208f1b84c4b992cf163fe2680ee/dashboards/bae41127-701b-45c0-a33f-6ff5ba5483c9?code=AYABeBu6iQDnwRsGg42dJobzDLIAAAABAAdhd3Mta21zAFBhcm46YXdzOmttczphcC1ub3J0aGVhc3QtMTozNjcwOTQ1NjE4OTQ6a2V5LzkyZDU3MjEzLTc0MjItNGNhOC1iYWZiLTg2MDFjNGZkODgyNwC4AQIBAHh19lpIdHJLvWmpW7433A8711o_o_2vfnBuxyXbJJdfkwGtDyhhvrUUMNcRM85eZC-oAAAAfjB8BgkqhkiG9w0BBwagbzBtAgEAMGgGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMSDdQ-FEAs7dXhT4pAgEQgDvz8oidi-A0LpdHgEOEtbDeKbAH_nHwW_wqe_cmoTgt0La8SmvN1VI6xW5bHyr6F2p7DY73WxzxSwbfWQIAAAAADAAAEAAAAAAAAAAAAAAAAABIwntf8oaykSZr2_nM81ZP_____wAAAAEAAAAAAAAAAAAAAAEAAACbddx37UPlJRBADa8g1HqIEOUxjhDlU2GgjswUVaUrli2kFA8-dSUv2EG_0yetgkJm6ib-CTpCgSumw6Lz1R-aIJVoWQ23_vr-5lBY_K56TZ9rV3NXJ-e6SwEdIbKKi71ur2D3kU6D4uN81RK9hCSiB6kmWRrfkK4WRwu_RAPeqGBUEYpwb3Yrxh3hItfhaHpxBgVl1auoVAXfNr6XkVH6LaZgPIOzb8F-8b3G&identityprovider=quicksight&isauthcode=true", "RequestId": "be72c47c-301c-4b66-ab01-c0e12cc5167f" }
上記から得られたEmbedUrl
を適当なHTMLコンテンツへ埋め込んで外部ホスティングさせました。
事前にドメインはホワイトリストへ追加済みです。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <p> <h1>hoge quicksight 3</h1> </p> <iframe width="960" height="720" src="https://ap-northeast-1.quicksight.aws.amazon.com/embed/...&isauthcode=true"> </iframe> </body> </html>
期待どおりcity1
のレコードのみが表示されています。
同様に、セッションタグにcity2
を指定して別の埋め込みURLを発行してみましょう。
この場合は、city2
のレコードだけ表示することが出来ました。
複数のタグ値を対象にする
city1
とcity3
など複数のタグ値を対象としたい場合は、タグルールで区切り文字を使うことが出来ます。
カンマを区切り文字に設定し、カンマ区切りでセッションタグを指定してみます。
$ aws quicksight generate-embed-url-for-anonymous-user \ --aws-account-id 123456789012 \ --namespace default \ --session-lifetime-in-minutes 15 \ --authorized-resource-arns '["arn:aws:quicksight:ap-northeast-1:123456789012:dashboard/bae41127-701b-45c0-a33f-6ff5ba5483c9"]' \ --experience-configuration '{"Dashboard": {"InitialDashboardId": "bae41127-701b-45c0-a33f-6ff5ba5483c9"}}' \ --session-tags '[{"Key": "hogecity", "Value": "city1,city3"}]' \ --profile hoge
city1
とcity3
どちらのデータも表示されるようになりました。
city2
は表示対象外となっています。
セッションタグなしや、1クリック埋め込みURLの場合
セッションタグを指定せずに組み込みURLを発行した場合や、ダッシュボード共有画面から取得した1クリック埋め込みURLの場合は以下のように権限がない旨表示されました。
さいごに
本日は、タグベースのRLSを使ってみました。
外部のWebシステムなどに埋め込むダッシュボードにて、QuickSight側でリーダー管理をせずにリーダーセッションキャパシティを使いたい際は、外部システム側でタグを使って動的に埋め込みURLを発行することでアクセス可能なデータを制御させることが出来ます。
ルールの管理と、URL発行処理と、いくつかの要素を組み合わせる必要があるのでちょっとコントロールが大変そうですが、リーダーセッションキャパシティでもセキュリティコントロールする方法があるという点を知っておくと良いと思います。