AWSのコスト分析にAmazon Qを使ってみた

# はじめに

私は今年度SIerに新卒入社したエンジニアです。
「AWSの勉強も兼ねて、AIを活用したAWSのコスト分析を行ってほしい」と依頼されました。
この記事は、コスト分析とは？という一般論から勉強を始め、Amazon Q（AWS上で動作する生成AIアシスタント）を利用した2つのサービス

- Q in QuickSight
- Q Developer

が所属部署が抱えるコスト周りの課題を解決できるか検証し、その結果をまとめたものです。

## （予備知識: なぜコスト分析をするのか？）

まず、コスト分析・最適化についての一般論はクラスメソッドさんの記事を中心に読み勉強させていただきました。↓

https://dev.classmethod.jp/articles/aws-cost-optimization-first-step/

AWSのコスト管理については上記記事が非常にわかりやすいので割愛させていただきますが、「コスト最適化による費用削減額＝利益」であるため事業に対する直接的なインパクトを持ち、可視化・分析はその一歩目として大変重要なステップです。

- コスト最適化サービス
    - Trusted Advisor
        - コスト最適化機能では、[チェックリスト](https://docs.aws.amazon.com/ja_jp/awssupport/latest/user/cost-optimization-checks.html)に沿ってコスト最適化のリコメンドをしてくれる
        - コスト自体の可視化機能はない
    - Cost Optimization hub
        - アカウント横断の分析が可能。推定削減額とそのためのアクションは提示される
        - コスト自体の可視化機能はない
- コスト分析サービス
    - Cost Explorer
        - コンソール上でコストの可視化ができる
        - 分析の自由度が低い（後述）

上記AWSのサービスでもコスト分析・最適化が可能ですが、より自由度の高い分析(データの深堀り)・可視化をしたい場合には他のサービスを検討する必要があります。

# 現状
現状、所属部署のコスト管理周りは以下のような状況です。

- アカウントが40個程度存在
- チームごとにアカウントが分かれておらず、一つのアカウントに複数のチームのリソースが存在（お金の出どころが違う）
    - 各リソースがどのチームの所有物かを示すタグ付けは行われている

また、本来はアカウント/チーム/AWSサービス別で費用を可視化したいのですが、Cost Explorer コンソール上では2軸以上の分析が困難（「グループ化の条件」にひとつしかパラメータを設定できない）で、**チーム別かつAWSサービス別に費用を表示ができない**という現状があります。
そのため、アカウント毎に情報を出力し、それを一つのエクセルに集計するという作業を定期的に手動で行っており、手間がかかっています。

さらに、定常的に観測しているデータ以外の情報を得たい場合は**手動でCost Explorerのパラメータ設定**をする必要があり、こちらにも手間がかかります。

# 実現したいこと
現状を踏まえて、以下の目標を設定しました。
* ①（**最小限の手間で**）以下の項目で費用を分割し、定常的に可視化できるようにする
    * アカウント
        * チーム（各リソースがどのチームの所有物かを示すタグ付けは行われている前提）
            * AWSサービス

* ②さらに詳細な（定常的な可視化の範囲外の）情報を知りたいとき、Qに**自然言語で問い合わせ回答を得たい**
    * グラフを見て異常な値（スパイクなど）の原因
    * 先月との比較の深堀り
    * 上期、クオータ単位でのとりまとめ
    * 費用が最も大きいリソースidの特定　など

今回は、①&②に対するソリューションとしてAmazon Q in QuickSight、②に対するソリューションとしてAmazon Q Developerを試し、どこまで課題が解決できるか検証してみました。

# 【実験1】 Amazon Q in QuickSightを用いたコスト分析
## （前提）QuickSightとは
https://aws.amazon.com/jp/pm/quicksight/?trk=0ba55d2e-bf2a-46e6-89d8-26b6a67e1d12&sc_channel=ps&ef_id=Cj0KCQiAr7C6BhDRARIsAOUKifizgs_h77dUJ8tzGzoUloNQYPvEmMWxSMdKEq_LJAABvatpHc0Ic5MaAj2kEALw_wcB:G:s&s_kwcid=AL!4422!3!651612323453!e!!g!!quicksights!19835790122!147297579819&gclid=Cj0KCQiAr7C6BhDRARIsAOUKifizgs_h77dUJ8tzGzoUloNQYPvEmMWxSMdKEq_LJAABvatpHc0Ic5MaAj2kEALw_wcB

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932360/ef97be52-bf3a-759c-d651-9a03c06243e6.png)

BI (Business Intelligence)サービスです。（上記画像は作成したダッシュボードの例）
特に、AWS上のデータソースと接続が容易なのが売りです。
> CSV および Excel ファイルをアップロード、Salesforce などの SaaS アプリケーションに接続、SQL サーバー、MySQL、PostgreSQL などのオンプレミスデータベースにアクセス、そして Amazon Redshift、Amazon Relational Database Service (Amazon RDS)、Amazon Aurora、Amazon Athena、Amazon Simple Storage Service (Amazon S3) などの AWS データソースをシームレスに検出します。
https://aws.amazon.com/jp/quicksight/resources/faqs/

概要に関しては[こちらの記事](
https://dev.classmethod.jp/articles/introduction-2024-amazon-quicksight)がわかりやすかったです。


## Q in QuickSightとは

https://aws.amazon.com/jp/quicksight/q/

自然言語で（[Amazon Q](https://aws.amazon.com/jp/q/)との対話形式で）可視化＆データの深堀りができる機能です。
- グラフ作るためのポチポチ操作が面倒 ⇒ 生成BI機能で解決
- 詳細分析のためにはクエリを書かないといけない ⇒ Qへの問い合わせ機能で解決

（参考：https://dev.classmethod.jp/articles/amazon-q-quicksight-data-exploration-generative-bi-capabilities/ ）

## やってみた
### 実験内容＆結果
本来は以下の流れでAWSの請求データをQuickSightに取り込みます。
1. Billing and Cost Managementから請求情報をエクスポート＆S3バケットに保存
    - 参考：https://dev.classmethod.jp/articles/data-export/
1. QuickSightからデータセットを作成（S3バケットを参照）
    - 参考：https://docs.aws.amazon.com/ja_jp/quicksight/latest/user/create-a-data-set-s3-procedure.html
    - 参考：https://docs.aws.amazon.com/ja_jp/quicksight/latest/user/supported-manifest-file-format.html

コストの実データは公開することができないため、今回は代わりに上記を模したダミーデータをPythonで作成し使用しました。ダミーデータの各カラムとデータの概要は以下の通りです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932360/5ebe57ba-d7b3-aabe-dece-322614cb4dd3.png)


- 各カラムの説明
    - AWS Account Name: AWSアカウント名
    - AWS Service Name: AWSサービス名
    - Resource ID: リソースID
    - Billing Period: 請求期間
    - Cost(USD): 費用（ドル）
    - Team tag：リソースを所有するチームのタグ
    - Region: リージョン
- データの概要
    - 2021~2023年の3年分
    - 1000件くらい
    - anomalyなデータを含めた
        - 最後の月(2023年7月)にチームCのEFSの請求が50,000ドルというデータを挿入した（他データは100~2,000ドルです）


### ①生成BI機能（生成AIを活用したダッシュボードの作成）

#### 概要
「Build Visual」をボタンを押下し、Qに自然言語で指示を出すことでグラフを作成させてみます。

#### 実験開始

例えば「Cost by team  by service for 202306-07」とQに指示を出すと、「チーム別＆AWSサービス別の該当期間の費用」の棒グラフを作成してくれました。

![スクリーンショット 2024-12-16 113126.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932360/b45569c7-936f-4389-8f53-40d27f992a24.png)


「ADD TO ANALYSIS」ボタンを押すことで分析シートにグラフを追加できます(保存することでダッシュボードから見れるようになります）。
さらに「Sort it by team name」と追加で指示を出すと、チーム名でソートしてくれました。

![スクリーンショット 2024-12-16 143314.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932360/4fce811f-567f-a7d4-d443-9eaecaed8b8d.png)

※通常のQuickSightのパラメータを自動設定してくれているだけなので、Qで作成したグラフもデータが更新されれば通常通り更新されます。

#### できたこと
- 基本的なグラフ作成
    - 適切なグラフの種類を選択
    - 適切なフィールドを選択
    - 適切なフィルターを設定
- 作成したグラフに対する修正
    - 作成したグラフのソート

#### できなかったこと
- グラフの配色の変更
    - 「change color of "EC2" to red」：エラーになりました。
- 気の利いたグラフ名の自動設定
    - 今回は202306-07でフィルタリングしているが、グラフ名からはそれがわかりません。 手動で変える必要ありました。
- 比較系
    - 「Compare  December 2023 and December 2022 costs by team and AWS service.」は「Total Cost USD by Team Tag and AWS Service Name in December 2023 and in December 2022.」と解釈された
    - 他もいろいろ試したが、比較のためのグラフ作成 or 2つのグラフを並べる、などは難しそう
- 東京リージョンでは使えない（2024年12月20日現在）
    - サポートされているリージョン：https://docs.aws.amazon.com/ja_jp/quicksight/latest/user/regions-aqs.html

公式が[機能一覧](https://docs.aws.amazon.com/quicksight/latest/user/generative-bi-author-experience.html)を出しているので、詳細はそちらをご確認ください。
計算フィールドの式を生成してくれるのは便利ですね。

### ②Qへの質問機能（作成したダッシュボードに関してQに深掘り質問）

#### 概要
作成したダッシュボードを眺め、浮かんだ疑問をQに問い合わせ解決してみます。
例えば、

- 自分：「今月はコストが増えているけど、何が原因？」
- Q：「チームAのEC2が原因です。先月と比べて9,999ドル増えています。」
- 自分：「なるほど...。idわかる？」
- Q：「idはxxxです。」

というような流れで最終的にはリソースのidまで特定できれば嬉しいです。やってみます。

#### 実験開始

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932360/7f16228a-02f7-d2e8-d686-2a25d5640332.png)

x軸は月を示す。一番最後(2023年7月)の利用料が高騰していることが読み取れます。
まず、このグラフを見ながらQに質問します。
- 自分：「what caused the high usage fees in jul 2023?（2023年7月のコスト高騰の理由は？）」
    - リージョンとアカウントを特定して教えてくれました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932360/8004fe8c-c9aa-e3f0-2039-17703b8ac7b2.png)
- 自分「which team and service caused the high usage fees in jul 2023?（どのチームのどのAWSサービスのコストが高いの？）」
    - チーム別、AWSリソース別のグラフを描画し、チームCのコストが最も高いことを文章で教えてくれました。グラフから、チームCのEFSコストがスパイクしていることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932360/549a965d-f0a5-ebac-25b4-bdbf292f5914.png)
- 自分「which efs resource caused the high usage fees in jul 2023?（どのEFSリソースが原因なの？）」
    - EFSリソース別の料金を描画し、もっとも費用が掛かったリソースのidと金額も文章で教えてくれました。さらに、問題となっているリソースのidも表示されました。問題となっているリソースが特定できたため、人間がアクションを起こせます。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932360/51f38e87-5b1a-0b61-d51a-ea4e93118bb1.png)
　
#### できたこと
- グラフからは読み取れない情報についてQに質問
    - データセットにデータさえあれば、それに関する質問は答えられそう。
    - 回答形式は以下
        - 文章
        - 数値
        - グラフ
        - 表
    - 得られた回答から質問を具体化していくことで、費用増大の原因となっているリソースのidまで特定することもできた。

#### できなかったこと
- 日本語での質問
- コンテキスト保持
    - 回答に対し、「why?」「show the detail」などの追加質問を投げても返ってこなかった。
    - データ探索の期間についても毎回指定する必要がある。
- 東京リージョンでは使えない（2024年12月20日現在）
    - サポートされているリージョン：https://docs.aws.amazon.com/ja_jp/quicksight/latest/user/regions-aqs.html



# 【実験2】 Q Developerを用いたコスト分析

## Q Developerとは

https://aws.amazon.com/jp/q/developer/

開発者向けのAmazon Qという位置づけです。
できることやQ Businessとの違いは[こちらの記事](https://blog.serverworks.co.jp/difference-between-amazon-q-developer-and-amazon-q-business)がわかりやすかったです。
今回検証するのはQ Developerのコスト分析機能で、2024年の11月末にGAになったばかりのようです。


### コスト分析機能について
https://aws.amazon.com/jp/blogs/news/analyzing-your-aws-cost-explorer-data-with-amazon-q-developer-now-generally-available/

## やってみた
- 実験内容＆結果

上記記事でも紹介されている例をなぞって実行してみます。
まず、Qを開き「Show me the breakdown of EC2 costs by instance type for the last 30 days（直近30日のEC2コストをインスタンスタイプ別に見せて）」と言ってみます。
すると以下の回答が返ってきました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932360/3bdf3971-d0de-65e4-11d3-4446772457a1.png)
インスタンス別の費用が、費用の高い順にリストされました。
データは箇条書きで書かれているパラメータをCost Explorerにセットすることで取得しているようです。
赤枠で囲んだ「Visualize this data in AWS Cost Explorer」を押下すると、上記パラメータをセットした状態でCost Explorerの画面に飛ばされ、グラフが表示されます。パラメータを自動でセットしてくれるのは便利ですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932360/740ba2ee-5e4c-054a-f6ed-5f9f065ca8ca.png)

一方で、Cost Explorerの機能で対応できない質問「例："Can you find anomaly high cost?"」などについては、代替機能（この場合Cost Anomaly Detection）をレコメンドしてくれました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932360/58d7ee2e-6ece-79b4-0cc1-632b6fdb5425.png)



- できたこと
    - 自然言語を解釈し以下を行う
        - Cost Explorer APIを叩いて情報取得。それを根拠に回答
        - Cost Explorer コンソールのレポートパラメータを自動設定し、そこへのリンクを貼ってくれる
            - 上記仕様のため、Qが回答してくれる範囲とグラフで可視化できる範囲が若干異なる
                - 例えば「Cost **by** tag "projectName" **by** service last month?」という2つの条件によるグループ化は、Cost Explorer APIではできるがコンソールではできないため、Qはそれっぽい回答をしてくれるがコンソール上でエビデンス or グラフの確認はできなかった
    - 東京リージョンで使える
        - サポートされているリージョン：https://docs.aws.amazon.com/ja_jp/amazonq/latest/qdeveloper-ug/regions.html
- できなかったこと
    - Cost Explorer APIの範囲外の分析
    - Cost Explorer コンソール範囲外の可視化（上で述べました）
    - Custom instructions のような機能はない

# まとめ＆所感
- Q in QuickSight
    - 生成BI機能
        - 自然言語でグラフ作成可能
        - ポチポチが面倒な人にとっては便利＆時短になる可能性あり
    - Qへの質問機能
        - 適切なデータが連携され、適切な質問をすればマトモな回答を返してくれる
        - グラフからは読み取れない数字・原因を自然言語で取得できるのは便利
- Q Developer コスト分析機能
    - Cost Explorerレポートパラメータの設定を自然言語で行うという使い方がメインか
    - 新しくレポートを作成するほどではないが、スポットで手軽に分析したいというケースには向いていそう

個人的な所感としては、「Q in QuickSight」においてコストを可視化＆定常的に監視した上で、違和感を持った項目に対してQに深掘り質問するという使い方は割と実用的なのではないかと思いました。
日本語での質問やコンテキスト保持ができるようになればかなり便利になると思います。今後のアップデートに期待したいです。

<!--
# その他参考文献

- https://dev.classmethod.jp/articles/introduction-2024-cost-optimization-hub/
- https://qiita.com/hayao_k/items/c116acf403eb29b53bcd
- 
- -->