AQ Tech Blog

Amazon QuickSight Assets as Bundle (AaB)~同一アカウント編~

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

はじめに

クラウドインテグレーション部の渡邊です。
今回は、シングルアカウントで複数環境を運用するケースを想定し、Amazon QuickSightのAssets as BundleというAPIを活用します。
公式にも記載の通り、本APIはAaCと大きな差異はありません。
アセット管理に関連する以下記事もぜひご覧ください。

Amazon QuickSight Assets As Code (AAC)~クロスアカウント編~ 
Amazon QuickSight Assets As Code (AAC)をやってみた~同一アカウント編~

環境情報

  • Amazon Linux 2023

実際にやってみる

大まかな流れは以下のとおりです。

  • 共有フォルダの作成
  • 開発環境用の共有フォルダに開発環境用のアセットを追加
  • エクスポートジョブの実行
  • エクスポートされたパッケージファイルの情報取得
  • 移行先のS3へエクスポートされたパッケージファイルをアップロード
  • 移行用のJSONフォーマットを基にインポートジョブの実行
  • フォルダーのメンバーシップを作成

事前にダッシュボード等の移行対象のアセットを作っておきましょう。

共有フォルダの作成

QuickSightのコンソール画面から共有フォルダを開きます。
はじめは何も作成されていないので、画像のように新しいフォルダから2つのフォルダを作成しましょう。
本番環境と開発環境用のフォルダを作成しました。
さらに、開発環境用のフォルダ内にアセットを配置するためのフォルダを作成します。

開発環境用の共有フォルダに開発環境用のアセットを追加

移行対象のデータセットを、アセットを配置するためのフォルダに追加します。

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

以下の環境変数を設定しております。

export AAI=123456789012
export DR=us-east-1
export DASHID=arn:aws:quicksight:$DR:$AAI:dashboard/0484a293-4b3c-46b3-bd1c-d414cbaaeac0

ダッシュボードIDのDASHIDの末尾の情報は各リソースのURLの末尾に記載があります。

エクスポートジョブを実行します。

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

{
"Status": 202,
"Arn": "arn:aws:quicksight:us-east-1:123456789012:asset-bundle-export-job/job-pipeline",
"AssetBundleExportJobId": "job-pipeline",
"RequestId": "90c1054e-429c-4c67-89b6-8e7253666e8b"
}
  • include-all-dependencies:依存するアセットであるデータセットやデータソースなどもエクスポートするためのオプション。
  • asset-bundle-export-job-id:任意のジョブ名
  • export-format:エクスポートフォーマット。QUICKSIGHT_JSONとすることで、QuickSight上で管理するビジュアル定義のJSON形式で取得可能

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

エクスポートジョブを確認すると成功しており、エクスポートされたパッケージファイルのダウンロード用URLが発行されてます。
また、ダウンロードした拡張子qsのファイルはunzipコマンドで解凍できます。
すると、ダッシュボード以外のアセットも含めたパッケージファイルであることがわかります。

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

{
"Status": 200,
"JobStatus": "SUCCESSFUL",
"DownloadUrl": "https://quicksight-asset-bundle-export-job-us-east-1.s3.amazonaws.com/123456789012/job-pipeline/90c1054e-429c-4c67-89b6-8e7253666e8b/assetbundle-job-pipeline.qs?X-Amz-Security-Token=XXXX&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20240516T005116Z&X-Amz-SignedHeaders=host&X-Amz-Credential=XXXX_request&X-Amz-Expires=300&X-Amz-Signature=XXXX",
"Arn": "arn:aws:quicksight:us-east-1:123456789012:asset-bundle-export-job/job-pipeline",
"CreatedTime": "2024-05-16T00:50:19+00:00",
"AssetBundleExportJobId": "job-pipeline",
"AwsAccountId": "123456789012",
"ResourceArns": [
"arn:aws:quicksight:us-east-1:123456789012:dashboard/0484a293-4b3c-46b3-bd1c-d414cbaaeac0"
],
"IncludeAllDependencies": true,
"ExportFormat": "QUICKSIGHT_JSON",
"RequestId": "cfc6ac38-b047-4ab2-9638-1355ea6ffe40",
"IncludePermissions": true,
"IncludeTags": false
}

 

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

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

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

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

移行用のJSONフォーマット例は以下の通りです。
分析などの他のアセットを含めても問題ないです。
ResourceIdOverrideConfiguration  PrefixForAllResources を指定することで、インポート時にアセット名を上書きし、PRD環境のアセットであることが明確にわかるように設定します。
同一アカウントにインポートする場合、アセットIDが同一なので、そのままインポートすると上書きされるので注意してください。

{
"AssetBundleImportSource": {
"S3Uri": "s3://sample-aab-bucket-single-account-woioai2l/assetbundle-job-pipeline.qs"
},
"OverrideParameters": {
"ResourceIdOverrideConfiguration": {
"PrefixForAllResources": "prod-"
},
"DataSets": [
{
"DataSetId": "prod-d63756fb-3691-4a2f-a39e-efb149b35bf9",
"Name": "Sales Pipeline(S3)_PRD"
}
],
"Themes": [
{
"ThemeId": "prod-CLASSIC",
"Name": "Custom Theme_PRD"
}
],
"Dashboards": [
{
"DashboardId": "prod-0484a293-4b3c-46b3-bd1c-d414cbaaeac0",
"Name": "sales-pipeline_PRD"
}
]
}
}

以下の値を入力してください。

  • S3Uri
    • 移行先アカウントのS3のURI 以下については、パッケージファイルの各JSONファイル名に、プレフィックスであるprod-を付与したものを入力してください。
  • DataSetIds
  • ThemeIds
  • DashboardIds また、各アセットのNameもカスタムすると移行元と区別しやすくなるでしょう。

入力が完了したら import-single.json などの名前で保存して、インポートジョブを実行します。

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

{
"Status": 202,
"Arn": "arn:aws:quicksight:us-east-1:123456789012:asset-bundle-import-job/job-2",
"AssetBundleImportJobId": "job-2",
"RequestId": "054c858a-8db2-4ed5-825d-48381139bce0"
}

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

$  aws quicksight describe-asset-bundle-import-job --aws-account-id $AAI --asset-bundle-import-job-id job-2 --region $DR
{
"Status": 200,
"JobStatus": "SUCCESSFUL",
"Arn": "arn:aws:quicksight:us-east-1:123456789012:asset-bundle-import-job/job-2",
"CreatedTime": "2024-05-16T01:21:47+00:00",
"AssetBundleImportJobId": "job-2",
"AwsAccountId": "123456789012",
"AssetBundleImportSource": {
"S3Uri": "s3://sample-aab-bucket-single-account-woioai2l/assetbundle-job-pipeline.qs"
},
"OverrideParameters": {
"ResourceIdOverrideConfiguration": {
"PrefixForAllResources": "prod-"
},
"DataSets": [
{
<略>

たとえば、データセットを確認すると作成されてました。


フォルダーのメンバーシップを作成

フォルダーのメンバーシップを作成するコマンドを、各アセットに対して実行します。
各アセットをフォルダに追加しているだけです。
フォルダのIDを控えて、環境変数を設定します。
他のアセットと同様にURLの末尾からIDを確認できます。

 export FD=5a57cfab-ed59-472e-80ed-cd04f3a98059

フォルダにアセットを追加します。

aws quicksight create-folder-membership --aws-account-id $AAI --region $DR --folder-id $FD --member-id prod-d63756fb-3691-4a2f-a39e-efb149b35bf9 --member-type DATASET

aws quicksight create-folder-membership --aws-account-id $AAI --region $DR --folder-id $FD --member-id prod-0484a293-4b3c-46b3-bd1c-d414cbaaeac0 --member-type DASHBOARD

以下のような結果が出ていれば成功しています。

{
"Status": 200,
"FolderMember": {
"MemberId": "prod-d63756fb-3691-4a2f-a39e-efb149b35bf9",
"MemberType": "DATASET"
},
"RequestId": "f828d541-c9f7-4918-9063-3712ccffbb09"
}

本番環境の共有フォルダを確認すると、アセットが追加されていました。

まとめ

  • とくに、まとめてアセットを移行する場合、AaCよりAaBのほうが移行しやすい
  • 大まかな流れは以下の通り
    • 共有フォルダの作成
    • 開発環境用の共有フォルダに開発環境用のアセットを追加
    • エクスポートジョブの実行
    • エクスポートされたパッケージファイルの情報取得
    • 移行先のS3へエクスポートされたパッケージファイルをアップロード
    • 移行用のJSONフォーマットを基にインポートジョブの実行
      • インポートジョブの実行時にアセットIDを重複させないようにPrefixForAllResourcesを利用する
    • フォルダーのメンバーシップを作成

【参考】 Streamline your reporting process with Amazon QuickSight automation