Amazon QuickSight 特定条件の中で一意の値の数をカウントする関数と、複数条件指定の仕方について

2023.10.25

私は複数の AWS アカウントの利用費を横串で分析するためのツールとして Amazon QuickSight を利用しています。

今回は AWS の請求項目から GuardDuty が各 AWS アカウントのすべてのリージョンで有効化されているか判定を作成していました。その対応のなかで便利だった関数 distinct_countIf と、複数条件指定でハマったので備忘録として残します。

グラフ作成例

この関数を用いた計算フィールドで作成したグラフの例です。各アカウントに対して Good マークがついていればそのリージョンで GuardDuty が有効化されているかわかるように可視化してみました。

アカウント毎に GuardDuty が有効化されているか請求項目から判定しています。

カウントするのに便利だった関数

distinct_countIf関数を利用しました。

Excel で例えるとCOUNTIF関数とUNIQUE関数の組み合わせの様なもので、特定条件に絞り込み、一意の値のみをカウントができました。

使用例

私の環境を例に説明しますので今回使用するフィールドを説明します。

  • aws_account_idフィールドは AWS アカウント ID が格納されています
  • usage_type フィールドは APN1-PaidEventsAnlyzed などのキャプチャの赤枠の項目が格納されています。

計算フィールド作成

distinct_countIf関数の書式は以下です。

distinct_countIf(dimension or measure, condition)
  • dimentionは、各 AWS アカウントを一意で集計(カウント)したいため、アカウント ID が格納されているフィールドを指定します。
  • conditionは、請求項目と完全一致でよければ=のあとに文字列を指定します。

先に説明したフィールドを使い以下の計算フィールドを作成しました。

distinct_countIf({aws_account_id}, {usage_type} = 'APN1-PaidEventsAnalyzed')

この計算フィールドで請求項目名 APN1-PaidEventsAnalyzed が存在している AWS アカウントを集計できます。

課題

APN1-PaidEventsAnalyzed は GuardDuty 利用費にあたる請求項目で GuardDuty の利用判定では有効でした。しかし、GuardDuty のトライアル期間 30 日の間は APN1-FreeEventsAnalyzed という請求項目で計上されることがわかりました。そのため複数条件の指定が必要になりました。

複数条件指定の仕方

計算フィールドの作成の内容までは良かったのですが、conditionのなかで複数条件を指定すると計算フィールドの保存時に何度もエラーがでて保存できなく指定方法でハマりました。 ドキュメントでは複数条件指定のサンプルの構文まで用意されています。これを参考にしてもうまくできませんでした。

サンプルの構文

distinct_countIf(ProdRev,CalendarDay >= ${BasePeriodStartDate} AND CalendarDay <= ${BasePeriodEndDate} AND SourcingType <> 'Indirect')

最終的にエラーなしで通った計算フィールドの内容を記載しておきます。同じフィールド名({usage_type})に対して、AND や OR で複数条件を指定はできました。

distinct_countIf({aws_account_id}, ({usage_type} = 'APN1-PaidEventsAnalyzed' OR {usage_type} = 'APN1-FreeEventsAnalyzed'))

おわりに

ドキュメントのサンプル構文をみても複数条件指定がエラーで計算フィールドを保存できないときの参考になれば幸いです。そもそも複数条件指定ができない関数なのではないのかと疑ったり、他に適切な関数はないのか探したりして回り道の末に私はだいぶ時間を溶かしました。

参考