QuickSight の制限付き共有フォルダを作成する CLI コマンドが長いので CLI スケルトンを使って見やすくする

QuickSight の制限付き共有フォルダを作成する CLI コマンドが長いので CLI スケルトンを使って見やすくする

QuickSight の制限付き共有フォルダを作成する CLI コマンドで素直に Permissions を指定するととても横に長くなってしまったので、CLI スケルトンを使って JSON 形式にしました。
Clock Icon2024.09.24

コーヒーが好きな emi です。

QuickSight にはアセットを別のユーザーに共有する際に「共有フォルダ」というものを利用できます。アセットとは、データソース、データセット、分析、ダッシュボード等の QuickSight リソースの総称です。
共有フォルダへのアクセス権限を設定することにより、一部のユーザーやグループにアセットの閲覧・操作を許可できます。

emiki_qs_create_Restrictedsharedfolders_1

特に共有フォルダの中でも「制限付き共有フォルダ」という、より強い制限と分離が可能なものがあるのですが、こちらは QuickSight コンソールから作成することはできず、API でのみ作成できるリソースとなっています。

AWS CLI で API 実行し作成するのが手軽で良いのですが、制限付き共有フォルダを作成する create-folde コマンドや権限の設定をおこなう update-folder-permissions コマンドは、そのまま設定値を入れ込むととても横に長くなります。

既に以下のブログで制限付き共有フォルダを CLI スケルトンを使って作成しているのですが、私が改めて理解するために記事にします。

https://dev.classmethod.jp/articles/quicksight-restricted-folder/

以降の AWS CLI コマンドの実行は CloudShell を使っています。

CLI スケルトンを使わずシンプルに制限付き共有フォルダーを作成する場合

まずは CLI スケルトンを使わずシンプルにパラメーターを指定して制限付き共有フォルダーを作成する場合を紹介します。
以下のコマンドリファレンスに従い、パラメーターを入力します。

create-folder — AWS CLI 2.17.51 Command Reference

aws quicksight create-folder \
  --aws-account-id 123456789012 \
  --folder-id Sharedrestrictedfolder \
  --name "Shared restricted folder" \
  --folder-type RESTRICTED \
  --permissions Principal=arn:aws:quicksight:ap-northeast-1:123456789012:user/default/AWSReservedSSO_QuickSightFullAccess_af51xxxxxxxxxx/DataAnalysisUser1,Actions=quicksight:CreateFolder,quicksight:DescribeFolder,quicksight:CreateFolderMembership,quicksight:DeleteFolderMembership,quicksight:DescribeFolderPermissions
  • --folder-id Sharedrestrictedfolder
    • 任意のフォルダー ID を入力
  • --name "Shared restricted folder"
    • 任意のフォルダー名を入力
    • ここで入力したフォルダー名が QuickSight コンソール上で表示される
    • 日本語も可能
  • --folder-type RESTRICTED
    • RESTRICTED もしくは SHARED
    • 制限付き共有フォルダの場合は RESTRICTED を入力
  • --permissions
    • 制限付き共有フォルダに付与する権限を設定

PrincipalActions の確認方法はこのブログの後半で解説します。

▼実行結果(成功)

[cloudshell-user@ip-10-130-35-41 ~]$ aws quicksight create-folder \
>   --aws-account-id 123456789012 \
>   --folder-id Sharedrestrictedfolder \
>   --name "Shared restricted folder" \
>   --folder-type RESTRICTED \
>   --permissions Principal=arn:aws:quicksight:ap-northeast-1:123456789012:user/default/AWSReservedSSO_QuickSightFullAccess_af51xxxxxxxxxx/DataAnalysisUser1,Actions=quicksight:CreateFolder,quicksight:DescribeFolder,quicksight:CreateFolderMembership,quicksight:DeleteFolderMembership,quicksight:DescribeFolderPermissions
{
    "Status": 200,
    "Arn": "arn:aws:quicksight:ap-northeast-1:123456789012:folder/Sharedrestrictedfolder",
    "FolderId": "Sharedrestrictedfolder",
    "RequestId": "55e53ac6-90d9-4ba7-ab10-3feb0e401b16"
}
[cloudshell-user@ip-10-130-35-41 ~]$ 

このようにコマンドは成功するのですが、特に --permissions が横に長くてコマンドがちょっと見づらいですね。

CLI スケルトンを使って JSON 形式でパラメーター設定する

では、CLI スケルトンを使って JSON 形式でパラメーター設定していきます。
CLI スケルトンについては以下のブログも参照ください。
https://dev.classmethod.jp/articles/aws-cli-skeleton/

まず --generate-cli-skeleton パラメーターを指定して、JSON のひな形を表示します。

aws quicksight create-folder --generate-cli-skeleton

▼実行結果

[cloudshell-user@ip-10-132-69-169 ~]$ aws quicksight create-folder --generate-cli-skeleton
{
    "AwsAccountId": "",
    "FolderId": "",
    "Name": "",
    "FolderType": "SHARED",
    "ParentFolderArn": "",
    "Permissions": [
        {
            "Principal": "",
            "Actions": [
                ""
            ]
        }
    ],
    "Tags": [
        {
            "Key": "",
            "Value": ""
        }
    ],
    "SharingModel": "ACCOUNT"
}
[cloudshell-user@ip-10-132-69-169 ~]$ 

JSON のひな形が表示されました。
これを JSON ファイルとして保存します。ファイル名は何でもよいですが、今回は create-Restricted-shared-folders.json としました。

aws quicksight create-folder --generate-cli-skeleton > create-Restricted-shared-folders.json

▼実行結果

[cloudshell-user@ip-10-132-69-169 ~]$ aws quicksight create-folder --generate-cli-skeleton > create-Restricted-shared-folders.json
[cloudshell-user@ip-10-132-69-169 ~]$

lscat コマンドで、ちゃんとファイルが作成されているか確認します。

[cloudshell-user@ip-10-132-69-169 ~]$ ls
create-Restricted-shared-folders.json
[cloudshell-user@ip-10-132-69-169 ~]$ cat create-Restricted-shared-folders.json
{
    "AwsAccountId": "",
    "FolderId": "",
    "Name": "",
    "FolderType": "SHARED",
    "ParentFolderArn": "",
    "Permissions": [
        {
            "Principal": "",
            "Actions": [
                ""
            ]
        }
    ],
    "Tags": [
        {
            "Key": "",
            "Value": ""
        }
    ],
    "SharingModel": "ACCOUNT"
}
[cloudshell-user@ip-10-132-69-169 ~]$ 

保存されています。
このファイルをもとに、必要なパラメーターを埋めていきます。

JSON のひな形には --sharing-model(string)--parent-folder-arn(string) などのパラメーターも記載されていますが、今回は使用しません。

以下のように中身を書き直します。手元にメモしておいてください。

{
    "AwsAccountId": "123456789012",
    "FolderId": "Sharedrestrictedfolder2",
    "Name": "Shared restricted folder2",
    "FolderType": "RESTRICTED",
    "Permissions": [
        {
            "Principal": "arn:aws:quicksight:ap-northeast-1:123456789012:user/default/AWSReservedSSO_QuickSightFullAccess_af51xxxxxxxxxx/DataAnalysisUser1",
            "Actions": [
                "quicksight:CreateFolder",
                "quicksight:DescribeFolder",
                "quicksight:CreateFolderMembership",
                "quicksight:DeleteFolderMembership",
                "quicksight:DescribeFolderPermissions"
            ]
        }
    ]
}

先ほどの横に長いコマンドと見比べると、JSON 形式の方が全体が見やすいですね。
繰り返しますが PrincipalActions の確認方法はこのブログの後半で解説します。

では、先ほど作成した create-Restricted-shared-folders.json ファイルを vim などで開いて編集します。

vim create-Restricted-shared-folders.json

以下のようにファイルが開きます。

emiki_qs_create_Restrictedsharedfolders_2

まずは中身を全部削除します。
:%d と入力して Enter キーを押すと、全行が削除されます。

emiki_qs_create_Restrictedsharedfolders_3

emiki_qs_create_Restrictedsharedfolders_4

続いて :set paste と入力して Enter キーを押すと、貼り付けモードになります。Enter キーを押すと、カーソルが上にきます。

emiki_qs_create_Restrictedsharedfolders_5

i を押下して編集モードに移行します。i を押下すると画面下部に --INSERT (paste)-- と表示されます。

emiki_qs_create_Restrictedsharedfolders_6

先ほどの JSON 形式のパラメーターを貼り付けます。

emiki_qs_create_Restrictedsharedfolders_7

esc キーを押下して編集モードを抜けます。

:wq と入力して Enter キーを押すと、保存して終了します。

emiki_qs_create_Restrictedsharedfolders_8

以下のように CloudShell の画面に戻ります。

emiki_qs_create_Restrictedsharedfolders_9

cat コマンドで、ちゃんとファイルが作成されているか確認します。

[cloudshell-user@ip-10-132-69-169 ~]$ cat create-Restricted-shared-folders.json
{
    "AwsAccountId": "123456789012",
    "FolderId": "Sharedrestrictedfolder2",
    "Name": "Shared restricted folder2",
    "FolderType": "RESTRICTED",
    "Permissions": [
        {
            "Principal": "arn:aws:quicksight:ap-northeast-1:123456789012:user/default/AWSReservedSSO_QuickSightFullAccess_af51xxxxxxxxxx/DataAnalysisUser1",
            "Actions": [
                "quicksight:CreateFolder",
                "quicksight:DescribeFolder",
                "quicksight:CreateFolderMembership",
                "quicksight:DeleteFolderMembership",
                "quicksight:DescribeFolderPermissions"
            ]
        }
    ]
}
[cloudshell-user@ip-10-132-69-169 ~]$ 

保存されています。
では、作成した JSON ファイル create-Restricted-shared-folders.json を使って制限付き共有フォルダを作成します。

aws quicksight create-folder \
  --cli-input-json file://create-Restricted-shared-folders.json

--cli-input-json パラメーターで作成した JSON ファイルを指定します。

▼実行結果

[cloudshell-user@ip-10-132-69-169 ~]$ aws quicksight create-folder \
>   --cli-input-json file://create-Restricted-shared-folders.json
{
    "Status": 200,
    "Arn": "arn:aws:quicksight:ap-northeast-1:123456789012:folder/Sharedrestrictedfolder2",
    "FolderId": "Sharedrestrictedfolder2",
    "RequestId": "f953aa06-7a3b-48cf-8d0c-332c37a5b7d9"
}
[cloudshell-user@ip-10-132-69-169 ~]$ 

"Status": 200, が返ってくれば成功です。
QuickSight コンソールを開いて確認してみましょう。

emiki_qs_create_Restrictedsharedfolders_10

作成した制限付き共有フォルダが表示されていることを確認できました。

権限も、指定した権限「寄稿者」となっています。

emiki_qs_create_Restrictedsharedfolders_11-1

以上で、CLI スケルトンを使って JSON 形式でパラメーターを設定し制限付き共有フォルダを作成する方法を紹介しました。

以降は、Principal の ARN や Actions の設定値について解説します。

Principal の ARN 確認方法

個別 QuickSight ユーザーに権限を付与する場合

以下コマンドで QuickSight ユーザー一覧を確認します。

list-users — AWS CLI 2.17.51 Command Reference

まずはそのまま実行してみます。

aws quicksight list-users

▼実行結果

[cloudshell-user@ip-10-130-58-177 ~]$ aws quicksight list-users

usage: aws [options] <command> <subcommand> [<subcommand> ...] [parameters]
To see help text, you can run:

  aws help
  aws <command> help
  aws <command> <subcommand> help

aws: error: the following arguments are required: --aws-account-id, --namespace

[cloudshell-user@ip-10-130-58-177 ~]$ 

--aws-account-id--namespace が必須パラメーターであることが分かりました。この二つのパラメーターも指定しましょう。

aws quicksight list-users --aws-account-id 123456789012 --namespace default

▼実行結果

[cloudshell-user@ip-10-130-58-177 ~]$ aws quicksight list-users --aws-account-id 123456789012 --namespace default
{
    "UserList": [
        {
            "Arn": "arn:aws:quicksight:ap-northeast-1:123456789012:user/default/AWSReservedSSO_AWSAdministratorAccess_4b32xxxxxxxxxx/KitaniEmi",
            "UserName": "AWSReservedSSO_AWSAdministratorAccess_4b32xxxxxxxxxx/KitaniEmi",
            "Email": "xxx@xxx",
            "Role": "ADMIN",
            "IdentityType": "IAM",
            "Active": true,
            "PrincipalId": "federated/iam/AROAXXXXXXXXXX:KitaniEmi"
        },
        {
            "Arn": "arn:aws:quicksight:ap-northeast-1:123456789012:user/default/AWSReservedSSO_QuickSightFullAccess_af51xxxxxxxxxx/DataAnalysisUser1",
            "UserName": "AWSReservedSSO_QuickSightFullAccess_af51xxxxxxxxxx/DataAnalysisUser1",
            "Email": "yyy@yyy",
            "Role": "ADMIN",
            "IdentityType": "IAM",
            "Active": true,
            "PrincipalId": "federated/iam/AROAXXXXXXXXXX:DataAnalysisUser1"
        },
        {
            "Arn": "arn:aws:quicksight:ap-northeast-1:123456789012:user/default/AWSReservedSSO_AWSPowerUserAccess_e0b5xxxxxxxxxx/KitaniEmi",
            "UserName": "AWSReservedSSO_AWSPowerUserAccess_e0b5xxxxxxxxxx/KitaniEmi",
            "Email": "zzz@zzz",
            "Role": "ADMIN",
            "IdentityType": "IAM",
            "Active": true,
            "PrincipalId": "federated/iam/AROAXXXXXXXXXX:KitaniEmi"
        }
    ],
    "Status": 200,
    "RequestId": "36224ed8-9c1d-46b0-a2a9-5bd44af5c551"
}
[cloudshell-user@ip-10-130-58-177 ~]$

QuickSight ユーザー一覧が表示されました。この "Arn" の部分が、QuickSight ユーザーの ARN です。

ちなみに今回私は Control Tower 環境の IAM Identity Center ユーザーで AWS アカウントにログインし、許可セットの権限で QuickSight ユーザーを作成しているために、QuickSight ユーザー名が AWSReservedSSO_~~~ から始まる長い名前になっています。

QuickSight のグループに権限を付与する場合

以下コマンドで QuickSight グループ一覧を確認します。

list-groups — AWS CLI 2.17.51 Command Reference

まずはそのまま実行してみます。

aws quicksight list-groups

▼実行結果

[cloudshell-user@ip-10-130-58-177 ~]$ aws quicksight list-groups

usage: aws [options] <command> <subcommand> [<subcommand> ...] [parameters]
To see help text, you can run:

  aws help
  aws <command> help
  aws <command> <subcommand> help

aws: error: the following arguments are required: --aws-account-id, --namespace

[cloudshell-user@ip-10-130-58-177 ~]$ 

--aws-account-id--namespace が必須パラメーターであることが分かりました。この二つのパラメーターも指定しましょう。

aws quicksight list-groups --aws-account-id 123456789012 --namespace default

▼実行結果

[cloudshell-user@ip-10-130-58-177 ~]$ aws quicksight list-groups --aws-account-id 123456789012 --namespace default
{
    "GroupList": [
        {
            "Arn": "arn:aws:quicksight:ap-northeast-1:123456789012:group/default/Group1-shared-restricted-folder",
            "GroupName": "Group1-shared-restricted-folder",
            "Description": "Group1-shared-restricted-folder",
            "PrincipalId": "group/d-xxxxxxxxxx/dad44c5d-90ef-4e64-a334-7da864c52db0"
        }
    ],
    "Status": 200,
    "RequestId": "8e1533a2-96da-4842-9c74-8289cbc27ae4"
}
[cloudshell-user@ip-10-130-58-177 ~]$ 

QuickSight グループ一覧が表示されました。この "Arn" の部分が、QuickSight グループの ARN です。

制限付き共有フォルダに設定する権限の確認方法

--permissions では Actions= で QuickSight アクションが設定できるのですが、設定できるアクションのセットが決まっています。

QuickSight アクションには以下のドキュメントに記載のように様々なアクションがあります。

https://docs.aws.amazon.com/ja_jp/service-authorization/latest/reference/list_amazonquicksight.html

様々なアクションがありますが、制限付き共有フォルダに設定できる Actions は自由に設定できるわけではなく、特定のアクションに決まっています。ドキュメントには明確にアクションのセットは記載されていないようなのですが、Actions に指定できる権限のセットを間違えて create-folderupdate-folder-permissions コマンドを実行すると、以下のようなエラーが返ってきます。

An error occurred (InvalidParameterValueException) when calling the CreateFolder operation: Permissions contain unsupported permission sets for a restricted folder. Valid sets: [quicksight:CreateFolder, quicksight:DescribeFolder, quicksight:CreateFolderMembership, quicksight:DeleteFolderMembership, quicksight:DescribeFolderPermissions] or [quicksight:DescribeFolder]

(以下、機械翻訳)

CreateFolder オペレーションの呼び出し時にエラーが発生しました(InvalidParameterValueException): アクセス許可に、制限付きフォルダのサポートされていないアクセス許可セットが含まれています。有効なセットです: 有効なセット:[quicksight:CreateFolder、quicksight:DescribeFolder、quicksight:CreateFolderMembership、quicksight:DeleteFolderMembership、quicksight:DescribeFolderPermissions] または [quicksight:DescribeFolder]。

このエラーより、権限のセットは以下であると読み取れます。

  • 寄稿者(Contributor)
Actions=quicksight:CreateFolder,quicksight:DescribeFolder,quicksight:CreateFolderMembership,quicksight:DeleteFolderMembership,quicksight:DescribeFolderPermissions
  • 閲覧者(Viewer。日本語ドキュメントには「表示者」と記載されています)
Actions=quicksight:DescribeFolder

制限付き共有フォルダ内にアセットを作成する

アセットの作成は QuickSight コンソールから GUI で実施できます。
通常の共有フォルダの場合は作成済みのアセットを共有フォルダ内に移動できるのですが、制限付き共有フォルダはデータセットから制限付き共有フォルダ内で作成する必要があります。

制限付き共有フォルダに入り、「新規」から「データセット」をクリックします。

emiki_qs_create_Restrictedsharedfolders_12

今回はデータソースとして Athena を選択しました。データソース名を指定し Athena ワークグループを選択します。
emiki_qs_create_Restrictedsharedfolders_13

ちなみにもとになるデータは以下のブログで使用した CSV データを使っています。別アカウントの S3 バケットに配置した CSV ファイルを Athena 経由でクエリして持ってきています。
https://dev.classmethod.jp/articles/athena-quicksight-cross-account-s3-visualization/

制限付き共有フォルダでデータセットを作成しようとすると、以下のような注意の画面が出ます。
このまま「データセットの作成」をクリックします。
emiki_qs_create_Restrictedsharedfolders_14

データベースとテーブルを選択し、今回は「カスタム SQL を使用」をクリックします。
emiki_qs_create_Restrictedsharedfolders_15

カスタム SQL 名とカスタム SQL を入力し、「データの編集/プレビュー」をクリックします。
emiki_qs_create_Restrictedsharedfolders_16

「適用」をクリックすると、カスタム SQL の結果が表示されます。結果に問題が無ければ、「保存して視覚化」をクリックして分析の作成に進みます。
emiki_qs_create_Restrictedsharedfolders_17

「作成」をクリックします。
emiki_qs_create_Restrictedsharedfolders_18

今回は折れ線グラフを作成しました。「公開」をクリックしてダッシュボードを作成します。
emiki_qs_create_Restrictedsharedfolders_19

新しいダッシュボードとして公開します。ダッシュボード名を入力し、「ダッシュボードの公開」をクリックします。
emiki_qs_create_Restrictedsharedfolders_20

ダッシュボードが作成されました。
emiki_qs_create_Restrictedsharedfolders_21

制限付き共有フォルダに戻ると、作成したアセットが表示されています。制限付き共有フォルダへのアクセス権限があるユーザー以外はダッシュボードを閲覧できません。
emiki_qs_create_Restrictedsharedfolders_22

参考

https://docs.aws.amazon.com/ja_jp/quicksight/latest/user/folders.html

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.