QuickSightで作成した分析を、テンプレート機能を使って別アカウントへ配布してみる

2022.01.30

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

いわさです。

QuickSightのダッシュボードを開発したときに、別のAWSアカウントへ作成した分析を配布したいシーンがあります。

通常のAWSリソースであれば、こういう場合にIaCテンプレートを配布することが可能なのですが、本日時点でCloudFormationやAWS CLIでQuickSightの分析をイチから作成することは出来ません。
しかし、QuickSightにはコンソール上で作成した分析をテンプレート化して配布する機能が備わっています。

本日は、分析のテンプレート機能を使ってみます。
この機能はコンソールからは使うことは出来ず、CLIやAPIから操作を行う必要があります。

テンプレートを作成する

まずはテンプレート開発アカウント(アカウントID:222222222222)上で以下のようなCSVをSPICEアップロードして適当な分析を作成しておきます。

hoge1,hoge2
aaa,111
bbb,222
ccc,333

次に、テンプレートを作成するために、分析とデータセットのARNを取得する必要がありますのでCLIで取得します。

[cloudshell-user@ip-10-0-143-28 ~]$ aws quicksight list-analyses --aws-account-id 222222222222
{
    "AnalysisSummaryList": [
        {
            "Arn": "...",
        },
        {
            "Arn": "arn:aws:quicksight:ap-northeast-1:222222222222:analysis/40ece957-a463-4b07-a21d-e06aa4c9bc08",
            "AnalysisId": "40ece957-a463-4b07-a21d-e06aa4c9bc08",
            "Name": "hoge.csv analysis",
            "Status": "CREATION_SUCCESSFUL",
            "CreatedTime": "2022-01-29T23:00:11.638000+00:00",
            "LastUpdatedTime": "2022-01-29T23:00:43.891000+00:00"
        },
        ...
    ],
    "Status": 200,
    "RequestId": "1c8017e3-ad3f-4b6a-9012-1a960d3749df"
}
[cloudshell-user@ip-10-0-143-28 ~]$ aws quicksight list-data-sets --aws-account-id 222222222222
{
    "DataSetSummaries": [
        ...
        {
            "Arn": "arn:aws:quicksight:ap-northeast-1:210987654321:dataset/7e19b7de-28c1-4385-90d7-57e1cea392df",
            "DataSetId": "7e19b7de-28c1-4385-90d7-57e1cea392df",
            "Name": "hoge.csv",
            "CreatedTime": "2022-01-29T23:00:10.944000+00:00",
            "LastUpdatedTime": "2022-01-29T23:00:26.481000+00:00",
            "ImportMode": "SPICE",
            "RowLevelPermissionTagConfigurationApplied": false,
            "ColumnLevelPermissionRulesApplied": false
        },
        ...
    ],
    "Status": 200,
    "RequestId": "380ed471-6a56-4e14-88dc-46c8e1286cbe"
}

そして、そのARNを使って、create-templateを実行します。

[cloudshell-user@ip-10-0-143-28 ~]$ aws quicksight create-template --aws-account-id 222222222222 --template-id hoge20220130template --name hoge20220130template \
--permissions '[
  {
    "Principal": "arn:aws:iam::111111111111:root",
    "Actions": ["quicksight:DescribeTemplate"]
  }
]' \
--source-entity \
'{
  "SourceAnalysis": {
    "Arn": "arn:aws:quicksight:ap-northeast-1:222222222222:analysis/40ece957-a463-4b07-a21d-e06aa4c9bc08",
    "DataSetReferences": [
      {
        "DataSetPlaceholder": "hogedatasetplaceholder",
        "DataSetArn": "arn:aws:quicksight:ap-northeast-1:222222222222:dataset/7e19b7de-28c1-4385-90d7-57e1cea392df"
      }
    ]
  }
}'
{
    "Status": 202,
    "Arn": "arn:aws:quicksight:ap-northeast-1:222222222222:template/hoge20220130template",
    "VersionArn": "arn:aws:quicksight:ap-northeast-1:222222222222:template/hoge20220130template/version/1",
    "TemplateId": "hoge20220130template",
    "CreationStatus": "CREATION_IN_PROGRESS",
    "RequestId": "ea53d97a-bc7e-404e-be3a-65cbc1c75ca5"
}

ポイントとしては、Permissionsオプションで、共有先のAWSアカウントとテンプレートの参照を許可しています。
CLIドキュメントへ明記されていませんでしたが、*を指定した際のエラーメッセージから、許容されているアクションを推測することが出来ます。

An error occurred (InvalidParameterValueException) when calling the CreateTemplate operation: ResourcePermission list contains unsupported permission sets [*] for this resource. Valid sets : [quicksight:UpdateTemplatePermissions, quicksight:DescribeTemplatePermissions, quicksight:UpdateTemplateAlias, quicksight:DeleteTemplateAlias, quicksight:DescribeTemplateAlias, quicksight:ListTemplateAliases, quicksight:ListTemplates, quicksight:CreateTemplateAlias, quicksight:DeleteTemplate, quicksight:UpdateTemplate, quicksight:ListTemplateVersions, quicksight:DescribeTemplate, quicksight:CreateTemplate]

ここで取得されるテンプレートARNをテンプレート利用アカウントにて使います。

テンプレートを利用する

では利用側のAWSアカウント(アカウントID:111111111111)でテンプレートを使ってみましょう。

今回は利用側のAWSアカウントで予めデータセットを作成しておきます。
データソースの定義からこのあたりもアカウント共有することは可能だと思いますが、S3やRDSなどのQuickSight外の移行が関係してくるので本記事では割愛します。

作成したデータセットのARNだけを取得しておき、利用側はcreate-analysisサブコマンドでテンプレートから分析を作成しましょう。

[cloudshell-user@ip-10-0-91-184 ~]$ aws quicksight create-analysis --aws-account-id 111111111111 --analysis-id hoge20220130analysis-id --name hoge20220130analysis \
--source-entity '{
  "SourceTemplate": {
    "Arn": "arn:aws:quicksight:ap-northeast-1:222222222222:template/hoge20220130template",
    "DataSetReferences": [
      {
        "DataSetPlaceholder": "hogedatasetplaceholder",
        "DataSetArn": "arn:aws:quicksight:ap-northeast-1:111111111111:dataset/18d59f13-564b-4a65-8cfa-0fc3087b8d0d"
      }
    ]
  }
}' \
--permissions '[
    {
        "Principal": "arn:aws:quicksight:ap-northeast-1:111111111111:user/default/hoge-iwasa.takahito/hoge-iwasa.takahito",
        "Actions": [
            "quicksight:RestoreAnalysis",
            "quicksight:UpdateAnalysisPermissions",
            "quicksight:DeleteAnalysis",
            "quicksight:DescribeAnalysisPermissions",
            "quicksight:QueryAnalysis",
            "quicksight:DescribeAnalysis",
            "quicksight:UpdateAnalysis"
        ]
    }
]'
{
    "Status": 202,
    "Arn": "arn:aws:quicksight:ap-northeast-1:111111111111:analysis/hoge20220130analysis-id",
    "AnalysisId": "hoge20220130analysis-id",
    "CreationStatus": "CREATION_IN_PROGRESS",
    "RequestId": "307ffd25-ee61-48ab-995c-e92dd8be2a6e"
}

実行後、新しいデータセットのデータで同じ形式の分析が作成されていると思います。

テンプレートから分析を作成後に表示されない場合

もしcreate-analysis実行後に作成されたはずの分析が表示されない場合は分析の権限を確認してみてください。
以下はPermissionオプションを省略した場合と、コンソール画面から作成した場合のdescribe-analysis-permissionsの結果です。

[cloudshell-user@ip-10-0-91-184 ~]$ aws quicksight describe-analysis-permissions --aws-account-id 111111111111 --analysis-id hoge20220130analysis
{
    "Status": 200,
    "AnalysisId": "hoge20220130analysis",
    "AnalysisArn": "arn:aws:quicksight:ap-northeast-1:111111111111:analysis/hoge20220130analysis",
    "Permissions": [],
    "RequestId": "fc23352d-d515-4dd0-80fc-58b9100992f5"
}
[cloudshell-user@ip-10-0-91-184 ~]$ aws quicksight describe-analysis-permissions --aws-account-id 111111111111 --analysis-id c8dc8cc3-41c7-47b6-aba5-21e040498068
{
    "Status": 200,
    "AnalysisId": "c8dc8cc3-41c7-47b6-aba5-21e040498068",
    "AnalysisArn": "arn:aws:quicksight:ap-northeast-1:111111111111:analysis/c8dc8cc3-41c7-47b6-aba5-21e040498068",
    "Permissions": [
        {
            "Principal": "arn:aws:quicksight:ap-northeast-1:111111111111:user/default/hoge-iwasa.takahito/hoge-iwasa.takahito",
            "Actions": [
                "quicksight:RestoreAnalysis",
                "quicksight:UpdateAnalysisPermissions",
                "quicksight:DeleteAnalysis",
                "quicksight:DescribeAnalysisPermissions",
                "quicksight:QueryAnalysis",
                "quicksight:DescribeAnalysis",
                "quicksight:UpdateAnalysis"
            ]
        }
    ],
    "RequestId": "c7dc32b4-5d81-4eed-810b-c86c59571cd0"
}

前者はコンソール上に表示されませんが、後者はコンソール上に表示されます。
逆にいえば、意図しないQuickSightユーザーへ表示されるリスクが低くなっているわけなので安心設計だと思いますが、Permissionを明示的に指定しなければ参照できない点は覚えておきましょう。

CreateのタイミングでPermissionsの指定を忘れていた場合は、管理者権限でupdate-analysis-permissionsを使って分析の参照権限を更新してやると良いと思います。

さいごに

本日はQuickSightの分析テンプレートを使った、複数AWSアカウント間での分析テンプレートの共有機能を使ってみました。
分析の共有から、アカウント間のQuickSightダッシュボードや分析の移行まで、様々な用途で活用出来そうな機能です。

また、この機能を活用できると、あらかじめて作成した分析テンプレートとカスタムリソースを使って、CloudFormationでQuickSightリソースを提供することが出来るようになります。
ちなみに、AWS公式のソリューションテンプレートなどのダッシュボード系は、共有されたテンプレートから分析を作成する機能とカスタムリソースが使われています。