AQ Tech Blog

Amazon QuickSight Assets as Bundle (AaB)~クロスアカウント編~

作成者: tsuyoshi.watanabe|2024年06月07日

 

はじめに

クラウドインテグレーション部の渡邊です。
今回は、Amazon QuickSightのAssets as BundleというAPIを活用してアカウント間で移行を実施します。
公式にも記載の通り、本APIはAaCと大きな差異はありません。
しかし、以前執筆した記事「Amazon QuickSight Assets As Code (AAC)~クロスアカウント編~」と比べると、より移行がスムーズであることがわかります。

この API は、Assets as Code ( AaC ) の機能拡張版であるため、できること・できないことは基本 AaC と同じですが、移行をよりスムーズにやれるよう、依存アセットも合わせて定義情報をエクスポート、インポートできるようになっています。

引用:【開催報告】Amazon QuickSight Roadshow 東京 2023

環境情報

  • Amazon Linux 2023

実際にやってみる

大まかな移行手順は以下の通りです。

  • エクスポートジョブの実行
  • エクスポートされたパッケージファイルの情報取得
  • 移行先のS3へエクスポートされたパッケージファイルをアップロード
  • 移行用のJSONフォーマットを基にインポートジョブの実行


移行元アカウントをアカウントA、移行先アカウントをアカウントBとします。

 

アカウントA


エクスポートジョブの実行

事前に移行対象の分析からダッシュボードを作ってください。
また、以下の環境変数を設定しております。

export AAI=<アカウントA>
export DR=us-east-1
export ANAID=arn:aws:quicksight:$DR:$AAI:analysis/23e88ce5-2e01-4b1a-ad60-377b4950475e
export DASHID=arn:aws:quicksight:$DR:$AAI:dashboard/8c12c8e4-17b0-4d9e-b37b-6bd51792d1fb

分析IDのANAID、ダッシュボードIDのDASHIDの末尾の情報は各リソースのURLの末尾に記載があります。
早速、エクスポートジョブを実行します。

aws quicksight start-asset-bundle-export-job --aws-account-id $AAI --asset-bundle-export-job-id test-job --resource-arns $DASHID $ANAID --include-all-dependencies --export-format QUICKSIGHT_JSON --region $DR

{
"Status": 202,
"Arn": "arn:aws:quicksight:us-east-1:<アカウントA>:asset-bundle-export-job/test-job",
"AssetBundleExportJobId": "test-job",
"RequestId": "aa0ec83d-761c-47a1-8376-b8eca182ae78"
}
  • include-all-dependencies:依存するアセットであるデータセットやデータソースなどもエクスポートするためのオプション
  • asset-bundle-export-job-id:任意のジョブ名
  • export-format:エクスポートフォーマット。QUICKSIGHT_JSONとすることで、QuickSight上で管理するビジュアル定義のJSON形式で取得可能

 

エクスポートされたパッケージファイルの情報取得

エクスポートジョブを確認すると成功しており、エクスポートされたパッケージファイルのダウンロード用URLが発行されてます。

aws quicksight describe-asset-bundle-export-job --aws-account-id $AAI --asset-bundle-export-job-id test-job --region $DR

{
"Status": 200,
"JobStatus": "SUCCESSFUL",
"DownloadUrl": "https://quicksight-asset-bundle-export-job-us-east-1.s3.amazonaws.com/<アカウントA>/test-job/aa0ec83d-761c-47a1-8376-b8eca182ae78/assetbundle-test-job.qs?X-Amz-Security-Token=XXXXX&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20240515T101751Z&X-Amz-SignedHeaders=host&X-Amz-Credential=XXXXX_request&X-Amz-Expires=300&X-Amz-Signature=XXXXX",
"Arn": "arn:aws:quicksight:us-east-1:<アカウントA>:asset-bundle-export-job/test-job",
"CreatedTime": "2024-05-15T10:16:45+00:00",
"AssetBundleExportJobId": "test-job",
"AwsAccountId": "<アカウントA>",
"ResourceArns": [
"arn:aws:quicksight:us-east-1:<アカウントA>:dashboard/8c12c8e4-17b0-4d9e-b37b-6bd51792d1fb",
"arn:aws:quicksight:us-east-1:<アカウントA>:analysis/23e88ce5-2e01-4b1a-ad60-377b4950475e"
],
"IncludeAllDependencies": true,
"ExportFormat": "QUICKSIGHT_JSON",
"RequestId": "7b40033f-a157-4e9f-b3b4-73529c5dfa11",
"IncludePermissions": false,
"IncludeTags": false
}


ダウンロードしたものをunzipコマンドすると以下のように依存関係のあるリソースが出力されています。
通常はthemeもダウンロードされますが、デフォルト設定の場合ダウンロードされないのかもしれません。

unzip  Downloads/assetbundle-test-job.qs
Archive: Downloads/assetbundle-test-job.qs
inflating: analysis/23e88ce5-2e01-4b1a-ad60-377b4950475e.json
inflating: dataset/21fd4720-c24c-4b53-9018-7c281182bec3.json
inflating: datasource/6fe669d4-9a81-428c-9258-1d562d47f416.json
inflating: dashboard/8c12c8e4-17b0-4d9e-b37b-6bd51792d1fb.json

 

アカウントB

アカウントB用に以下の環境変数を設定します。
アカウントAと同じシェルを使用している場合、環境変数 AAI が書き換わっている点にご注意ください。

export AAI=<アカウントB>
export DR=us-east-1


移行先のS3へエクスポートされたパッケージファイルをアップロード

インポートする際のアセットの指定方法は少なくとも2パターンあり、S3へアップロードしたパッケージファイルを指定する方法と、実行環境にあるパッケージファイルを指定する方法があります。
今回はS3へアップロードする方法を紹介します。

ダウンロードしたパッケージファイルを、移行先アカウントのS3にアップロードします。
バケットがない方は事前に作成しておきましょう。
後に使用するため、オブジェクトのS3のURIを控えておきます。


移行用のJSONフォーマットを基にインポートジョブの実行

移行用のJSONフォーマットにアカウントBのユーザARNが必要なため、取得します。
以下のようなフォーマットです。
ユーザ名はQuickSightのコンソール画面から確認できます。

arn:aws:quicksight:us-east-1:$AAI:user/<名前空間(設定していなければ`default`)>/<ユーザ名>


移行用のJSONフォーマット例は以下の通りです。
インポート時に OverridePermissions 設定で、移行先アカウントのユーザの権限設定を指定しました。
このようにしないとユーザがQuickSightのコンソール画面から確認できません。

{
"AssetBundleImportSource": {
"S3Uri": "s3://sample-aab-bucket-pj30sosfoij/assetbundle-test-job.qs"
},
"OverridePermissions": {
"DataSources": [
{
"DataSourceIds": ["6fe669d4-9a81-428c-9258-1d562d47f416"],
"Permissions": {
"Principals": [
"arn:aws:quicksight:us-east-1:<アカウントB>:user/default/Sample-user"
],
"Actions": [
"quicksight:PassDataSource",
"quicksight:DescribeDataSourcePermissions",
"quicksight:UpdateDataSource",
"quicksight:UpdateDataSourcePermissions",
"quicksight:DescribeDataSource",
"quicksight:DeleteDataSource"
]
}
}
],
"DataSets": [
{
"DataSetIds": ["21fd4720-c24c-4b53-9018-7c281182bec3"],
"Permissions": {
"Principals": [
"arn:aws:quicksight:us-east-1:<アカウントB>:user/default/Sample-user"
],
"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:us-east-1:<アカウントB>:user/default/Sample-user"
],
"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": ["23e88ce5-2e01-4b1a-ad60-377b4950475e"],
"Permissions": {
"Principals": [
"arn:aws:quicksight:us-east-1:<アカウントB>:user/default/Sample-user"
],
"Actions": [
"quicksight:RestoreAnalysis",
"quicksight:UpdateAnalysisPermissions",
"quicksight:DeleteAnalysis",
"quicksight:DescribeAnalysisPermissions",
"quicksight:QueryAnalysis",
"quicksight:DescribeAnalysis",
"quicksight:UpdateAnalysis"
]
}
}
],
"Dashboards": [
{
"DashboardIds": ["8c12c8e4-17b0-4d9e-b37b-6bd51792d1fb"],
"Permissions": {
"Principals": [
"arn:aws:quicksight:us-east-1:<アカウントB>:user/default/Sample-user"
],
"Actions": [
"quicksight:DescribeDashboard",
"quicksight:ListDashboardVersions",
"quicksight:UpdateDashboardPermissions",
"quicksight:QueryDashboard",
"quicksight:UpdateDashboard",
"quicksight:DeleteDashboard",
"quicksight:DescribeDashboardPermissions",
"quicksight:UpdateDashboardPublishedVersion"
]
}
}
]
}
}



パッケージファイルや控えた値を参考に入力してください。
以下の値を入力してください。

  • S3Uri
    • 移行先アカウントのS3のURI
  • Principals
    • アカウントBのユーザARN

以下については、パッケージファイルの各JSONファイル名に該当するためそれを入力してください。

  • DataSourceIds
  • DataSetIds
  • ThemeIds
  • AnalysisIds
  • DashboardIds

 

ThemeIdsがパッケージファイルに含まれていない場合、画像のようにエクスポート元のQuickSightの分析からテーマを確認し、該当のThemeIdを参照することもできます。


 

aws quicksight list-themes --aws-account-id <アカウントA> 
{
"ThemeSummaryList": [
{
"Arn": "arn:aws:quicksight::aws:theme/CLASSIC",
"Name": "Classic",
"ThemeId": "CLASSIC",
"LatestVersionNumber": 1,
"CreatedTime": "1970-01-01T00:00:00+00:00",
"LastUpdatedTime": "1970-01-01T00:00:00+00:00"
},
<略>

画像の場合、 ThemeId  CLASSIC であることがわかります。

本ファイルを実行環境でimport.jsonなどの名前で保存して、インポートジョブを実行します。

aws quicksight start-asset-bundle-import-job --aws-account-id $AAI --asset-bundle-import-job-id job --region $DR --cli-input-json file://import.json

{
"Status": 202,
"Arn": "arn:aws:quicksight:us-east-1:<アカウントB>:asset-bundle-import-job/job",
"AssetBundleImportJobId": "job",
"RequestId": "d37b40a5-812c-46f8-8a0d-51968d432822"
}

インポートジョブを確認すると成功しています。

$ aws quicksight describe-asset-bundle-import-job --aws-account-id $AAI --asset-bundle-import-job-id job --region $DR
{
"Status": 200,
"JobStatus": "SUCCESSFUL",
"Arn": "arn:aws:quicksight:us-east-1:<アカウントB>:asset-bundle-import-job/job",
"CreatedTime": "2024-05-16T00:00:41+00:00",
"AssetBundleImportJobId": "job",
"AwsAccountId": "<アカウントB>",
"AssetBundleImportSource": {
"S3Uri": "s3://sample-aab-bucket-pj30sosfoij/assetbundle-test-job.qs"
},
"FailureAction": "ROLLBACK",
"RequestId": "d37b40a5-812c-46f8-8a0d-51968d432822",
"OverridePermissions": {
"DataSources": [
{
"DataSourceIds": [
"6fe669d4-9a81-428c-9258-1d562d47f416"
],
"Permissions": {
"Principals": [
"arn:aws:quicksight:us-east-1:<アカウントB>:user/default/Sample-user"
],
"Actions": [
"quicksight:PassDataSource",
"quicksight:DescribeDataSourcePermissions",
"quicksight:UpdateDataSource",
<略>

以下のように別アカウントにアセットが移行されていることがわかります。
※データセットなどの分析以外のものも問題なく移行されていました

移行元の分析 

移行先の分析 

まとめ

  • とくにまとめてアセットを移行する場合、AaCよりAaBのほうが移行しやすい
  • 大まかな移行手順は以下の通り
    • エクスポートジョブの実行
    • エクスポートされたパッケージファイルの情報取得
    • 移行先のS3へエクスポートされたパッケージファイルをアップロード
    • 移行用のJSONフォーマットを基にインポートジョブの実行