0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

QuickSight で Assets as Bundle (AaB) を利用して 別アカウント移行を行う

Posted at

はじめに

QuickSight で作成したダッシュボードを、他の AWS アカウントや、他のリージョンに移行したいときがあります。こういったダッシュボード移行に、便利な機能があり、QuickSight の Assets as Bundle のエクスポートや、インポートです。ダッシュボードや、データセットの定義の移行が簡単にできるようになります。

注意点としては、データセットの中身までは移行はしてくれず、あくまで QuickSight 上での設定にとどまる点をご留意ください。例えば、Athena を利用している場合は、Athena の設定値やデータの中身は Assets as Bundle で移行されず、別の手段で移行が必要になります。

それでは、この記事で Assets as Bundle の利用方法を紹介します。

構成図

構成図の概要です。移行元と移行先は別の AWS アカウントで、Assets as Bundle を利用して、QuickSight 上の Datasource, Dataset, Analysis, Dashboard の定義を移行できます。

image-20250126132749434.png

移行元の作業

移行元で行う作業をしていきます。

参考 : Athena の設定

移行には直接関係ないですが、理解を深めるため Athena を利用した設定を紹介します。

以下の csv を S3 にアップロードして、Athena に連携します。

customer_id,first_name,last_name,email,age,city
1,John,Doe,john.doe@example.com,35,New York
2,Jane,Smith,jane.smith@example.com,28,Los Angeles
3,Mike,Johnson,mike.johnson@example.com,42,Chicago
4,Emily,Brown,emily.brown@example.com,31,Houston
5,David,Wilson,david.wilson@example.com,39,Phoenix

Athena で以下の Create Table を発行

CREATE EXTERNAL TABLE customers (
    customer_id INT,
    first_name STRING,
    last_name STRING,
    email STRING,
    age INT,
    city STRING
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS TEXTFILE
LOCATION 's3://qs-aab-bucket-source01/'
TBLPROPERTIES ('skip.header.line.count'='1');

Athena で Query が発行できます。

image-20250126113541712.png

QuickSight : Dataset 作成

作成した Athena でデータセットを作成します。

image-20250126113630786.png

Athena を選択します。

image-20250126113656416.png

Create data source

image-20250126113749404.png

Edit/Preview data

image-20250126113810212.png

Dataset の名前を qs-aab-dataset-source01 に指定して、可視化をしていきます。

image-20250126114938761.png

適当に Analysis を作ります。

image-20250126130551103.png

適当にダッシュボードを作成します。

image-20250126130609629.png

AaB を使ってエクスポートする

AWS CLI を利用してエクスポートをしていきます。

AWS CLI を実行しやすくするため、Bash の環境変数を設定します。移行元の AWS アカウント ID と、リージョン名を指定。

export SOURCE_AWS_ACCOUNTID=xxxxxxxxxxxx
export REGION=ap-northeast-1

Dashboard ID を指定。

export DASHID=arn:aws:quicksight:${REGION}:${SOURCE_AWS_ACCOUNTID}:dashboard/674e873b-e87f-44b9-90d0-b915ce14ed79

Dashboard ID の調べ方は、ダッシュボードをブラウザで開いたときの末尾の数字です。

image-20250126130754486.png

AaB のエクスポートを実行

aws quicksight start-asset-bundle-export-job \
  --aws-account-id ${SOURCE_AWS_ACCOUNTID} \
  --asset-bundle-export-job-id job-1 \
  --resource-arns ${DASHID} \
  --include-all-dependencies \
  --export-format QUICKSIGHT_JSON \
  --region ${REGION}

実行例

{
    "Status": 202,
    "Arn": "arn:aws:quicksight:ap-northeast-1:xxxxxxxxxxxx:asset-bundle-export-job/job-1",
    "AssetBundleExportJobId": "job-1",
    "RequestId": "c7aba5d1-1cd5-487a-b367-3cfb8d5ef25d"
}

確認

aws quicksight describe-asset-bundle-export-job \
  --aws-account-id ${SOURCE_AWS_ACCOUNTID} \
  --asset-bundle-export-job-id job-1 \
  --region ${REGION}

実行例

  • JobStatus が SUCCESSFUL となっており、エクスポートが成功していることがわかる
  • DownloadUrl をブラウザからアクセスして、エクスポートしたデータをダウンロードする
{
    "Status": 200,
    "JobStatus": "SUCCESSFUL",
    "DownloadUrl": "https://quicksight-asset-bundle-export-job-ap-northeast-1.s3.ap-northeast-1.amazonaws.com/xxxxxxxxxxxx/job-1....",
    "Arn": "arn:aws:quicksight:ap-northeast-1:xxxxxxxxxxxx:asset-bundle-export-job/job-1",
    "CreatedTime": "2025-01-26T03:01:37+00:00",
    "AssetBundleExportJobId": "job-1",
    "AwsAccountId": "xxxxxxxxxxxx",
    "ResourceArns": [
        "arn:aws:quicksight:ap-northeast-1:xxxxxxxxxxxx:dashboard/674e873b-e87f-44b9-90d0-b915ce14ed79"
    ],
    "IncludeAllDependencies": true,
    "ExportFormat": "QUICKSIGHT_JSON",
    "RequestId": "d1acdb49-4747-45ee-b607-a92962339a02",
    "IncludePermissions": false,
    "IncludeTags": false
}

assetbundle-job-1.qs がダウンロードされました。

この assetbundle-job-1.qs ファイルは、Zip 化されており、unzip で中身を確認可能です。以下のファイル名は、移行先の作業で必要なので、メモをしておきます。

> tree
.
├── analysis
│   └── 83465a5b-e01e-430e-98c0-551e5e42ba04.json
├── dashboard
│   └── 674e873b-e87f-44b9-90d0-b915ce14ed79.json
├── dataset
│   └── 83f12194-03d5-41b1-88df-5c8934418e4a.json
└── datasource
    └── 6479a824-66a9-4a2c-9749-20a1482d292c.json

移行先の作業

移行先で行う作業をしていきます。

AaB を使ってインポートする

AaB (Assets as Bundle) でインポートをしていきます。

まず、QuickSight の User ARN を確認します。

  • arn:aws:quicksight:ap-northeast-1:yyyyyyyyyyyy:user/default/Admin/myusername
> aws quicksight list-users --aws-account-id yyyyyyyyyyyy --namespace default
{
    "UserList": [
        {
            "Arn": "arn:aws:quicksight:ap-northeast-1:yyyyyyyyyyyy:user/default/Admin/myusername",
            "UserName": "Admin/myusername",
            "Email": "masked",
            "Role": "ADMIN",
            "IdentityType": "IAM",
            "Active": true,
            "PrincipalId": "federated/iam/AROAU67TET7HQ5EHYEIW4:myusername"
        }
    ],
    "Status": 200,
    "RequestId": "6344f849-439b-40ef-aabe-f10422f44a5a"
}

移行元で Export してダウンロードした assetbundle-job-1.qs ファイルを、移行先の S3 バケットに格納します。

  • s3://qs-aab-import-dest01/assetbundle-job-1.qs

image-20250126121450445.png

インポートコマンドを実行するための JSON ファイルを作成

  • S3Uri : アップロードした S3 の URL を指定
  • Principals : QuickSight の User ARN を指定
  • DataSourceIds, DataSetIds, AnalysisIds, DashboardIds : assetbundle-job-1.qs を Unzip した後に見える ファイル名を指定 (拡張子は無し)
  • Theme : CLASSIC を指定
{
    "AssetBundleImportSource": {
        "S3Uri": "s3://qs-aab-import-dest01/assetbundle-job-1.qs"
    },
    "OverridePermissions": {
        "DataSources": [
            {
                "DataSourceIds": [
                    "6479a824-66a9-4a2c-9749-20a1482d292c"
                ],
                "Permissions": {
                    "Principals": [
                        "arn:aws:quicksight:ap-northeast-1:yyyyyyyyyyyy:user/default/Admin/myusername"
                    ],
                    "Actions": [
                        "quicksight:PassDataSource","quicksight:DescribeDataSourcePermissions","quicksight:UpdateDataSource","quicksight:UpdateDataSourcePermissions","quicksight:DescribeDataSource","quicksight:DeleteDataSource"
                    ]
                }
            }
        ],
        "DataSets": [
            {
                "DataSetIds": [
                    "83f12194-03d5-41b1-88df-5c8934418e4a"
                ],
                "Permissions": {
                    "Principals": [
                        "arn:aws:quicksight:ap-northeast-1:yyyyyyyyyyyy:user/default/Admin/myusername"
                    ],
                    "Actions": [
                        "quicksight:DeleteDataSet","quicksight:UpdateDataSetPermissions","quicksight:PutDataSetRefreshProperties","quicksight:CreateRefreshSchedule","quicksight:CancelIngestion","quicksight:UpdateRefreshSchedule","quicksight:DeleteRefreshSchedule","quicksight:ListRefreshSchedules","quicksight:DescribeDataSetRefreshProperties","quicksight:DescribeDataSet","quicksight:PassDataSet","quicksight:CreateIngestion","quicksight:DescribeRefreshSchedule","quicksight:ListIngestions","quicksight:DescribeDataSetPermissions","quicksight:UpdateDataSet","quicksight:DeleteDataSetRefreshProperties","quicksight:DescribeIngestion"
                    ]
                }
            }
        ],
        "Themes": [
            {
                "ThemeIds": [
                    "CLASSIC"
                ],
                "Permissions": {
                    "Principals": [
                        "arn:aws:quicksight:ap-northeast-1:yyyyyyyyyyyy:user/default/Admin/myusername"
                    ],
                    "Actions": [
                        "quicksight:UpdateThemeAlias","quicksight:ListThemeVersions","quicksight:DescribeThemeAlias","quicksight:UpdateThemePermissions","quicksight:DeleteThemeAlias","quicksight:DeleteTheme","quicksight:ListThemeAliases","quicksight:DescribeTheme","quicksight:CreateThemeAlias","quicksight:UpdateTheme","quicksight:DescribeThemePermissions"
                    ]
                }
            }
        ],
        "Analyses": [
            {
                "AnalysisIds": [
                    "83465a5b-e01e-430e-98c0-551e5e42ba04"
                ],
                "Permissions": {
                    "Principals": [
                        "arn:aws:quicksight:ap-northeast-1:yyyyyyyyyyyy:user/default/Admin/myusername"
                    ],
                    "Actions": [
                        "quicksight:RestoreAnalysis","quicksight:UpdateAnalysisPermissions","quicksight:DeleteAnalysis","quicksight:DescribeAnalysisPermissions","quicksight:QueryAnalysis","quicksight:DescribeAnalysis","quicksight:UpdateAnalysis"
                    ]
                }
            }
        ],
        "Dashboards": [
            {
                "DashboardIds": [
                    "674e873b-e87f-44b9-90d0-b915ce14ed79"
                ],
                "Permissions": {
                    "Principals": [
                        "arn:aws:quicksight:ap-northeast-1:yyyyyyyyyyyy:user/default/Admin/myusername"
                    ],
                    "Actions": [
                        "quicksight:DescribeDashboard","quicksight:ListDashboardVersions","quicksight:UpdateDashboardPermissions","quicksight:QueryDashboard","quicksight:UpdateDashboard","quicksight:DeleteDashboard","quicksight:DescribeDashboardPermissions","quicksight:UpdateDashboardPublishedVersion"
                    ]
                }
            }
        ]
    }
}

移行先の AWS アカウントと、リージョン名 を、Bash の環境変数に指定

export DEST_AWS_ACCOUNTID=yyyyyyyyyyyy
export REGION=ap-northeast-1

Import を行います。

aws quicksight start-asset-bundle-import-job \
  --aws-account-id ${DEST_AWS_ACCOUNTID} \
  --asset-bundle-import-job-id job-1 \
  --region ${REGION}\
  --cli-input-json file://./import1.json

実行結果

{
    "Status": 202,
    "Arn": "arn:aws:quicksight:ap-northeast-1:yyyyyyyyyyyy:asset-bundle-import-job/job-1",
    "AssetBundleImportJobId": "job-1",
    "RequestId": "1039bc5a-0541-4dcd-9cca-c0c5a0f8d724"
}

確認

aws quicksight describe-asset-bundle-import-job \
  --aws-account-id ${DEST_AWS_ACCOUNTID} \
  --asset-bundle-import-job-id job-1 \
  --region ${REGION}

実行結果

  • "JobStatus": "SUCCESSFUL", で成功している
{
    "Status": 200,
    "JobStatus": "SUCCESSFUL",
    "Arn": "arn:aws:quicksight:ap-northeast-1:yyyyyyyyyyyy:asset-bundle-import-job/job-1",
    "CreatedTime": "2025-01-26T03:25:29+00:00",
    "AssetBundleImportJobId": "job-1",
    "AwsAccountId": "yyyyyyyyyyyy",
    "AssetBundleImportSource": {
        "S3Uri": "s3://qs-aab-import-dest01/assetbundle-job-1.qs"
    },
    "FailureAction": "ROLLBACK",
    "RequestId": "8fb72afc-049f-4a30-8eef-0bdd526376a5",
    "OverridePermissions": {
        "DataSources": [
            {
                "DataSourceIds": [
                    "6479a824-66a9-4a2c-9749-20a1482d292c"
                ],
                "Permissions": {
                    "Principals": [
                        "arn:aws:quicksight:ap-northeast-1:yyyyyyyyyyyy:user/default/Admin/myusername"
                    ],
                    "Actions": [
                        "quicksight:PassDataSource",
                        "quicksight:DescribeDataSourcePermissions",
                        "quicksight:UpdateDataSource",
                        "quicksight:UpdateDataSourcePermissions",
                        "quicksight:DescribeDataSource",
                        "quicksight:DeleteDataSource"
                    ]
                }
            }
        ],
        "DataSets": [
            {
                "DataSetIds": [
                    "83f12194-03d5-41b1-88df-5c8934418e4a"
                ],
                "Permissions": {
                    "Principals": [
                        "arn:aws:quicksight:ap-northeast-1:yyyyyyyyyyyy:user/default/Admin/myusername"
                    ],
                    "Actions": [
                        "quicksight:DeleteDataSet",
                        "quicksight:UpdateDataSetPermissions",
                        "quicksight:PutDataSetRefreshProperties",
                        "quicksight:CreateRefreshSchedule",
                        "quicksight:CancelIngestion",
                        "quicksight:UpdateRefreshSchedule",
                        "quicksight:DeleteRefreshSchedule",
                        "quicksight:ListRefreshSchedules",
                        "quicksight:DescribeDataSetRefreshProperties",
                        "quicksight:DescribeDataSet",
                        "quicksight:PassDataSet",
                        "quicksight:CreateIngestion",
                        "quicksight:DescribeRefreshSchedule",
                        "quicksight:ListIngestions",
                        "quicksight:DescribeDataSetPermissions",
                        "quicksight:UpdateDataSet",
                        "quicksight:DeleteDataSetRefreshProperties",
                        "quicksight:DescribeIngestion"
                    ]
                }
            }
        ],
        "Themes": [
            {
                "ThemeIds": [
                    "CLASSIC"
                ],
                "Permissions": {
                    "Principals": [
                        "arn:aws:quicksight:ap-northeast-1:yyyyyyyyyyyy:user/default/Admin/myusername"
                    ],
                    "Actions": [
                        "quicksight:UpdateThemeAlias",
                        "quicksight:ListThemeVersions",
                        "quicksight:DescribeThemeAlias",
                        "quicksight:UpdateThemePermissions",
                        "quicksight:DeleteThemeAlias",
                        "quicksight:DeleteTheme",
                        "quicksight:ListThemeAliases",
                        "quicksight:DescribeTheme",
                        "quicksight:CreateThemeAlias",
                        "quicksight:UpdateTheme",
                        "quicksight:DescribeThemePermissions"
                    ]
                }
            }
        ],
        "Analyses": [
            {
                "AnalysisIds": [
                    "83465a5b-e01e-430e-98c0-551e5e42ba04"
                ],
                "Permissions": {
                    "Principals": [
                        "arn:aws:quicksight:ap-northeast-1:yyyyyyyyyyyy:user/default/Admin/myusername"
                    ],
                    "Actions": [
                        "quicksight:RestoreAnalysis",
                        "quicksight:UpdateAnalysisPermissions",
                        "quicksight:DeleteAnalysis",
                        "quicksight:DescribeAnalysisPermissions",
                        "quicksight:QueryAnalysis",
                        "quicksight:DescribeAnalysis",
                        "quicksight:UpdateAnalysis"
                    ]
                }
            }
        ],
        "Dashboards": [
            {
                "DashboardIds": [
                    "674e873b-e87f-44b9-90d0-b915ce14ed79"
                ],
                "Permissions": {
                    "Principals": [
                        "arn:aws:quicksight:ap-northeast-1:yyyyyyyyyyyy:user/default/Admin/myusername"
                    ],
                    "Actions": [
                        "quicksight:DescribeDashboard",
                        "quicksight:ListDashboardVersions",
                        "quicksight:UpdateDashboardPermissions",
                        "quicksight:QueryDashboard",
                        "quicksight:UpdateDashboard",
                        "quicksight:DeleteDashboard",
                        "quicksight:DescribeDashboardPermissions",
                        "quicksight:UpdateDashboardPublishedVersion"
                    ]
                }
            }
        ]
    }
}

QucikSight 確認

移行元で定義した Dashboard, Analysis, Data Set, Data Source の定義がインポートされています!

ただし、移行元で Athena を利用していたので、移行先に Athena は存在しておらず、今の時点ではエラーになります。

インポートされたダッシュボード

image-20250126122808071.png

ダッシュボードを開くとエラー

image-20250126122826025.png

インポートされた Analysis

image-20250126122904112.png

Analysis を開いた状態

image-20250126122846010.png

データセット

image-20250126122935136.png

データセットの詳細

image-20250126123044780.png

データセットの詳細

image-20250126123109283.png

Athena の設定

データソースとなる Athena は、別途移行先の AWS アカウントで設定が必要です。

Athena のための S3 バケットの作成や、テストファイルをアップロードします。

image-20250126123834501.png

テストデータの中身です。移行元より適当に多めにしました。

customer_id,first_name,last_name,email,age,city
1,John,Doe,john.doe@example.com,35,New York
2,Jane,Smith,jane.smith@example.com,28,Los Angeles
3,Mike,Johnson,mike.johnson@example.com,42,Chicago
4,Emily,Brown,emily.brown@example.com,31,Houston
5,David,Wilson,david.wilson@example.com,39,Phoenix
6,Sarah,Taylor,sarah.taylor@example.com,45,Boston
7,Chris,Anderson,chris.anderson@example.com,33,Seattle
8,Lisa,Martinez,lisa.martinez@example.com,29,Miami
9,Robert,Thomas,robert.thomas@example.com,51,Dallas
10,Jennifer,Garcia,jennifer.garcia@example.com,37,San Francisco
11,William,Lee,william.lee@example.com,44,Washington D.C.
12,Maria,Rodriguez,maria.rodriguez@example.com,26,Atlanta
13,James,Walker,james.walker@example.com,38,Denver
14,Patricia,Hall,patricia.hall@example.com,47,San Diego
15,Richard,Allen,richard.allen@example.com,53,Philadelphia
16,Elizabeth,Young,elizabeth.young@example.com,30,Portland
17,Thomas,King,thomas.king@example.com,41,Las Vegas
18,Karen,Wright,karen.wright@example.com,36,Orlando
19,Daniel,Lopez,daniel.lopez@example.com,32,Austin
20,Nancy,Hill,nancy.hill@example.com,49,Nashville
21,Mark,Scott,mark.scott@example.com,27,San Antonio
22,Betty,Green,betty.green@example.com,55,Detroit
23,Paul,Adams,paul.adams@example.com,34,Columbus
24,Sandra,Baker,sandra.baker@example.com,43,Indianapolis
25,George,Nelson,george.nelson@example.com,40,Charlotte
26,Donna,Carter,donna.carter@example.com,52,Memphis
27,Kenneth,Mitchell,kenneth.mitchell@example.com,46,Baltimore
28,Carol,Perez,carol.perez@example.com,39,Albuquerque
29,Steven,Roberts,steven.roberts@example.com,48,Kansas City
30,Michelle,Turner,michelle.turner@example.com,25,Sacramento

Glue の Database 作成

  • Glue の Database や Table の名前は、移行元と移行先で同一にすると、QuickSight 上の設定変更なしでストレートに参照できる。

image-20250126130937062.png

Glue 用のテーブル作成です。このテーブル名も同じにします。

CREATE EXTERNAL TABLE customers (
    customer_id INT,
    first_name STRING,
    last_name STRING,
    email STRING,
    age INT,
    city STRING
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS TEXTFILE
LOCATION 's3://qs-aab-bucket-dest01/'
TBLPROPERTIES ('skip.header.line.count'='1');

Athena が動きました。

image-20250126124242261.png

正常に QuickSight からデータを確認できた

移行先の AWS アカウントで Athena の設定を加えると、QuickSight のダッシュボードや Analysis でデータを確認できるようになりました。

Analysis の画面

image-20250126134438538.png

Dashboard

image-20250126134506303.png

参考 URL

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?