【Quicksight】データセットの移行手順

# はじめに
こんにちは、Qiita初心者の@Satoo2032です。今回は自身の為の備忘という意味合いも込めて、Quicksightのデータセットを別アカウントに移行する手順について、まとめていきます。

# 環境/資材情報
##### 今回利用する環境情報・資材情報は以下の通りです。

<環境情報>
OS：Windows10
QuicksightアカウントA：XXX（本来は12桁の数字）
QuicksightアカウントB：YYY（本来は12桁の数字）
推奨ブラウザ：Chrome/Edge/Firefox/Safari　※1

※1：Quicksightを利用するにあたり、いずれも最新バージョンが望ましいです。
　 　 詳細は、AWSの公式サイトを参照ください。
　 　 [Quicksightサポートブラウザ](https://docs.aws.amazon.com/ja_jp/quicksight/latest/user/supported-browsers.html)

<資材情報>
データセットID：aaaaa（本来は32桁の英数字）
データセット名：移行用データセット
__※両アカウントに同一のデータセットIDが存在しない前提です。__

<利用ツール>
AWS Quicksight
AWS Cloud Shell
テキストエディタ（サクラエディタやVSCode）※あれば便利程度です

# 移行手順
## 　①データセットリストの取得 

まずは移行対象データセットのIDを取得します。
以下のCLIコマンドを実行します。
 - list-data-sets
~~~
aws quicksight list-data-sets --aws-account-id XXX >ディレクトリ/ファイル名.json
~~~
\>以降は実行結果をファイルとして出力するためのコマンドです。
また、JSONとは、APIなどでテキストデータを処理する際に用いられることが多いデータフォーマットです。
出力例は以下の通りです。移行対象データセットのID（DataSetId）を確認します。
~~~
{
    "DataSetSummaries": [
        {
            "Arn": "arn:aws:quicksight:ap-northeast-1:XXX:dataset/aaaaa",
            "DataSetId": "aaaaa",
            "Name": "移行用データセット",
            "CreatedTime": "2023-12-01T08:00:00.000000+09:00",
            "LastUpdatedTime": "2023-12-31T11:00:00.000000+09:00",
            "ImportMode": "SPICE",
            "RowLevelPermissionTagConfigurationApplied": false,
            "ColumnLevelPermissionRulesApplied": false
        }
    ],
    "Status": 200,
    "RequestId": "11111111-1111-1111-1111-111111111111"
}
~~~

## 　②データセット情報の取得

続いて、対象のデータセットの詳細情報を取得します。
主な情報として、利用しているデータソースやテーブル・項目などが出力されます。
以下のCLIコマンドを実行します。
 - describe-data-set
~~~
aws quicksight describe-data-set --aws-account-id XXX --data-set-id aaaaa >ディレクトリ/ファイル名.json
~~~
①の手順で確認したデータセットIDをここで利用します。
出力例は以下の通りです。
~~~
{
    "Status": 200,
    "DataSet": {
        "Arn": "arn:aws:quicksight:ap-northeast-1:XXX:dataset/aaaaa",
        "DataSetId": "aaaaa",
        "Name": "移行用データセット",
        "CreatedTime": "2023-12-01T08:00:00.000000+09:00",
        "LastUpdatedTime": "2023-12-31T11:00:00.000000+09:00",
        "PhysicalTableMap": {
            "62fcb7df-b29e-47b8-bbc8-a70ee03b5eb5": {
                "RelationalTable": {
                    "DataSourceArn": "arn:aws:quicksight:ap-northeast-1:XXX:datasource/eeeee",
              ・
              ・
              ・
        },
        "LogicalTableMap": {
              ・
              ・
              ・
        },
        "OutputColumns": [
              ・
              ・
              ・
        ],
        "ImportMode": "SPICE",
        "ConsumedSpiceCapacityInBytes": 0,
        "DataSetUsageConfiguration": {
            "DisableUseAsDirectQuerySource": false,
            "DisableUseAsImportedSource": false
        }
    },
    "RequestId": "22222222-2222-2222-2222-222222222222"
}
~~~
今回は移行がメインになりますので、出力結果の詳細は省かせていただきます。
上記の出力結果から、後続の作業に必要な情報だけを抜粋すると、以下の通りです。
__"DataSetId"__
__"Name"__
__"PhysicalTableMap"__
__"LogicalTableMap"__
__"ImportMode"__

## 　③データセット所有者情報の取得

続いて、対象のデータセットの所有者情報を取得します。
主な情報として、ユーザーIDや権限情報などが出力されます。
以下のCLIコマンドを実行します。
 - describe-data-set-permissions
~~~
aws quicksight describe-data-set-permissions --aws-account-id XXX --data-set-id aaaaa >ディレクトリ/ファイル名.json
~~~
①の手順で確認したデータセットIDをここでも利用します。
出力例は以下の通りです。
~~~
{
    "Status": 200,
    "DataSetArn": "arn:aws:quicksight:ap-northeast-1:XXX:dataset/aaaaa",
    "DataSetId": "aaaaa",
    "Permissions": [
        {
            "Principal": "arn:aws:quicksight:ap-northeast-1:XXX:user/default/testuser",
            "Actions": [
                "quicksight:DeleteDataSet",
                "quicksight:UpdateDataSetPermissions",
                "quicksight:PutDataSetRefreshProperties",
                "quicksight:CreateRefreshSchedule",
                "quicksight:CancelIngestion",
                "quicksight:DeleteRefreshSchedule",
                "quicksight:UpdateRefreshSchedule",
                "quicksight:ListRefreshSchedules",
                "quicksight:PassDataSet",
                "quicksight:DescribeDataSetRefreshProperties",
                "quicksight:DescribeDataSet",
                "quicksight:CreateIngestion",
                "quicksight:DescribeRefreshSchedule",
                "quicksight:ListIngestions",
                "quicksight:DescribeDataSetPermissions",
                "quicksight:UpdateDataSet",
                "quicksight:DeleteDataSetRefreshProperties",
                "quicksight:DescribeIngestion"
            ]
        }
    ],
    "RequestId": "33333333-3333-3333-3333-333333333333"
}
~~~
②と同様に移行がメインになりますので、出力結果の詳細は省かせていただきます。
上記の出力結果から、後続の作業に必要な情報だけを抜粋すると、以下の通りです。
__"DataSetId"__
__"Permissions"__

※参考までに、上記のPermissionsは、データセットのアクセス許可の設定が、
　「所有者」の場合の情報です。

 ## 　④JSONファイルの作成

続いて、対象のデータセットを移行するためにJSONファイルを作成します。
②、③で取得した情報を基に、以下のようなJSONファイルを作成します。
__※QuicksightのアカウントIDを書き換える箇所があることに注意しましょう。__
~~~
{
 "DataSetId": "aaaaa",
 "Name": "移行用データセット",
 "PhysicalTableMap": {
  "1234-5678-9012-3456-789012345678": {
   "RelationalTable": {
    "DataSourceArn": "arn:aws:quicksight:ap-northeast-1:YYY:datasource/eeeee", --アカウントBのIDに変更
              ・
              ・
              ・
 },
 "LogicalTableMap": {
              ・
              ・
              ・
 },
 "ImportMode": "SPICE",
 "Permissions": [
  {
   "Principal": "arn:aws:quicksight:ap-northeast-1:YYY:user/default/testuser", --アカウントBのID、アカウントBに作成済みのユーザーIDに変更
   "Actions": [
    "quicksight:DeleteDataSet",
    "quicksight:UpdateDataSetPermissions",
    "quicksight:PutDataSetRefreshProperties",
    "quicksight:CreateRefreshSchedule",
    "quicksight:CancelIngestion",
    "quicksight:DeleteRefreshSchedule",
    "quicksight:UpdateRefreshSchedule",
    "quicksight:ListRefreshSchedules",
    "quicksight:PassDataSet",
    "quicksight:DescribeDataSetRefreshProperties",
    "quicksight:DescribeDataSet",
    "quicksight:CreateIngestion",
    "quicksight:DescribeRefreshSchedule",
    "quicksight:ListIngestions",
    "quicksight:DescribeDataSetPermissions",
    "quicksight:UpdateDataSet",
    "quicksight:DeleteDataSetRefreshProperties",
    "quicksight:DescribeIngestion"
   ]
  }
 ]
}
~~~
ここまでの手順を実施することで、データセットの移行準備が完了します。
 ## 　⑤データセットの作成

いよいよ、対象のデータセットを別アカウントに移行します。
以下のCLIコマンドを実行します。
 - create-data-set
~~~
aws quicksight create-data-set --aws-account-id YYY --cli-input-json file:ディレクトリ/ファイル名.json
~~~
コマンド実行後、指定したユーザー(testuser)で、アカウントBにログインし、対象のデータセットが確認できれば、移行完了です。

<補足>
cli-input-jsonとは、コマンド実行する際の入力情報をJSONファイルから取得するパラメータです。
データセットの詳細情報をJSONファイルに記載しておくことで、コマンド実行を簡潔にできる便利機能です。

# まとめ
いかがだったでしょうか。
最後になりますが、作業するうえで個人的に詰まったポイントや注意点を記載いたします。
 - IDが同一のデータソースを移行先のアカウントにあらかじめ作成しておく必要がある
 - ファイルアップロードを利用して作成したデータセットの移行は不可（2024年1月時点）
 - データセットを含むデータセットを移行する場合、AWS CLIのバージョンは2.15.12とする
 - JSONファイルを作成する際、括弧やカンマの位置には十分注意が必要

今回はデータセットのみでしたが、記事としてまとめることで自分の為にもなるため、他の資材（データソースや分析など）についてもまとめていこうと思います。
最後までお読みいただき、ありがとうございました。

# データ活用をサクッと始めるなら！
株式会社ジールでは、「ITリテラシーがない」「初期費用がかけられない」「親切・丁寧な支援がほしい」「ノーコード・ローコードがよい」「運用・保守の手間をかけられない」などのお客様の声を受けて、オールインワン型データ活用プラットフォーム「ZEUSCloud」を月額利用料にてご提供しております。
ご興味がある方は是非下記のリンクをご覧ください：
https://www.zdh.co.jp/products-services/cloud-data/zeuscloud/?utm_source=qiita&utm_medium=referral&utm_campaign=qiita_zeuscloud_content-area