QuickSightの分析を、業務運用を想定して別の名前空間にコピーしてみた

業務運用を考えるヒントになれば幸いです
2023.05.17

はじめに

データアナリティクス事業本部 BIチームのkariyaです。
QuickSightでは、テンプレートを作成することで別の名前空間に分析をコピーすることができます。
実際に業務運用をする想定で、コピーの際にどのような手順になり、どのような注意が必要か考えてみました。

やりたいこと

  • 複数のデータセットを使用した分析を作成する
  • カスタム名前空間で作成した分析を、デフォルト名前空間にコピーする
  • 分析のコピーの際に、ユーザーのグループ単位で権限をつける

やってみる

【カスタム名前空間】複数のデータセットを使用した分析を作成する

1つのデータセットがあれば分析は可能ですが、業務では複数のデータセットを使用した分析を作成する場合もあるかと思います。
今回は売上と在庫のデータセットを使用した、2つのシートがある分析を作成してみます。一部のデータは条件付き書式設定でハイライトをしています。

売上サンプルデータ(クリックすると展開します)
id,product_id,product_name,order_date,price,quantity
1,1001,Apple,2022-01-01,500,2
2,1002,Banana,2022-01-01,1500,1
3,1001,Apple,2022-01-02,500,3
4,1003,Grape,2022-01-03,2000,1
5,1002,Banana,2022-01-03,1500,1
6,1001,Apple,2022-01-03,500,5
7,1003,Grape,2022-01-04,2000,2
8,1001,Apple,2022-01-05,500,1
9,1002,Banana,2022-01-06,1500,1
10,1001,Apple,2022-01-07,500,4
11,1003,Grape,2022-01-08,2000,3
12,1002,Banana,2022-01-09,1500,1
13,1001,Apple,2022-01-10,500,2
14,1003,Grape,2022-01-10,2000,1
15,1002,Banana,2022-01-11,1500,1
16,1001,Apple,2022-01-12,500,6
17,1003,Grape,2022-01-13,2000,2
18,1002,Banana,2022-01-13,1500,1
19,1001,Apple,2022-01-14,500,3
20,1003,Grape,2022-01-15,2000,1
21,1002,Banana,2022-01-15,1500,1
22,1001,Apple,2022-01-16,500,2
23,1003,Grape,2022-01-17,2000,3
24,1002,Banana,2022-01-18,1500,1
25,1001,Apple,2022-01-19,500,4
26,1003,Grape,2022-01-20,2000,1
27,1002,Banana,2022-01-21,1500,1
28,1001,Apple,2022-01-22,500,5
29,1003,Grape,2022-01-23,2000,2
30,1002,Banana,2022-01-24,1500,1
在庫サンプルデータ(クリックすると展開します)
id,product_id,product_name,stock_date,stock_quantity
1,1001,Apple,2022-01-01,100
2,1002,Banana,2022-01-01,80
3,1003,Grape,2022-01-01,60
4,1001,Apple,2022-01-08,85
5,1002,Banana,2022-01-08,120
6,1003,Grape,2022-01-08,50
7,1001,Apple,2022-01-15,75
8,1002,Banana,2022-01-15,90
9,1003,Grape,2022-01-15,40
10,1001,Apple,2022-01-22,65
11,1002,Banana,2022-01-22,110
12,1003,Grape,2022-01-22,35
13,1001,Apple,2022-01-29,95
14,1002,Banana,2022-01-29,130
15,1003,Grape,2022-01-29,45
16,1001,Apple,2022-02-05,110
17,1002,Banana,2022-02-05,150
18,1003,Grape,2022-02-05,55
19,1001,Apple,2022-02-12,90
20,1002,Banana,2022-02-12,120
21,1003,Grape,2022-02-12,60
22,1001,Apple,2022-02-19,100
23,1002,Banana,2022-02-19,80
24,1003,Grape,2022-02-19,65
25,1001,Apple,2022-02-26,85
26,1002,Banana,2022-02-26,150
27,1003,Grape,2022-02-26,50
28,1001,Apple,2022-03-05,95
29,1002,Banana,2022-03-05,140
30,1003,Grape,2022-03-05,45


【カスタム名前空間】分析とデータセットのARNを調べる

テンプレートの作成には、分析とデータセットのARNが必要です。 CloudShellで、分析のリストを出力します。jqを使用して更新日時の降順で出力します。

aws quicksight list-analyses --aws-account-id 999999999999 --output json | jq '.AnalysisSummaryList | sort_by(.LastUpdatedTime) | reverse | .[] | {ARN: .Arn, Name: .Name, Id: .AnalysisId, LastUpdated: .LastUpdatedTime} | select(.Name | contains("カスタム"))'
{
  "ARN": "arn:aws:quicksight:ap-northeast-1:999999999999:analysis/7fc9afc0-1db3-4245-bfdf-042d5ec4c519",
  "Name": "分析_カスタム空間",
  "Id": "7fc9afc0-1db3-4245-bfdf-042d5ec4c519",
  "LastUpdated": "2023-05-12T08:34:25.224000+00:00"
}

同様に、データセットのリストを出力します。

aws quicksight list-data-sets --aws-account-id 999999999999 --output json | jq '.DataSetSummaries | sort_by(.LastUpdatedTime) | reverse | .[] | select(.Name | contains("カスタム"))'
{
  "Arn": "arn:aws:quicksight:ap-northeast-1:999999999999:dataset/c87aae91-83ee-43df-aee4-d1c43bdcd835",
  "DataSetId": "c87aae91-83ee-43df-aee4-d1c43bdcd835",
  "Name": "カスタム空間_在庫",
  "CreatedTime": "2023-05-16T09:00:30.168000+00:00",
  "LastUpdatedTime": "2023-05-16T09:01:11.781000+00:00",
  "ImportMode": "SPICE",
  "RowLevelPermissionTagConfigurationApplied": false,
  "ColumnLevelPermissionRulesApplied": false
}
{
  "Arn": "arn:aws:quicksight:ap-northeast-1:999999999999:dataset/76349082-b425-4eac-97a5-6e98e0304eb2",
  "DataSetId": "76349082-b425-4eac-97a5-6e98e0304eb2",
  "Name": "カスタム空間_売上",
  "CreatedTime": "2023-05-12T08:28:28.816000+00:00",
  "LastUpdatedTime": "2023-05-16T08:58:31.006000+00:00",
  "ImportMode": "SPICE",
  "RowLevelPermissionTagConfigurationApplied": false,
  "ColumnLevelPermissionRulesApplied": false
}

【カスタム名前空間】テンプレートを作成する

先ほど取得した分析とデータセットのARNを使用し、テンプレートを作成します。
今回はデータセットが複数あるため、DataSetPlaceholderには売上(Sales)か在庫(Stock)か分かるような名前をつけておきます。

aws quicksight create-template --aws-account-id 999999999999 --template-id template_sales_and_stock --name analysis_template \
--permissions '[
  {
    "Principal": "arn:aws:quicksight:ap-northeast-1:999999999999:namespace/default",
    "Actions": ["quicksight:DescribeTemplate"]
  }
]' \
--source-entity \
'{
  "SourceAnalysis": {
    "Arn": "arn:aws:quicksight:ap-northeast-1:999999999999:analysis/7fc9afc0-1db3-4245-bfdf-042d5ec4c519",
    "DataSetReferences": [
      {
        "DataSetPlaceholder": "DataSet_Sales",
        "DataSetArn": "arn:aws:quicksight:ap-northeast-1:999999999999:dataset/76349082-b425-4eac-97a5-6e98e0304eb2"
      },
      {
        "DataSetPlaceholder": "DataSet_Stock",
        "DataSetArn": "arn:aws:quicksight:ap-northeast-1:999999999999:dataset/c87aae91-83ee-43df-aee4-d1c43bdcd835"
      }
    ]
  }
}'

実際に作成できているかをlist-templatesで確認します。

aws quicksight list-templates --aws-account-id 999999999999
{
    "TemplateSummaryList": [
        {
            "Arn": "arn:aws:quicksight:ap-northeast-1:999999999999:template/template_sales_and_stock",
            "TemplateId": "template_sales_and_stock",
            "Name": "analysis_template",
            "LatestVersionNumber": 1,
            "CreatedTime": "2023-05-16T09:17:29.745000+00:00",
            "LastUpdatedTime": "2023-05-16T09:17:29.745000+00:00"
        }
    ],
    "Status": 200,
    "RequestId": "1119e3d2-eab1-4268-a764-1da688df38a7"
}

テンプレートが作成されていることが確認できました。以降はデフォルト名前空間で実施していきます。

【デフォルト名前空間】データセットを作成する

カスタム名前空間で使用している、売上と在庫のデータと同じレイアウトのデータセットを作成します。 複数の名前空間を使用する場合は、データセット名に名前空間が分かる名前をつけると判別がしやすそうです。

【デフォルト名前空間】データセットのARNを調べる

デフォルト名前空間で作成した、売上と在庫のデータセットのARNを確認します。 名前空間を問わず結果が出力されるため、データセット名に名前空間が分かる名前をつけたことでデータセットが探しやすくなりそうです。

aws quicksight list-data-sets --aws-account-id 999999999999 --output json | jq '.DataSetSummaries | sort_by(.LastUpdatedTime) | reverse | .[] | select(.Name | contains("default"))'
{
  "Arn": "arn:aws:quicksight:ap-northeast-1:999999999999:dataset/907ceb25-f4cc-45c1-8d6f-c57dcb8ff5fc",
  "DataSetId": "907ceb25-f4cc-45c1-8d6f-c57dcb8ff5fc",
  "Name": "default空間_在庫",
  "CreatedTime": "2023-05-16T09:25:35.229000+00:00",
  "LastUpdatedTime": "2023-05-16T09:25:49.678000+00:00",
  "ImportMode": "SPICE",
  "RowLevelPermissionTagConfigurationApplied": false,
  "ColumnLevelPermissionRulesApplied": false
}
{
  "Arn": "arn:aws:quicksight:ap-northeast-1:999999999999:dataset/0b48da43-df90-45e4-a477-ad6c0bdd19d4",
  "DataSetId": "0b48da43-df90-45e4-a477-ad6c0bdd19d4",
  "Name": "default空間_売上",
  "CreatedTime": "2023-05-16T09:25:02.235000+00:00",
  "LastUpdatedTime": "2023-05-16T09:25:16.507000+00:00",
  "ImportMode": "SPICE",
  "RowLevelPermissionTagConfigurationApplied": false,
  "ColumnLevelPermissionRulesApplied": false
}

【デフォルト名前空間】グループのARNを調べる

分析のコピーを作成する際に、ユーザーやグループに対して権限を付与することができますが、グループ単位で権限付与をするとユーザー1人1人に対して権限を付与する手間をなくすことができます。
今回はグループに対して権限を付与したいので、事前にGUIで作成しておいたグループのARNを確認します。

aws quicksight list-groups --aws-account-id 999999999999 --namespace default
{
    "GroupList": [
        {
            "Arn": "arn:aws:quicksight:ap-northeast-1:999999999999:group/default/default_namespace_group",
            "GroupName": "default_namespace_group",
            "PrincipalId": "group/d-9567052c53/c1595dcf-af69-48ce-9909-8828dd3d30d4"
        }

【デフォルト名前空間】コピー元の分析に付与されている権限を調べる

分析のコピーを作成する際に、分析に付与されている権限も同じように設定したいです。
そこで、手作業で作成した既存の分析の権限を確認します。

aws quicksight describe-analysis-permissions --aws-account-id 999999999999 --analysis-id 7fc9afc0-1db3-4245-bfdf-042d5ec4c519
{
    "Status": 200,
    "AnalysisId": "7fc9afc0-1db3-4245-bfdf-042d5ec4c519",
    "AnalysisArn": "arn:aws:quicksight:ap-northeast-1:999999999999:analysis/7fc9afc0-1db3-4245-bfdf-042d5ec4c519",
    "Permissions": [
        {
            "Principal": "arn:aws:quicksight:ap-northeast-1:999999999999:user/namespace-custom1/xxxx-user1",
            "Actions": [
                "quicksight:RestoreAnalysis",
                "quicksight:UpdateAnalysisPermissions",
                "quicksight:DeleteAnalysis",
                "quicksight:DescribeAnalysisPermissions",
                "quicksight:QueryAnalysis",
                "quicksight:DescribeAnalysis",
                "quicksight:UpdateAnalysis"
            ]
        }
    ],
    "RequestId": "c5ebacef-d5a5-42bf-8f12-cecb53459eed"
}

Actionsに設定されている権限が、手動で分析を作成した際に付与された権限です。

【デフォルト名前空間】テンプレートから分析のコピーを作成する

最後に分析のコピーを作成します。 テンプレート、データセット、パーミッションを与えるグループのARNを指定し、パーミッションのActionsは先ほど確認した権限を設定します。

aws quicksight create-analysis --aws-account-id 999999999999 --analysis-id analysis_from_template --name "分析_テンプレートから作成" \
--source-entity '{
  "SourceTemplate": {
    "Arn": "arn:aws:quicksight:ap-northeast-1:999999999999:template/template_sales_and_stock",
    "DataSetReferences": [
      {
        "DataSetPlaceholder": "DataSet_Sales",
        "DataSetArn": "arn:aws:quicksight:ap-northeast-1:999999999999:dataset/0b48da43-df90-45e4-a477-ad6c0bdd19d4"
      },
      {
        "DataSetPlaceholder": "DataSet_Stock",
        "DataSetArn": "arn:aws:quicksight:ap-northeast-1:999999999999:dataset/907ceb25-f4cc-45c1-8d6f-c57dcb8ff5fc"
      }
    ]
  }
}' \
--permissions '[
    {
        "Principal": "arn:aws:quicksight:ap-northeast-1:999999999999:group/default/default_namespace_group",
        "Actions": [
            "quicksight:RestoreAnalysis",
            "quicksight:UpdateAnalysisPermissions",
            "quicksight:DeleteAnalysis",
            "quicksight:DescribeAnalysisPermissions",
            "quicksight:QueryAnalysis",
            "quicksight:DescribeAnalysis",
            "quicksight:UpdateAnalysis"
        ]
    }
]'

【デフォルト名前空間】分析の確認

コピーできた分析を確認してみます。 カスタム名前空間で作成された通りに、ビジュアルの幅や書式設定もコピーされていました。

まとめ

分析のコピー自体はものすごく複雑という訳ではありませんが、名前空間・テンプレート・データセット・分析などが複数あるとアセットの判別が難しくなるため、ネーミング規約などを作成して分かりやすい名前をつけておくと良いでしょう。

また、デフォルト名前空間ではほとんどの操作をGUIで行えるのに対し、カスタム名前空間ではCLIでしかできない操作(例:グループの作成や削除)があるため、どの名前空間をどのような用途で使用するのかを運用前に検討しておくと、いざ運用が始まった時に困ることが少なくなるかと思います。

最後までお読み頂きありがとうございました。
名前空間を使用した運用をする際に、少しでも参考になりましたら嬉しいです。

参考記事