[アップデート] Amazon QuickSight のタグベース RLS で OR 条件を使って柔軟な設定が出来るようになりました

2023.04.30

いわさです。

Amazon QuickSight のデータセットには RLS (Row-Level Security) の機能が備わっており、データにアクセスするユーザーに応じて表示出来る行を制御することが出来ます。
QuickSight の RLS は大きくユーザーベースとタグベースの 2 つの制御が可能です。

前者のユーザーベースルールではダッシュボードなどへアクセスするユーザーの情報に基づいてルールを設定することが出来ます。
一方で、QuickSight には匿名ユーザーへの読み取りを許可するリーダーセッションキャパシティという機能があり、その場合はユーザーベースのルールを使うことが出来ません。

この場合は匿名ユーザー向けのセッションを生成する際にタグを追加のコンテキストとして設定することで、セッションタグに応じた RLS を使う形となります。
以前次の記事で使ったことがあります。

そのタグベース RLS ですが、実は今まで複数の条件を指定したい場合は AND 条件のみとなっていたのですが、先日のアップデートで OR 条件を追加することが出来るようになりました。

これで単一のデータセットで様々なセッションタグのパターンに対応出来るようになりました。
実際に使ってみましたので紹介します。

匿名アクセスが可能なサンプルダッシュボードをまず作成

次のような CSV ファイルを QuickSight へ直接アップロードしてデータセットを作成します。
テナント ID や、それ以外にもいくつかのコード列が含まれています。
このままだと全テナントや全アイテムのデータが表示されますが、これを後ほど RLS でコントロールしてみましょう。

tenant,city,itemtype,price
tenant1,city1,item1,100
tenant1,city1,item2,200
tenant1,city2,item1,400
tenant1,city2,item2,500
tenant1,city3,item1,700
tenant1,city3,item2,800
tenant2,city1,item1,100
tenant2,city1,item2,200
tenant2,city2,item1,400
tenant2,city2,item2,500
tenant2,city3,item1,700
tenant2,city3,item2,800

データセット作成後に次のようにテーブルビジュアルを使った分析を作成しました。

その後ダッシュボード化して、パブリックアクセスを有効化します。
QuickSight のサブスクリプション管理画面からリーダーセッションを事前にサブスクライブしています。
なおこちらは別途追加料金が発生するので、お試しになる方はご注意ください。

次のように認証されていない状態でダッシュボードへアクセス出来ることが確認出来ました。

タグベースルールを設定

では RLS を設定しましょう。
データセットの概要タブから「行レベルのセキュリティ」を選択します。
次の状態は「制限なし」と表示されているので、まだ RLS が設定されていない状態です。

前述のとおり今回はタグベースのルールを設定します。
対象データセットのどの列をどのタグキーと関連付けするか条件を設定します。

ここでは tenant 列と city 列にそれぞれタグキーを設定していますね。
赤枠内にhogetenant AND hogecityと表示されています。この赤枠内は今回追加されたもので以前は存在していませんでしたがデフォルトは AND で設定されていることがわかります。

RLS を設定したデータセットは条件に該当する場合でなければ次のようにアクセスができなくなります。
ダッシュボード自体の表示は出来ましたが、ビジュアル内で「You don't have permission to access this data.」と表示されますね。

セッションタグを指定する

ではセッションタグを指定してダッシュボード URL を取得しましょう。
QuickSight を外部へ組み込むための API があり、そちらで指定します。

次のハイライト部分で、先程 RLS ルールで設定したセッションタグを指定しています。

% cat hoge.json                                                                         
{
    "AwsAccountId": "123456789012",
    "SessionLifetimeInMinutes": 15,
    "Namespace": "default",
    "SessionTags": [
        {
            "Key": "hogetenant",
            "Value": "tenant1"
        },
        {
            "Key": "hogecity",
            "Value": "city1"
        }
    ],
    "AuthorizedResourceArns": [
        "arn:aws:quicksight:ap-northeast-1:123456789012:dashboard/3e4d6067-60c7-4ca0-b946-62a1724c4dc0"
    ],
    "ExperienceConfiguration": {
        "Dashboard": {
            "InitialDashboardId": "3e4d6067-60c7-4ca0-b946-62a1724c4dc0"
        }
    }
}
% aws quicksight generate-embed-url-for-anonymous-user --cli-input-json file://hoge.json
{
    "Status": 200,
    "EmbedUrl": "https://ap-northeast-1.quicksight.aws.amazon.com/embed/87b95108851f4ab792f9dcb5466c3e3d/dashboards/3e4d6067-60c7-4ca0-b946-62a1724c4dc0?code=AYABeCfmou3VssfzUQEJ3ViOo0oAAAABAAdhd3Mta21zAFBhcm46YXdzOmttczphcC1ub3J0aGVhc3QtMTozNjcwOTQ1NjE4OTQ6a2V5LzkyZDU3MjEzLTc0MjItNGNhOC1iYWZiLTg2MDFjNGZkODgyNwC4AQIBAHgeDGL3XAnX5chwrubXLtqmn-xwPT7Th-AyeZ72nfHdvwEZu0UJ-QwKp6m-jJGo7oCCAAAAfjB8BgkqhkiG9w0BBwagbzBtAgEAMGgGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMFaRpDHrXCNOK1CISAgEQgDuNJnW5alsjv47qLNp0xFVDIj_9QlesSApr1X7Mo7apomr2cxuUqMnYalwmIf9war2UMDSnNac-6IlWRAIAAAAADAAAEAAAAAAAAAAAAAAAAAD574O9EveX-AmDcMd2xQp9_____wAAAAEAAAAAAAAAAAAAAAEAAACb2VfWN8nDh_qzTUIZqsoPA-wAW-6fB91Zh099tj6ZWwvuqDwv7PZJJeSqjlDyJwrQ7aCwk2sGG0zT0OMG0L12cOUYM8eAnTz_gqkoFnFe3qDFL50MmeqsjqgtykYYDG11435wLYaCGZJoYRUVJ8tCZS0avfLUx5hSjBPdcEjJdmI7CnzGc-mdHehR8Lj1W1h0MYOb6o8L6FWGv_OwwVVHijDdY0Cg5x_Xtrgy&identityprovider=quicksight&isauthcode=true",
    "RequestId": "3bc66e9d-4cb8-4139-830f-bbcbee0e9ba3",
    "AnonymousUserArn": "arn:aws:quicksight:ap-northeast-1:123456789012:anonymousUser/default/732d1366cfc8480496f01c76bdb8c9e7"
}

EmbedUrlがセッションを利用するためのトークンが埋め込まれた一時的な URL です。
実際にはこの URL を外部アプリケーションに組み込んで利用します。外部アプリケーションのコンテキスト(例えばマルチテナントでのテナントコンテキストとか)としてタグセッションを活用することが想定されています。
しかし、直接アクセスすることも出来るので今回は直接 URL へアクセスします。

tenant 列が tenant1 かつ city 列が city1 の行のみが表示されていることが確認出来ますね。

OR 条件を設定

もう一度 RLS 設定画面に戻って、今度は AND ではなく OR 条件を設定してみましょう。
まず、タグのマッピングについては設定済みの内容が使用可能で、OR 条件にともなって追加で構成する必要はありません(追加も可能)

それぞれの条件ごとにマッピングされたタグのどれを使うかを構成出来ます。

開始するには次のようにAdd OR Conditionボタンを押すことで追加の条件が OR として作成されます。

ここでマッピング済みのタグを選択します。マッピングタグが複数あれば必要に応じて複数のタグを AND 条件として追加出来ます。

また、OR 条件の各要素についてもいつでも変更が可能です。
今回は「hogetenant または hogecity」という条件に変更してみたいので、既存の「hogetenant かつ hogecity」の条件も変更します。

変更後は「更新」操作を忘れないようにしましょう。

これで次のように OR 条件が構成されました。

先程と同じようにセッションタグを指定して組み込み URL を発行し、アクセスしてみます。
今度は「tenant 列が tenant1、または city 列が city1」という条件に変わったので先程と表示対象の行が変わったことが確認できます。

AND と OR を組み合わせることも出来る

また、OR 条件のそれぞれの要素内で複数のタグを組み合わせた場合は引き継ぎき AND 条件となるので、AND 条件と OR 条件を組み合わせることが出来ます。
例えば、次のように構成した場合は「tenant 列が hogetenant の中で、itemtype 列が hogeitem または city 列が hogecity のもの」という条件になります。

セッションタグを次のように指定してアクセスしてみます。

% cat hoge.json
{
    "AwsAccountId": "123456789012",
    "SessionLifetimeInMinutes": 15,
    "Namespace": "default",
    "SessionTags": [
        {
            "Key": "hogetenant",
            "Value": "tenant1"
        },
        {
            "Key": "hogecity",
            "Value": "city1"
        },
        {
            "Key": "hogeitem",
            "Value": "item1"
        }
    ],
    "AuthorizedResourceArns": [
        "arn:aws:quicksight:ap-northeast-1:123456789012:dashboard/3e4d6067-60c7-4ca0-b946-62a1724c4dc0"
    ],
    "ExperienceConfiguration": {
        "Dashboard": {
            "InitialDashboardId": "3e4d6067-60c7-4ca0-b946-62a1724c4dc0"
        }
    }
}
% aws quicksight generate-embed-url-for-anonymous-user --cli-input-json file://hoge.json
{
    "Status": 200,
    "EmbedUrl": "https://ap-northeast-1.quicksight.aws.amazon.com/embed/6a418cc53a7b484e801cf7477c699b6a/dashboards/3e4d6067-60c7-4ca0-b946-62a1724c4dc0?code=AYABeMOkGv1X_RjoEPWf5XMstF0AAAABAAdhd3Mta21zAFBhcm46YXdzOmttczphcC1ub3J0aGVhc3QtMTozNjcwOTQ1NjE4OTQ6a2V5LzkyZDU3MjEzLTc0MjItNGNhOC1iYWZiLTg2MDFjNGZkODgyNwC4AQIBAHgeDGL3XAnX5chwrubXLtqmn-xwPT7Th-AyeZ72nfHdvwEdsckGmdyYmOj1WJDQ5vIpAAAAfjB8BgkqhkiG9w0BBwagbzBtAgEAMGgGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMwBpua3G-kStFn45QAgEQgDvj74lOZ0SWx_Gud6BIomYc35rY3EyFVjAsT3N1vOiyyFmuN0KiYCMHIru5-HLqJverds92_fPethE7_gIAAAAADAAAEAAAAAAAAAAAAAAAAACZDIxd72t6PYKZn5it-sSd_____wAAAAEAAAAAAAAAAAAAAAEAAACb3LRC5V0xRmAopICKg0N75cNSos9oiirAlJxjU98XFwZaLRSm4_yTaMTcmhpyEaeDSud_jTqJyzLChTopsSR41YxijuKfofk-bb8eWtwKye4zJejlPlEUJ7_mlO79dG8d8XtPtxVdSnjZk97QkgRxSp_tyLHChvWoyN5NniytC3m2FPmFRWMhhGIqgkO0_XJZ_f-0N9aOr1Ww9AbJk3_Bpau-yOxPjOHiVIg8&identityprovider=quicksight&isauthcode=true",
    "RequestId": "8b8d2d2e-9f12-4623-9bd4-a1b38cc94140",
    "AnonymousUserArn": "arn:aws:quicksight:ap-northeast-1:123456789012:anonymousUser/default/92956f4c94c5498eaccee2deb90b39a4"
}

期待どおりの制御が出来ていることが確認出来ますね。

さいごに

本日は Amazon QuickSight のタグベース RLS で OR 条件が使えるようになったので設定方法などを紹介しながら実際に使ってみました。

匿名アクセス可能なダッシュボードで RLS を使いたい場合により柔軟な設定が出来るようになりました。
特に、マルチテナントアプリケーションから利用する際は RLS はほぼ必須だと思うので、シンプルにテナントで絞り込む以外にも使いやすくなったのではないでしょうか。