Amazon QuickSight Assets as Bundle (AaB)~同一アカウント編~
目次
はじめに
クラウドインテグレーション部の渡邊です。
今回は、シングルアカウントで複数環境を運用するケースを想定し、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-
を付与したものを入力してください。
- 移行先アカウントのS3のURI 以下については、パッケージファイルの各JSONファイル名に、プレフィックスである
- 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
を利用する
- インポートジョブの実行時にアセットIDを重複させないように
- フォルダーのメンバーシップを作成
【参考】 Streamline your reporting process with Amazon QuickSight automation
アジアクエスト株式会社では一緒に働いていただける方を募集しています。
興味のある方は以下のURLを御覧ください。