Amazon Q in QuickSight トピックのレビュー済み回答をCLIから操作する
こんにちは、クラウド事業本部 コンサルティング部の荒平(@eiraces)です。
Amazon Q in QuickSight、面白い機能がたくさんあって最近たまに触っています。
面白い機能の一つとして、自然言語で聞いた回答をユーザーに対して固定する機能(Verified Questions) があるのですが、ひとつひとつの設定は骨が折れ、仮にダッシュボードの引っ越しや別トピックへの移設が発生した際に全て手作業というのはなかなか辛そうです。
そこで、AWS CLIからQuickSight APIを操作することで、トピックに設定されたレビュー済み回答をバックアップしたり、ダッシュボードにインポートできます。
トピックに関しては以下のブログも是非参照ください。
※ なお、本記事で扱うデータはFakerライブラリで作成したサンプルです
レビュー済みの回答(Verified)をバックアップする
AWSドキュメントに記載がありますが、以下の構文を利用します。
aws quicksight list-topic-reviewed-answers \
--aws-account-id AWSACCOUNTID \
--topic-id TOPICID
以下のコマンドのようになります。
aws quicksight list-topic-reviewed-answers \
--aws-account-id 000000000000 \
--topic-id mjHJ90rMHgnDA4nR6E06m0EVAWxxxxx > output.json
aws-account-id
はQuickSightを所有しているAWSアカウントのIDを利用し、 topic-id
は特定のTopicを選択した状態で確認できます。
次のような回答を得ることができます。レビュー済みの質問が2個登録されていることが分かります。
list-topic-reviewed-answers 回答(output.json)
{
"Status": 200,
"TopicId": "mjHJ90rMHgnDA4nR6E06m0EVAWxxxxx",
"TopicArn": "arn:aws:quicksight:ap-northeast-1:000000000000:topic/mjHJ90rMHgnDA4nR6E06m0EVAWxxxxx",
"Answers": [
{
"Arn": "arn:aws:quicksight:ap-northeast-1:000000000000:topic/mjHJ90rMHgnDA4nR6E06m0EVAWxxxxx/reviewed-answer/GndqhY0lsp3NJEu3g4gkXrt4dVbcieHS",
"AnswerId": "GndqhY0lsp3NJEu3g4gkXrt4dVbcieHS",
"DatasetArn": "arn:aws:quicksight:ap-northeast-1:000000000000:dataset/838bae14-4635-42f0-a46f-44daafa264fc",
"Question": "性別(customer_gender_ja)の分布を教えて下さい",
"PrimaryVisual": {
"VisualId": "d0c56611-bd13-4de1-9494-2da7d8f673b6",
"Role": "PRIMARY",
"Ir": {
"Metrics": [
{
"MetricId": {
"Identity": "d7b59cef-25a6-421a-8883-7c112fb0ce5c"
},
"Function": {
"Aggregation": "DISTINCT_COUNT"
},
"Operands": [
{
"Identity": "customer_id"
}
]
}
],
"GroupByList": [
{
"FieldName": {
"Identity": "customer_gender_ja"
}
}
],
"Filters": [],
"Visual": {
"type": "HORIZONTAL_BARS"
}
},
"SupportingVisuals": [
{
"VisualId": "480c6ecc-6c27-420b-85b1-a045183ed489",
"Role": "COMPLIMENTARY",
"Ir": {
"Metrics": [
{
"MetricId": {
"Identity": "d7b59cef-25a6-421a-8883-7c112fb0ce5c"
},
"Function": {
"Aggregation": "DISTINCT_COUNT"
},
"Operands": [
{
"Identity": "customer_id"
}
]
}
],
"GroupByList": [],
"Filters": [],
"Visual": {
"type": "KPI"
}
},
"SupportingVisuals": []
},
{
"VisualId": "22a14472-ab40-4c40-92a5-e879e4a2fa69",
"Role": "COMPLIMENTARY",
"Ir": {
"Metrics": [
{
"MetricId": {
"Identity": "281f29d9-53cd-4952-947a-0dd3932c0d44"
},
"Function": {
"Aggregation": "DISTINCT_COUNT"
},
"Operands": [
{
"Identity": "customer_gender_ja"
}
]
}
],
"GroupByList": [],
"Filters": [],
"Visual": {
"type": "KPI"
}
},
"SupportingVisuals": []
},
{
"VisualId": "bc5cef2c-408e-4ef7-8cbf-9eca20004b79",
"Role": "COMPLIMENTARY",
"Ir": {
"Metrics": [
{
"MetricId": {
"Identity": "b488edca-517b-454e-b846-0e2e2b3d1f71"
},
"Function": {
"Aggregation": "SUM"
},
"Operands": [
{
"Identity": "customer_age"
}
]
}
],
"GroupByList": [
{
"FieldName": {
"Identity": "customer_id"
}
},
{
"FieldName": {
"Identity": "customer_gender_ja"
}
}
],
"Filters": [],
"Sort": {
"Operand": {
"Identity": "customer_age"
},
"SortDirection": "DESCENDING"
},
"Visual": {
"type": "HORIZONTAL_BARS"
}
},
"SupportingVisuals": []
},
{
"VisualId": "f94ec734-abac-4d14-a2c8-f1cb1fe8066e",
"Role": "COMPLIMENTARY",
"Ir": {
"Metrics": [],
"GroupByList": [
{
"FieldName": {
"Identity": "customer_segment_ja"
}
},
{
"FieldName": {
"Identity": "customer_age"
}
},
{
"FieldName": {
"Identity": "customer_gender_ja"
}
},
{
"FieldName": {
"Identity": "customer_id"
}
}
],
"Filters": [],
"Sort": {
"Operand": {
"Identity": "customer_id"
},
"SortDirection": "DESCENDING"
},
"Visual": {
"type": "TABLE"
}
},
"SupportingVisuals": []
}
]
},
"Template": {
"TemplateType": "BASELINE",
"Slots": [
{
"SlotId": "SOFT_PRIMARY",
"VisualId": "d0c56611-bd13-4de1-9494-2da7d8f673b6"
},
{
"SlotId": "KPI_1",
"VisualId": "480c6ecc-6c27-420b-85b1-a045183ed489"
},
{
"SlotId": "KPI_2",
"VisualId": "22a14472-ab40-4c40-92a5-e879e4a2fa69"
},
{
"SlotId": "SOFT_GROUNDING",
"VisualId": "bc5cef2c-408e-4ef7-8cbf-9eca20004b79"
},
{
"SlotId": "ENTITY_TABLE",
"VisualId": "f94ec734-abac-4d14-a2c8-f1cb1fe8066e"
}
]
}
},
{
"Arn": "arn:aws:quicksight:ap-northeast-1:000000000000:topic/mjHJ90rMHgnDA4nR6E06m0EVAWxxxxx/reviewed-answer/p2w6KWROYoV9YzQGRITyJmHpoTgc33XU",
"AnswerId": "p2w6KWROYoV9YzQGRITyJmHpoTgc33XU",
"DatasetArn": "arn:aws:quicksight:ap-northeast-1:000000000000:dataset/838bae14-4635-42f0-a46f-44daafa264fc",
"Question": "顧客の年齢(customer_age)の分布は?",
"PrimaryVisual": {
"VisualId": "5416f759-343d-4384-8f34-c25909b60488",
"Role": "PRIMARY",
"Ir": {
"Metrics": [
{
"MetricId": {
"Identity": "ef0e4480-1796-40b8-aa2f-b585947ff0b3"
},
"Function": {
"Aggregation": "SUM"
},
"Operands": [
{
"Identity": "customer_age"
}
]
}
],
"GroupByList": [
{
"FieldName": {
"Identity": "customer_age"
}
}
],
"Filters": [],
"Visual": {
"type": "HORIZONTAL_BARS"
}
},
"SupportingVisuals": [
{
"VisualId": "baceed34-f405-43f8-a671-47d2269b4296",
"Role": "COMPLIMENTARY",
"Ir": {
"Metrics": [
{
"MetricId": {
"Identity": "ef0e4480-1796-40b8-aa2f-b585947ff0b3"
},
"Function": {
"Aggregation": "SUM"
},
"Operands": [
{
"Identity": "customer_age"
}
]
}
],
"GroupByList": [],
"Filters": [],
"Visual": {
"type": "KPI"
}
},
"SupportingVisuals": []
},
{
"VisualId": "072be447-38e4-4c41-bc8c-fae8e39d6ce8",
"Role": "COMPLIMENTARY",
"Ir": {
"Metrics": [
{
"MetricId": {
"Identity": "b21e8979-f43c-4ee2-ac3e-a165a24d59e1"
},
"Function": {
"Aggregation": "DISTINCT_COUNT"
},
"Operands": [
{
"Identity": "customer_age"
}
]
}
],
"GroupByList": [],
"Filters": [],
"Visual": {
"type": "KPI"
}
},
"SupportingVisuals": []
},
{
"VisualId": "ddf68476-6ceb-4cb3-8094-73b3b98c58a5",
"Role": "COMPLIMENTARY",
"Ir": {
"Metrics": [],
"GroupByList": [
{
"FieldName": {
"Identity": "customer_gender"
}
},
{
"FieldName": {
"Identity": "customer_segment"
}
},
{
"FieldName": {
"Identity": "customer_age"
}
}
],
"Filters": [],
"Sort": {
"Operand": {
"Identity": "customer_age"
},
"SortDirection": "DESCENDING"
},
"Visual": {
"type": "TABLE"
}
},
"SupportingVisuals": []
}
]
},
"Template": {
"TemplateType": "BASELINE",
"Slots": [
{
"SlotId": "SOFT_PRIMARY",
"VisualId": "5416f759-343d-4384-8f34-c25909b60488"
},
{
"SlotId": "KPI_1",
"VisualId": "baceed34-f405-43f8-a671-47d2269b4296"
},
{
"SlotId": "KPI_2",
"VisualId": "072be447-38e4-4c41-bc8c-fae8e39d6ce8"
},
{
"SlotId": "ENTITY_TABLE",
"VisualId": "ddf68476-6ceb-4cb3-8094-73b3b98c58a5"
}
]
}
}
],
"RequestId": "5f349173-cfe2-4259-b971-3e1e38b287c9"
}
レビュー済みの回答(Verified)を削除する
リストアのため、レビュー済みの回答を一旦削除します。「REMOVE」ボタンから可能です。
先述のリストコマンドなどでanswer-ids
が分かっていれば、CLIを利用した削除も可能です。
aws quicksight batch-delete-topic-reviewed-answer \
--topic-id TOPICID \
--aws-account-id AWSACCOUNTID \
—answer-ids: ["AnswerId1, AnswerId2…"]
レビュー済みの回答はない状態となりました。
レビュー済みの回答(Verified)をリストアする
先ほどバックアップしたデータを復元してみます。
~ $ aws quicksight batch-create-topic-reviewed-answer \
> --cli-input-json file://output.json
Parameter validation failed:
Missing required parameter in input: "AwsAccountId"
Unknown parameter in input: "Status", must be one of: AwsAccountId, TopicId, Answers
Unknown parameter in input: "TopicArn", must be one of: AwsAccountId, TopicId, Answers
Unknown parameter in input: "RequestId", must be one of: AwsAccountId, TopicId, Answers
Unknown parameter in Answers[0]: "Arn", must be one of: AnswerId, DatasetArn, Question, Mir, PrimaryVisual, Template
Unknown parameter in Answers[1]: "Arn", must be one of: AnswerId, DatasetArn, Question, Mir, PrimaryVisual, Template
が・・・エラーが出てインポートが出来ませんでした。 aws quicksight batch-create-topic-reviewed-answer --generate-cli-skeleton
コマンドからやり取りするjsonの形など確認できるのですが、Arnなどの情報はインプットとして不要のようです。
Arn
やStatus
など不要そうなパラメータを削り、AwsAccountId
とMir
を追加しました。
最終的なインプットのjsonは以下の通り。
インプット用JSONファイル(output-fix.json)
{
"AwsAccountId": "000000000000",
"TopicId": "mjHJ90rMHgnDA4nR6E06m0EVAWxxxxx",
"Answers": [
{
"AnswerId": "GndqhY0lsp3NJEu3g4gkXrt4dVbcieHS",
"DatasetArn": "arn:aws:quicksight:ap-northeast-1:000000000000:dataset/838bae14-4635-42f0-a46f-44daafa264fc",
"Question": "性別(customer_gender_ja)の分布を教えて下さい",
"Mir": {
"Metrics": [
{
"MetricId": {
"Identity": "d7b59cef-25a6-421a-8883-7c112fb0ce5c"
},
"Function": {
"Aggregation": "DISTINCT_COUNT"
},
"Operands": [
{
"Identity": "customer_id"
}
]
}
],
"GroupByList": [
{
"FieldName": {
"Identity": "customer_gender_ja"
}
}
],
"Filters": [],
"Visual": {
"type": "HORIZONTAL_BARS"
}
},
"PrimaryVisual": {
"VisualId": "d0c56611-bd13-4de1-9494-2da7d8f673b6",
"Role": "PRIMARY",
"Ir": {
"Metrics": [
{
"MetricId": {
"Identity": "d7b59cef-25a6-421a-8883-7c112fb0ce5c"
},
"Function": {
"Aggregation": "DISTINCT_COUNT"
},
"Operands": [
{
"Identity": "customer_id"
}
]
}
],
"GroupByList": [
{
"FieldName": {
"Identity": "customer_gender_ja"
}
}
],
"Filters": [],
"Visual": {
"type": "HORIZONTAL_BARS"
}
},
"SupportingVisuals": [
{
"VisualId": "480c6ecc-6c27-420b-85b1-a045183ed489",
"Role": "COMPLIMENTARY",
"Ir": {
"Metrics": [
{
"MetricId": {
"Identity": "d7b59cef-25a6-421a-8883-7c112fb0ce5c"
},
"Function": {
"Aggregation": "DISTINCT_COUNT"
},
"Operands": [
{
"Identity": "customer_id"
}
]
}
],
"GroupByList": [],
"Filters": [],
"Visual": {
"type": "KPI"
}
},
"SupportingVisuals": []
},
{
"VisualId": "22a14472-ab40-4c40-92a5-e879e4a2fa69",
"Role": "COMPLIMENTARY",
"Ir": {
"Metrics": [
{
"MetricId": {
"Identity": "281f29d9-53cd-4952-947a-0dd3932c0d44"
},
"Function": {
"Aggregation": "DISTINCT_COUNT"
},
"Operands": [
{
"Identity": "customer_gender_ja"
}
]
}
],
"GroupByList": [],
"Filters": [],
"Visual": {
"type": "KPI"
}
},
"SupportingVisuals": []
},
{
"VisualId": "bc5cef2c-408e-4ef7-8cbf-9eca20004b79",
"Role": "COMPLIMENTARY",
"Ir": {
"Metrics": [
{
"MetricId": {
"Identity": "b488edca-517b-454e-b846-0e2e2b3d1f71"
},
"Function": {
"Aggregation": "SUM"
},
"Operands": [
{
"Identity": "customer_age"
}
]
}
],
"GroupByList": [
{
"FieldName": {
"Identity": "customer_id"
}
},
{
"FieldName": {
"Identity": "customer_gender_ja"
}
}
],
"Filters": [],
"Sort": {
"Operand": {
"Identity": "customer_age"
},
"SortDirection": "DESCENDING"
},
"Visual": {
"type": "HORIZONTAL_BARS"
}
},
"SupportingVisuals": []
},
{
"VisualId": "f94ec734-abac-4d14-a2c8-f1cb1fe8066e",
"Role": "COMPLIMENTARY",
"Ir": {
"Metrics": [],
"GroupByList": [
{
"FieldName": {
"Identity": "customer_segment_ja"
}
},
{
"FieldName": {
"Identity": "customer_age"
}
},
{
"FieldName": {
"Identity": "customer_gender_ja"
}
},
{
"FieldName": {
"Identity": "customer_id"
}
}
],
"Filters": [],
"Sort": {
"Operand": {
"Identity": "customer_id"
},
"SortDirection": "DESCENDING"
},
"Visual": {
"type": "TABLE"
}
},
"SupportingVisuals": []
}
]
},
"Template": {
"TemplateType": "BASELINE",
"Slots": [
{
"SlotId": "SOFT_PRIMARY",
"VisualId": "d0c56611-bd13-4de1-9494-2da7d8f673b6"
},
{
"SlotId": "KPI_1",
"VisualId": "480c6ecc-6c27-420b-85b1-a045183ed489"
},
{
"SlotId": "KPI_2",
"VisualId": "22a14472-ab40-4c40-92a5-e879e4a2fa69"
},
{
"SlotId": "SOFT_GROUNDING",
"VisualId": "bc5cef2c-408e-4ef7-8cbf-9eca20004b79"
},
{
"SlotId": "ENTITY_TABLE",
"VisualId": "f94ec734-abac-4d14-a2c8-f1cb1fe8066e"
}
]
}
},
{
"AnswerId": "p2w6KWROYoV9YzQGRITyJmHpoTgc33XU",
"DatasetArn": "arn:aws:quicksight:ap-northeast-1:000000000000:dataset/838bae14-4635-42f0-a46f-44daafa264fc",
"Question": "顧客の年齢(customer_age)の分布は?",
"Mir": {
"Metrics": [
{
"MetricId": {
"Identity": "ef0e4480-1796-40b8-aa2f-b585947ff0b3"
},
"Function": {
"Aggregation": "SUM"
},
"Operands": [
{
"Identity": "customer_age"
}
]
}
],
"GroupByList": [
{
"FieldName": {
"Identity": "customer_age"
}
}
],
"Filters": [],
"Visual": {
"type": "HORIZONTAL_BARS"
}
},
"PrimaryVisual": {
"VisualId": "5416f759-343d-4384-8f34-c25909b60488",
"Role": "PRIMARY",
"Ir": {
"Metrics": [
{
"MetricId": {
"Identity": "ef0e4480-1796-40b8-aa2f-b585947ff0b3"
},
"Function": {
"Aggregation": "SUM"
},
"Operands": [
{
"Identity": "customer_age"
}
]
}
],
"GroupByList": [
{
"FieldName": {
"Identity": "customer_age"
}
}
],
"Filters": [],
"Visual": {
"type": "HORIZONTAL_BARS"
}
},
"SupportingVisuals": [
{
"VisualId": "baceed34-f405-43f8-a671-47d2269b4296",
"Role": "COMPLIMENTARY",
"Ir": {
"Metrics": [
{
"MetricId": {
"Identity": "ef0e4480-1796-40b8-aa2f-b585947ff0b3"
},
"Function": {
"Aggregation": "SUM"
},
"Operands": [
{
"Identity": "customer_age"
}
]
}
],
"GroupByList": [],
"Filters": [],
"Visual": {
"type": "KPI"
}
},
"SupportingVisuals": []
},
{
"VisualId": "072be447-38e4-4c41-bc8c-fae8e39d6ce8",
"Role": "COMPLIMENTARY",
"Ir": {
"Metrics": [
{
"MetricId": {
"Identity": "b21e8979-f43c-4ee2-ac3e-a165a24d59e1"
},
"Function": {
"Aggregation": "DISTINCT_COUNT"
},
"Operands": [
{
"Identity": "customer_age"
}
]
}
],
"GroupByList": [],
"Filters": [],
"Visual": {
"type": "KPI"
}
},
"SupportingVisuals": []
},
{
"VisualId": "ddf68476-6ceb-4cb3-8094-73b3b98c58a5",
"Role": "COMPLIMENTARY",
"Ir": {
"Metrics": [],
"GroupByList": [
{
"FieldName": {
"Identity": "customer_gender"
}
},
{
"FieldName": {
"Identity": "customer_segment"
}
},
{
"FieldName": {
"Identity": "customer_age"
}
}
],
"Filters": [],
"Sort": {
"Operand": {
"Identity": "customer_age"
},
"SortDirection": "DESCENDING"
},
"Visual": {
"type": "TABLE"
}
},
"SupportingVisuals": []
}
]
},
"Template": {
"TemplateType": "BASELINE",
"Slots": [
{
"SlotId": "SOFT_PRIMARY",
"VisualId": "5416f759-343d-4384-8f34-c25909b60488"
},
{
"SlotId": "KPI_1",
"VisualId": "baceed34-f405-43f8-a671-47d2269b4296"
},
{
"SlotId": "KPI_2",
"VisualId": "072be447-38e4-4c41-bc8c-fae8e39d6ce8"
},
{
"SlotId": "ENTITY_TABLE",
"VisualId": "ddf68476-6ceb-4cb3-8094-73b3b98c58a5"
}
]
}
}
]
}
問題なくインポートできました!
~ $ aws quicksight batch-create-topic-reviewed-answer --cli-input-json file://output-fix.json
{
"Status": 200,
"TopicId": "mjHJ90rMHgnDA4nR6E06m0EVAWxxxxx",
"SucceededAnswers": [
{
"AnswerId": "p2w6KWROYoV9YzQGRITyJmHpoTgc33XU"
},
{
"AnswerId": "GndqhY0lsp3NJEu3g4gkXrt4dVbcieHS"
}
],
"InvalidAnswers": [],
"RequestId": "4b4a1e2d-7844-49a0-b44d-db89a1ef38c2"
}
更新時間を見ると、インポートした時間に更新されています。Asked(その質問が使われた回数)はリセットされていました。
回答を確認してみると、レビュー済みの回答を削除する前のレイアウトが維持されていました!
おわりに
Amazon Q in QuickSightのレビュー済み回答をCLIから操作する方法を紹介してみました。
Remove
ボタン1回で気軽に質問は消せてしまうので、バックアップから戻したいなど需要があれば参考にしてみてください。
このエントリが誰かの助けになれば幸いです。
それでは、クラウド事業本部 コンサルティング部の荒平がお送りしました!
参考