Q in QuickSight トピックの Include を一括で設定する

Q in QuickSight トピックの Include を一括で設定する

トピックの DATA FIELDS が大量にある場合は API を使って一括登録する方法が考えられます。今回は JSON で設定値をあらかじめ入れておいて一括更新しましたが、Excel や CSV ファイルで一括更新したい場合は S3 に元になるファイルを格納し Lambda 等で設定値を読み込んで更新するような開発が必要そうです。
Clock Icon2025.02.14

コーヒーが好きな emi です。

Q in QuickSight トピックでは DATA FIELDS で各カラムの詳細設定が可能です。
トピックでは元になるデータセットのカラムがそのまま DATA FIELDS として取り込まれますが、このカラムが何百列にもなると 1 つ 1 つ詳細設定を行うのが大変です。
トピックの詳細設定値は AWS CLI などの API 経由で取得できるため、この詳細設定を取得して設定ファイルを作成すれば一括更新ができます。

Q in QuickSight の有効化方法やトピックの作成方法は以下のブログを参照ください。

https://dev.classmethod.jp/articles/q-in-quicksight-creata-topic-qa-dataset/
https://dev.classmethod.jp/articles/amazon-q-in-quicksight/

(おさらい)Include とは

トピックは一言で説明しにくいのですが、データセットに含まれる情報がどういうものでどんな意味を持つかを登録しておく場所、とでも言いましょうか。データセットのインデックス(索引)のようなものです。
トピックを作成すると、生成 AI の機能 Q で元のデータに対して自然言語で問い合わせができます。この機能はドキュメントで「Generative Q&A」と書かれています。

Q in QuickSight でデータセットをもとにトピックを作成すると、データセットのカラムが取り込まれます。

q-in-q-batch-configuration_1

トピックにおける Include とは、生成 AI を使った Q への Q&A で、質問への回答に該当のフィールド情報を含めるか含めないかを設定する項目です。

Include をオフにすると、質問への回答にそのフィールドの情報を含まなくなります。

  • ドキュメント
    • データセットに自分やリーダーが使用しないフィールドが含まれている場合、または回答に含めたくないフィールドがある場合は、トピックから除外できます。これらのフィールドを除外すると、Q の回答と Q インデックスから削除され、リーダーが受け取る回答の精度が向上します。
      ステップ 3: 使用されていないフィールドを除外する

    • リーダーの質問に対する回答に含めないフィールドを削除します。この例では、フィールド Row ID が削除されました。その結果、Q は Row ID フィールドを用語としてインデックスを付けず、回答にその値 (顧客の郵送先住所) のいずれも使用しません。フィールドを除外するには、[Include] をオフにします。
      ステップ 3: サンプルトピックを検索する

Include を一括で変更する

さて、それでは Include を一括で OFF にする設定をやってみます。

作成した CSV で使った CSV ファイルをアップロードしてデータセットを作成し、トピックを作成しておきます。作業はバージニア北部リージョンで行っています。(2025/2/14 現在、Q in QuickSight は東京リージョンで未 GA)

https://dev.classmethod.jp/articles/q-in-quicksight-creata-topic-qa-dataset/

sweets_with_status.csv
datetime,department,section,status,chocolate,donut,osenbei
2024-10-16 17:00:00.000,コンピューティング部,EC2課,不調,19,1,20
2024-10-16 17:00:00.000,コンピューティング部,Lambda課,不調,12,1,22
2024-10-16 17:00:00.000,コンピューティング部,Lightsail課,不調,13,1,24
2024-10-16 17:00:00.000,ストレージ部,EFS課,超ごきげん,18,21,29
2024-10-16 17:00:00.000,ストレージ部,FSx課,ごきげん,18,10,24
2024-10-16 17:00:00.000,ストレージ部,S3課,不調,15,2,20
2024-10-16 17:00:00.000,データベース部,RDS課,普通,14,8,28
2024-10-16 17:00:00.000,データベース部,DocumentDB課,不調,19,2,29
2024-10-16 17:00:00.000,データベース部,DynamoDB課,超ごきげん,11,22,24
2024-10-16 18:00:00.000,コンピューティング部,EC2課,普通,18,8,19
2024-10-16 18:00:00.000,コンピューティング部,Lambda課,普通,11,8,21
2024-10-16 18:00:00.000,コンピューティング部,Lightsail課,普通,12,8,23
2024-10-16 18:00:00.000,ストレージ部,EFS課,超ごきげん,17,20,28
2024-10-16 18:00:00.000,ストレージ部,FSx課,超ごきげん,17,20,23
2024-10-16 18:00:00.000,ストレージ部,S3課,普通,14,9,19
2024-10-16 18:00:00.000,データベース部,RDS課,ごきげん,13,12,27
2024-10-16 18:00:00.000,データベース部,DocumentDB課,普通,18,6,28
2024-10-16 18:00:00.000,データベース部,DynamoDB課,超ごきげん,10,23,23
2024-10-16 19:00:00.000,コンピューティング部,EC2課,不調,17,1,18
2024-10-16 19:00:00.000,コンピューティング部,Lambda課,ごきげん,10,12,20
2024-10-16 19:00:00.000,コンピューティング部,Lightsail課,ごきげん,11,13,22
2024-10-16 19:00:00.000,ストレージ部,EFS課,超ごきげん,16,25,27
2024-10-16 19:00:00.000,ストレージ部,FSx課,不調,16,0,22
2024-10-16 19:00:00.000,ストレージ部,S3課,ご機嫌,13,13,18
2024-10-16 19:00:00.000,データベース部,RDS課,超ごきげん,12,20,26
2024-10-16 19:00:00.000,データベース部,DocumentDB課,ご機嫌,18,12,27
2024-10-16 19:00:00.000,データベース部,DynamoDB課,超ごきげん,9,22,22

まずは最初の設定を確認します。トピックを開きます。
q-in-q-batch-configuration_3

作成したばかりだと「Last modified」のユーザーが「Q_SERVICE_USER」になっているんですね。
q-in-q-batch-configuration_4

「Data」タブを開き「DATA FIELDS」を確認すると、現在はすべて ON になっています。
q-in-q-batch-configuration_5

では、この Include をすべて OFF にしてみます。
q-in-q-batch-configuration_2

Cloushell から AWS CLI で API を実行していきます。リージョンをバージニア北部リージョンにしておいてください。
q-in-q-batch-configuration_6

list-topics コマンドでトピック ID を取得する

まずは list-topics コマンドでトピックの一覧とトピック ID を取得します。

aws quicksight list-topics \
  --aws-account-id 123456789012

▼実行結果

~ $ aws quicksight list-topics \
>   --aws-account-id 123456789012
{
    "Status": 200,
    "TopicsSummaries": [
        {
            "Arn": "arn:aws:quicksight:us-east-1:123456789012:topic/G7NAH7CCmx2csyB9gMrGbKxAZoOcsEhu",
            "TopicId": "G7NAH7CCmx2csyB9gMrGbKxAZoOcsEhu",
            "Name": "sweets_with_status",
            "UserExperienceVersion": "NEW_READER_EXPERIENCE"
        }
    ],
    "RequestId": "c9e7e964-b5e3-489b-a8f4-23aaac92172d"
}
~ $ 

"TopicId": "G7NAH7CCmx2csyB9gMrGbKxAZoOcsEhu" よりトピック ID は G7NAH7CCmx2csyB9gMrGbKxAZoOcsEhu であることが確認できました。

describe-topic コマンドで現在の設定値を取得する

続いて describe-topic コマンドでトピックの設定値を JSON で取得します。

aws quicksight describe-topic \
  --aws-account-id 123456789012 \
  --topic-id G7NAH7CCmx2csyB9gMrGbKxAZoOcsEhu
実行結果
~ $ aws quicksight describe-topic \
>   --aws-account-id 123456789012 \
>   --topic-id G7NAH7CCmx2csyB9gMrGbKxAZoOcsEhu
{
    "Status": 200,
    "Arn": "arn:aws:quicksight:us-east-1:123456789012:topic/G7NAH7CCmx2csyB9gMrGbKxAZoOcsEhu",
    "TopicId": "G7NAH7CCmx2csyB9gMrGbKxAZoOcsEhu",
    "Topic": {
        "Name": "sweets_with_status",
        "Description": "sweets_with_status",
        "UserExperienceVersion": "NEW_READER_EXPERIENCE",
        "DataSets": [
            {
                "DatasetArn": "arn:aws:quicksight:us-east-1:123456789012:dataset/40e73fba-718c-4ede-b791-df32268bf966",
                "DatasetName": "Sweets With Status",
                "DataAggregation": {
                    "DefaultDateColumnName": "datetime"
                },
                "Columns": [
                    {
                        "ColumnName": "datetime",
                        "ColumnFriendlyName": "Datetime",
                        "ColumnDescription": "",
                        "ColumnSynonyms": [
                            "date",
                            "time"
                        ],
                        "ColumnDataRole": "DIMENSION",
                        "IsIncludedInTopic": true,
                        "SemanticType": {
                            "TypeName": "Date"
                        },
                        "NeverAggregateInFilter": false
                    },
                    {
                        "ColumnName": "department",
                        "ColumnFriendlyName": "Department",
                        "ColumnDescription": "",
                        "ColumnSynonyms": [
                            "division"
                        ],
                        "ColumnDataRole": "DIMENSION",
                        "IsIncludedInTopic": true,
                        "NeverAggregateInFilter": false
                    },
                    {
                        "ColumnName": "section",
                        "ColumnFriendlyName": "Section",
                        "ColumnDescription": "",
                        "ColumnSynonyms": [
                            "segment"
                        ],
                        "ColumnDataRole": "DIMENSION",
                        "IsIncludedInTopic": true,
                        "NeverAggregateInFilter": false
                    },
                    {
                        "ColumnName": "status",
                        "ColumnFriendlyName": "Status",
                        "ColumnDescription": "",
                        "ColumnSynonyms": [],
                        "ColumnDataRole": "DIMENSION",
                        "IsIncludedInTopic": true,
                        "NeverAggregateInFilter": false
                    },
                    {
                        "ColumnName": "chocolate",
                        "ColumnFriendlyName": "Chocolate",
                        "ColumnDescription": "",
                        "ColumnSynonyms": [
                            "cacao",
                            "candy",
                            "cocoa"
                        ],
                        "ColumnDataRole": "MEASURE",
                        "IsIncludedInTopic": true,
                        "NeverAggregateInFilter": false
                    },
                    {
                        "ColumnName": "donut",
                        "ColumnFriendlyName": "Donut",
                        "ColumnDescription": "",
                        "ColumnSynonyms": [
                            "doughnut",
                            "muffin"
                        ],
                        "ColumnDataRole": "MEASURE",
                        "IsIncludedInTopic": true,
                        "NeverAggregateInFilter": false
                    },
                    {
                        "ColumnName": "osenbei",
                        "ColumnFriendlyName": "Osenbei",
                        "ColumnDescription": "",
                        "ColumnSynonyms": [
                            "osen"
                        ],
                        "ColumnDataRole": "MEASURE",
                        "IsIncludedInTopic": true,
                        "NeverAggregateInFilter": false
                    }
                ]
            }
        ],
        "ConfigOptions": {
            "QBusinessInsightsEnabled": true
        }
    },
    "RequestId": "7f6bb797-6190-4c62-9f8d-3f616dbbdfed"
}
~ $ 

スケルトンファイルの作成

では update-topic コマンドでトピックを更新していこうかと思ったのですが、設定値の JSON が長いのでスケルトンファイルを使った方が良さそうです。

AWS CLI のスケルトンファイルの使い方は以下のブログで紹介しているので参照ください。
https://dev.classmethod.jp/articles/quicksight-restricted-shared-folders-cli-skeleton/

まず --generate-cli-skeleton パラメーターを指定して、JSON のひな形を表示します。

aws quicksight update-topic --generate-cli-skeleton
実行結果
~ $ aws quicksight update-topic --generate-cli-skeleton
{
    "AwsAccountId": "",
    "TopicId": "",
    "Topic": {
        "Name": "",
        "Description": "",
        "UserExperienceVersion": "LEGACY",
        "DataSets": [
            {
                "DatasetArn": "",
                "DatasetName": "",
                "DatasetDescription": "",
                "DataAggregation": {
                    "DatasetRowDateGranularity": "SECOND",
                    "DefaultDateColumnName": ""
                },
                "Filters": [
                    {
                        "FilterDescription": "",
                        "FilterClass": "ENFORCED_VALUE_FILTER",
                        "FilterName": "",
                        "FilterSynonyms": [
                            ""
                        ],
                        "OperandFieldName": "",
                        "FilterType": "CATEGORY_FILTER",
                        "CategoryFilter": {
                            "CategoryFilterFunction": "EXACT",
                            "CategoryFilterType": "CUSTOM_FILTER",
                            "Constant": {
                                "ConstantType": "SINGULAR",
                                "SingularConstant": "",
                                "CollectiveConstant": {
                                    "ValueList": [
                                        ""
                                    ]
                                }
                            },
                            "Inverse": true
                        },
                        "NumericEqualityFilter": {
                            "Constant": {
                                "ConstantType": "SINGULAR",
                                "SingularConstant": ""
                            },
                            "Aggregation": "NO_AGGREGATION"
                        },
                        "NumericRangeFilter": {
                            "Inclusive": true,
                            "Constant": {
                                "ConstantType": "SINGULAR",
                                "RangeConstant": {
                                    "Minimum": "",
                                    "Maximum": ""
                                }
                            },
                            "Aggregation": "NO_AGGREGATION"
                        },
                        "DateRangeFilter": {
                            "Inclusive": true,
                            "Constant": {
                                "ConstantType": "SINGULAR",
                                "RangeConstant": {
                                    "Minimum": "",
                                    "Maximum": ""
                                }
                            }
                        },
                        "RelativeDateFilter": {
                            "TimeGranularity": "SECOND",
                            "RelativeDateFilterFunction": "PREVIOUS",
                            "Constant": {
                                "ConstantType": "SINGULAR",
                                "SingularConstant": ""
                            }
                        }
                    }
                ],
                "Columns": [
                    {
                        "ColumnName": "",
                        "ColumnFriendlyName": "",
                        "ColumnDescription": "",
                        "ColumnSynonyms": [
                            ""
                        ],
                        "ColumnDataRole": "DIMENSION",
                        "Aggregation": "SUM",
                        "IsIncludedInTopic": true,
                        "DisableIndexing": true,
                        "ComparativeOrder": {
                            "UseOrdering": "GREATER_IS_BETTER",
                            "SpecifedOrder": [
                                ""
                            ],
                            "TreatUndefinedSpecifiedValues": "LEAST"
                        },
                        "SemanticType": {
                            "TypeName": "",
                            "SubTypeName": "",
                            "TypeParameters": {
                                "KeyName": ""
                            },
                            "TruthyCellValue": "",
                            "TruthyCellValueSynonyms": [
                                ""
                            ],
                            "FalseyCellValue": "",
                            "FalseyCellValueSynonyms": [
                                ""
                            ]
                        },
                        "TimeGranularity": "SECOND",
                        "AllowedAggregations": [
                            "COUNT"
                        ],
                        "NotAllowedAggregations": [
                            "COUNT"
                        ],
                        "DefaultFormatting": {
                            "DisplayFormat": "AUTO",
                            "DisplayFormatOptions": {
                                "UseBlankCellFormat": true,
                                "BlankCellFormat": "",
                                "DateFormat": "",
                                "DecimalSeparator": "COMMA",
                                "GroupingSeparator": "",
                                "UseGrouping": true,
                                "FractionDigits": 0,
                                "Prefix": "",
                                "Suffix": "",
                                "UnitScaler": "NONE",
                                "NegativeFormat": {
                                    "Prefix": "",
                                    "Suffix": ""
                                },
                                "CurrencySymbol": ""
                            }
                        },
                        "NeverAggregateInFilter": true,
                        "CellValueSynonyms": [
                            {
                                "CellValue": "",
                                "Synonyms": [
                                    ""
                                ]
                            }
                        ],
                        "NonAdditive": true
                    }
                ],
                "CalculatedFields": [
                    {
                        "CalculatedFieldName": "",
                        "CalculatedFieldDescription": "",
                        "Expression": "",
                        "CalculatedFieldSynonyms": [
                            ""
                        ],
                        "IsIncludedInTopic": true,
                        "DisableIndexing": true,
                        "ColumnDataRole": "DIMENSION",
                        "TimeGranularity": "SECOND",
                        "DefaultFormatting": {
                            "DisplayFormat": "AUTO",
                            "DisplayFormatOptions": {
                                "UseBlankCellFormat": true,
                                "BlankCellFormat": "",
                                "DateFormat": "",
                                "DecimalSeparator": "COMMA",
                                "GroupingSeparator": "",
                                "UseGrouping": true,
                                "FractionDigits": 0,
                                "Prefix": "",
                                "Suffix": "",
                                "UnitScaler": "NONE",
                                "NegativeFormat": {
                                    "Prefix": "",
                                    "Suffix": ""
                                },
                                "CurrencySymbol": ""
                            }
                        },
                        "Aggregation": "SUM",
                        "ComparativeOrder": {
                            "UseOrdering": "GREATER_IS_BETTER",
                            "SpecifedOrder": [
                                ""
                            ],
                            "TreatUndefinedSpecifiedValues": "LEAST"
                        },
                        "SemanticType": {
                            "TypeName": "",
                            "SubTypeName": "",
                            "TypeParameters": {
                                "KeyName": ""
                            },
                            "TruthyCellValue": "",
                            "TruthyCellValueSynonyms": [
                                ""
                            ],
                            "FalseyCellValue": "",
                            "FalseyCellValueSynonyms": [
                                ""
                            ]
                        },
                        "AllowedAggregations": [
                            "COUNT"
                        ],
                        "NotAllowedAggregations": [
                            "COUNT"
                        ],
                        "NeverAggregateInFilter": true,
                        "CellValueSynonyms": [
                            {
                                "CellValue": "",
                                "Synonyms": [
                                    ""
                                ]
                            }
                        ],
                        "NonAdditive": true
                    }
                ],
                "NamedEntities": [
                    {
                        "EntityName": "",
                        "EntityDescription": "",
                        "EntitySynonyms": [
                            ""
                        ],
                        "SemanticEntityType": {
                            "TypeName": "",
                            "SubTypeName": "",
                            "TypeParameters": {
                                "KeyName": ""
                            }
                        },
                        "Definition": [
                            {
                                "FieldName": "",
                                "PropertyName": "",
                                "PropertyRole": "PRIMARY",
                                "PropertyUsage": "INHERIT",
                                "Metric": {
                                    "Aggregation": "SUM",
                                    "AggregationFunctionParameters": {
                                        "KeyName": ""
                                    }
                                }
                            }
                        ]
                    }
                ]
            }
        ],
        "ConfigOptions": {
            "QBusinessInsightsEnabled": true
        }
    }
}
~ $ 

JSON のひな形が表示されました。長いですね。
これを JSON ファイルとして保存します。ファイル名は何でもよいですが、今回は update-topic-included-off.json としました。

aws quicksight update-topic --generate-cli-skeleton > update-topic-included-off.json

▼実行結果

~ $ aws quicksight update-topic --generate-cli-skeleton > update-topic-included-off.json
~ $ 

ls コマンドでファイルが作成されたことを確認します。

▼実行結果

~ $ ls
update-topic-included-off.json
~ $ 

ありますね。

cat コマンドでファイルの中身を確認します。

cat update-topic-included-off.json
実行結果
~ $ cat update-topic-included-off.json 
{
    "AwsAccountId": "",
    "TopicId": "",
    "Topic": {
        "Name": "",
        "Description": "",
        "UserExperienceVersion": "LEGACY",
        "DataSets": [
            {
                "DatasetArn": "",
                "DatasetName": "",
                "DatasetDescription": "",
                "DataAggregation": {
                    "DatasetRowDateGranularity": "SECOND",
                    "DefaultDateColumnName": ""
                },
                "Filters": [
                    {
                        "FilterDescription": "",
                        "FilterClass": "ENFORCED_VALUE_FILTER",
                        "FilterName": "",
                        "FilterSynonyms": [
                            ""
                        ],
                        "OperandFieldName": "",
                        "FilterType": "CATEGORY_FILTER",
                        "CategoryFilter": {
                            "CategoryFilterFunction": "EXACT",
                            "CategoryFilterType": "CUSTOM_FILTER",
                            "Constant": {
                                "ConstantType": "SINGULAR",
                                "SingularConstant": "",
                                "CollectiveConstant": {
                                    "ValueList": [
                                        ""
                                    ]
                                }
                            },
                            "Inverse": true
                        },
                        "NumericEqualityFilter": {
                            "Constant": {
                                "ConstantType": "SINGULAR",
                                "SingularConstant": ""
                            },
                            "Aggregation": "NO_AGGREGATION"
                        },
                        "NumericRangeFilter": {
                            "Inclusive": true,
                            "Constant": {
                                "ConstantType": "SINGULAR",
                                "RangeConstant": {
                                    "Minimum": "",
                                    "Maximum": ""
                                }
                            },
                            "Aggregation": "NO_AGGREGATION"
                        },
                        "DateRangeFilter": {
                            "Inclusive": true,
                            "Constant": {
                                "ConstantType": "SINGULAR",
                                "RangeConstant": {
                                    "Minimum": "",
                                    "Maximum": ""
                                }
                            }
                        },
                        "RelativeDateFilter": {
                            "TimeGranularity": "SECOND",
                            "RelativeDateFilterFunction": "PREVIOUS",
                            "Constant": {
                                "ConstantType": "SINGULAR",
                                "SingularConstant": ""
                            }
                        }
                    }
                ],
                "Columns": [
                    {
                        "ColumnName": "",
                        "ColumnFriendlyName": "",
                        "ColumnDescription": "",
                        "ColumnSynonyms": [
                            ""
                        ],
                        "ColumnDataRole": "DIMENSION",
                        "Aggregation": "SUM",
                        "IsIncludedInTopic": true,
                        "DisableIndexing": true,
                        "ComparativeOrder": {
                            "UseOrdering": "GREATER_IS_BETTER",
                            "SpecifedOrder": [
                                ""
                            ],
                            "TreatUndefinedSpecifiedValues": "LEAST"
                        },
                        "SemanticType": {
                            "TypeName": "",
                            "SubTypeName": "",
                            "TypeParameters": {
                                "KeyName": ""
                            },
                            "TruthyCellValue": "",
                            "TruthyCellValueSynonyms": [
                                ""
                            ],
                            "FalseyCellValue": "",
                            "FalseyCellValueSynonyms": [
                                ""
                            ]
                        },
                        "TimeGranularity": "SECOND",
                        "AllowedAggregations": [
                            "COUNT"
                        ],
                        "NotAllowedAggregations": [
                            "COUNT"
                        ],
                        "DefaultFormatting": {
                            "DisplayFormat": "AUTO",
                            "DisplayFormatOptions": {
                                "UseBlankCellFormat": true,
                                "BlankCellFormat": "",
                                "DateFormat": "",
                                "DecimalSeparator": "COMMA",
                                "GroupingSeparator": "",
                                "UseGrouping": true,
                                "FractionDigits": 0,
                                "Prefix": "",
                                "Suffix": "",
                                "UnitScaler": "NONE",
                                "NegativeFormat": {
                                    "Prefix": "",
                                    "Suffix": ""
                                },
                                "CurrencySymbol": ""
                            }
                        },
                        "NeverAggregateInFilter": true,
                        "CellValueSynonyms": [
                            {
                                "CellValue": "",
                                "Synonyms": [
                                    ""
                                ]
                            }
                        ],
                        "NonAdditive": true
                    }
                ],
                "CalculatedFields": [
                    {
                        "CalculatedFieldName": "",
                        "CalculatedFieldDescription": "",
                        "Expression": "",
                        "CalculatedFieldSynonyms": [
                            ""
                        ],
                        "IsIncludedInTopic": true,
                        "DisableIndexing": true,
                        "ColumnDataRole": "DIMENSION",
                        "TimeGranularity": "SECOND",
                        "DefaultFormatting": {
                            "DisplayFormat": "AUTO",
                            "DisplayFormatOptions": {
                                "UseBlankCellFormat": true,
                                "BlankCellFormat": "",
                                "DateFormat": "",
                                "DecimalSeparator": "COMMA",
                                "GroupingSeparator": "",
                                "UseGrouping": true,
                                "FractionDigits": 0,
                                "Prefix": "",
                                "Suffix": "",
                                "UnitScaler": "NONE",
                                "NegativeFormat": {
                                    "Prefix": "",
                                    "Suffix": ""
                                },
                                "CurrencySymbol": ""
                            }
                        },
                        "Aggregation": "SUM",
                        "ComparativeOrder": {
                            "UseOrdering": "GREATER_IS_BETTER",
                            "SpecifedOrder": [
                                ""
                            ],
                            "TreatUndefinedSpecifiedValues": "LEAST"
                        },
                        "SemanticType": {
                            "TypeName": "",
                            "SubTypeName": "",
                            "TypeParameters": {
                                "KeyName": ""
                            },
                            "TruthyCellValue": "",
                            "TruthyCellValueSynonyms": [
                                ""
                            ],
                            "FalseyCellValue": "",
                            "FalseyCellValueSynonyms": [
                                ""
                            ]
                        },
                        "AllowedAggregations": [
                            "COUNT"
                        ],
                        "NotAllowedAggregations": [
                            "COUNT"
                        ],
                        "NeverAggregateInFilter": true,
                        "CellValueSynonyms": [
                            {
                                "CellValue": "",
                                "Synonyms": [
                                    ""
                                ]
                            }
                        ],
                        "NonAdditive": true
                    }
                ],
                "NamedEntities": [
                    {
                        "EntityName": "",
                        "EntityDescription": "",
                        "EntitySynonyms": [
                            ""
                        ],
                        "SemanticEntityType": {
                            "TypeName": "",
                            "SubTypeName": "",
                            "TypeParameters": {
                                "KeyName": ""
                            }
                        },
                        "Definition": [
                            {
                                "FieldName": "",
                                "PropertyName": "",
                                "PropertyRole": "PRIMARY",
                                "PropertyUsage": "INHERIT",
                                "Metric": {
                                    "Aggregation": "SUM",
                                    "AggregationFunctionParameters": {
                                        "KeyName": ""
                                    }
                                }
                            }
                        ]
                    }
                ]
            }
        ],
        "ConfigOptions": {
            "QBusinessInsightsEnabled": true
        }
    }
}
~ $ 

ファイルの中身もちゃんと保存されていますね。

update-topic-included-off.json を編集

以下のように update-topic-included-off.json を編集していきます。
私は一旦 Visual Ctudio Code を使って手元で編集しました。

  • "AwsAccountId""TopicId""Topic""Columns" などの項目は describe-topic コマンドの結果からコピー&ペースト
  • "Filters" は削除(今回は設定していない)
  • 各フィールドごとに "IsIncludedInTopic" という設定項目があるので、それを false に設定
  • "CalculatedFields" は削除(今回は設定していない)
  • "NamedEntities" は削除(今回は設定していない)
update-topic-included-off.json
{
    "AwsAccountId": "123456789012",
    "TopicId": "G7NAH7CCmx2csyB9gMrGbKxAZoOcsEhu",
    "Topic": {
        "Name": "sweets_with_status",
        "Description": "sweets_with_status",
        "UserExperienceVersion": "NEW_READER_EXPERIENCE",
        "DataSets": [
            {
                "DatasetArn": "arn:aws:quicksight:us-east-1:123456789012:dataset/40e73fba-718c-4ede-b791-df32268bf966",
                "DatasetName": "Sweets With Status",
                "DataAggregation": {
                    "DefaultDateColumnName": "datetime"
                },
                "Columns": [
                    {
                        "ColumnName": "datetime",
                        "ColumnFriendlyName": "Datetime",
                        "ColumnDescription": "",
                        "ColumnSynonyms": [
                            "date",
                            "time"
                        ],
                        "ColumnDataRole": "DIMENSION",
                        "IsIncludedInTopic": false,
                        "SemanticType": {
                            "TypeName": "Date"
                        },
                        "NeverAggregateInFilter": false
                    },
                    {
                        "ColumnName": "department",
                        "ColumnFriendlyName": "Department",
                        "ColumnDescription": "",
                        "ColumnSynonyms": [
                            "division"
                        ],
                        "ColumnDataRole": "DIMENSION",
                        "IsIncludedInTopic": false,
                        "NeverAggregateInFilter": false
                    },
                    {
                        "ColumnName": "section",
                        "ColumnFriendlyName": "Section",
                        "ColumnDescription": "",
                        "ColumnSynonyms": [
                            "segment"
                        ],
                        "ColumnDataRole": "DIMENSION",
                        "IsIncludedInTopic": false,
                        "NeverAggregateInFilter": false
                    },
                    {
                        "ColumnName": "status",
                        "ColumnFriendlyName": "Status",
                        "ColumnDescription": "",
                        "ColumnSynonyms": [],
                        "ColumnDataRole": "DIMENSION",
                        "IsIncludedInTopic": false,
                        "NeverAggregateInFilter": false
                    },
                    {
                        "ColumnName": "chocolate",
                        "ColumnFriendlyName": "Chocolate",
                        "ColumnDescription": "",
                        "ColumnSynonyms": [
                            "cacao",
                            "candy",
                            "cocoa"
                        ],
                        "ColumnDataRole": "MEASURE",
                        "IsIncludedInTopic": false,
                        "NeverAggregateInFilter": false
                    },
                    {
                        "ColumnName": "donut",
                        "ColumnFriendlyName": "Donut",
                        "ColumnDescription": "",
                        "ColumnSynonyms": [
                            "doughnut",
                            "muffin"
                        ],
                        "ColumnDataRole": "MEASURE",
                        "IsIncludedInTopic": false,
                        "NeverAggregateInFilter": false
                    },
                    {
                        "ColumnName": "osenbei",
                        "ColumnFriendlyName": "Osenbei",
                        "ColumnDescription": "",
                        "ColumnSynonyms": [
                            "osen"
                        ],
                        "ColumnDataRole": "MEASURE",
                        "IsIncludedInTopic": false,
                        "NeverAggregateInFilter": false
                    }
                ]
            }
        ],
        "ConfigOptions": {
            "QBusinessInsightsEnabled": true
        }
    }
}

手元の VSCode で JSON を編集できました。
では、update-topic-included-off.json を vim で編集します。

CLI スケルトンを使って JSON 形式でパラメーター設定する で詳細な vim での編集方法をキャプチャ付きで記載していますのでご参照ください。

vim コマンドでファイルを開きます。

▼実行結果

~ $ vim update-topic-included-off.json 
~ $ 
  • :%d と入力して Enter キーを押し全行を削除
  • :set paste と入力して Enter キーを押し貼り付けモードにする
  • i を押下して編集モードする
    • i を押下すると画面下部に --INSERT (paste)-- と表示される
  • 編集した JSON を貼り付ける
  • esc キーを押下して編集モードを抜ける
  • :wq と入力して Enter キーを押し保存して終了

ファイルが編集できたら cat コマンドでファイルが保存できているか確認します。

cat update-topic-included-off.json
実行結果
~ $ cat update-topic-included-off.json 
{
    "AwsAccountId": "123456789012",
    "TopicId": "G7NAH7CCmx2csyB9gMrGbKxAZoOcsEhu",
    "Topic": {
        "Name": "sweets_with_status",
        "Description": "sweets_with_status",
        "UserExperienceVersion": "NEW_READER_EXPERIENCE",
        "DataSets": [
            {
                "DatasetArn": "arn:aws:quicksight:us-east-1:123456789012:dataset/40e73fba-718c-4ede-b791-df32268bf966",
                "DatasetName": "Sweets With Status",
                "DataAggregation": {
                    "DefaultDateColumnName": "datetime"
                },
                "Columns": [
                    {
                        "ColumnName": "datetime",
                        "ColumnFriendlyName": "Datetime",
                        "ColumnDescription": "",
                        "ColumnSynonyms": [
                            "date",
                            "time"
                        ],
                        "ColumnDataRole": "DIMENSION",
                        "IsIncludedInTopic": false,
                        "SemanticType": {
                            "TypeName": "Date"
                        },
                        "NeverAggregateInFilter": false
                    },
                    {
                        "ColumnName": "department",
                        "ColumnFriendlyName": "Department",
                        "ColumnDescription": "",
                        "ColumnSynonyms": [
                            "division"
                        ],
                        "ColumnDataRole": "DIMENSION",
                        "IsIncludedInTopic": false,
                        "NeverAggregateInFilter": false
                    },
                    {
                        "ColumnName": "section",
                        "ColumnFriendlyName": "Section",
                        "ColumnDescription": "",
                        "ColumnSynonyms": [
                            "segment"
                        ],
                        "ColumnDataRole": "DIMENSION",
                        "IsIncludedInTopic": false,
                        "NeverAggregateInFilter": false
                    },
                    {
                        "ColumnName": "status",
                        "ColumnFriendlyName": "Status",
                        "ColumnDescription": "",
                        "ColumnSynonyms": [],
                        "ColumnDataRole": "DIMENSION",
                        "IsIncludedInTopic": false,
                        "NeverAggregateInFilter": false
                    },
                    {
                        "ColumnName": "chocolate",
                        "ColumnFriendlyName": "Chocolate",
                        "ColumnDescription": "",
                        "ColumnSynonyms": [
                            "cacao",
                            "candy",
                            "cocoa"
                        ],
                        "ColumnDataRole": "MEASURE",
                        "IsIncludedInTopic": false,
                        "NeverAggregateInFilter": false
                    },
                    {
                        "ColumnName": "donut",
                        "ColumnFriendlyName": "Donut",
                        "ColumnDescription": "",
                        "ColumnSynonyms": [
                            "doughnut",
                            "muffin"
                        ],
                        "ColumnDataRole": "MEASURE",
                        "IsIncludedInTopic": false,
                        "NeverAggregateInFilter": false
                    },
                    {
                        "ColumnName": "osenbei",
                        "ColumnFriendlyName": "Osenbei",
                        "ColumnDescription": "",
                        "ColumnSynonyms": [
                            "osen"
                        ],
                        "ColumnDataRole": "MEASURE",
                        "IsIncludedInTopic": false,
                        "NeverAggregateInFilter": false
                    }
                ]
            }
        ],
        "ConfigOptions": {
            "QBusinessInsightsEnabled": true
        }
    }
}
~ $ 

保存できていますね。

update-topic コマンドでトピックを更新する

では、update-topic コマンドでトピックを更新します。
--cli-input-json パラメーターで作成した JSON ファイルを指定します。

aws quicksight update-topic \
  --cli-input-json file://update-topic-included-off.json

▼実行結果

~ $ aws quicksight update-topic \
>   --cli-input-json file://update-topic-included-off.json
{
    "Status": 200,
    "TopicId": "G7NAH7CCmx2csyB9gMrGbKxAZoOcsEhu",
    "Arn": "arn:aws:quicksight:us-east-1:123456789012:topic/G7NAH7CCmx2csyB9gMrGbKxAZoOcsEhu",
    "RefreshArn": "arn:aws:quicksight:us-east-1:123456789012:topic/G7NAH7CCmx2csyB9gMrGbKxAZoOcsEhu/refresh/1739421560820",
    "RequestId": "69dc9ec4-db1e-4a96-8a65-70cdcea45e81"
}
~ $ 

"Status": 200, となっており、コマンドは成功しました。QuickSight コンソールからトピックを確認します。

ブラウザを更新すると、以下のように Include がすべてオフになっていることが確認できました。

q-in-q-batch-configuration_7

Include を一括で ON にするには "IsIncludedInTopic"true に設定すれば OK です。

おわりに

シノニムの一括設定もやりたかったのですが、字数制限に引っかかってしまったので別記事で記載します。

もう少し設定を簡略化するには、例えば Lambda 関数などで AWS SDK (boto3) を使用して DescribeTopic API を呼び出し、取得した JSON の IsIncludedInTopictrue に変更し、更新された JSON を返すような開発をすればよいのかなと思います。

本記事への質問やご要望については画面下部のお問い合わせ「DevelopersIO について」からご連絡ください。記事に関してお問い合わせいただけます。

参考

https://docs.aws.amazon.com/ja_jp/quicksight/latest/user/data-source-limits.html

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.