AWS Savings Plans検討をGemini Gemsで自動化する~~プロンプト作成のコツと組織管理の課題~~

こんにちは、インフラエンジニアの森田です。

この記事はEnigmo Advent Calendar 2025の 14日目の記事です。
今回は、業務効率化のためにGoogle Geminiのカスタム指示(Gems)を作成し、
実際の業務で使ってみた使用感や気づきについて紹介します。

どのような業務に活用したか

私は直近でAWSのコスト削減に取り組んでいます。
特にSavings Plansなどを購入する際、複数アカウントのオンデマンドコストと推奨コミット額を見比べ、
その購入計画が適切かを整理する必要がありました。
これを人力で行うのは工数もかかり、ミスのリスクもあるため「辛い」作業でした。

そこで、Savings Plans推奨事項のCSVファイルと、
Cost ExplorerからCLIで取得したJSONファイルを読み込ませることで、
コミット額の適切性検証とコストメリットの整理を行ってくれるGemsを作成しました。

結果として、非常に良好な感触を得られました。
やはり、複雑な数値の突き合わせや計算は計算機(AI)に任せるのが一番です。
本記事では、実際にツールを作ってみて「気をつけると良い点」と、
組織で運用する上で「課題だと感じた点」を共有します。

カスタム指示(Gems)作成のポイント

コスト削減アシスタントGemsを作成する過程で、特に重要だと感じたポイントは以下の3点です。

1. 具体的な使い方の説明(ガイド)を含める

スクリプトと異なり、対話形式で進むため、
初見のユーザーでも迷わないよう「利用手順」を指示に含めておくと親切です。
今回はデータを読み込ませて分析するツールなので、
以下のようにデータの取得手順を案内させるようにしました。

## 0. ユーザーサポート / 使い方ガイド

ユーザーから「使い方を教えて」「何が必要?」と問われた場合、または挨拶のみでデータが未提供の場合は、以下の3ステップのデータ取得手順を案内してください。

### 手順1: 推奨事項CSVのダウンロード (AWS Console)
<取得手順を記載>

### 手順2: 直近のオンデマンド料金取得 (AWS CLI)
<取得手順を記載>

### 手順3: データの取得
<取得手順を記載>

2. 入出力のイメージを厳密に定義する

曖昧な指示だと、実行のたびにAIの解釈が変わり、
出力フォーマットがブレて使いづらくなります。
AIに勝手な解釈をさせないよう、入力データの処理ルールと出力形式を
以下のように固定することをお勧めします。

入力ルールの例:

## 2. 入力データの処理ルール

以下のデータがテキストまたはファイルとして与えられます。

1. **推奨事項 (CSV):** `savings-plans-recommendations.csv`
    * ここから「アカウントID」「推奨コミットメント額($/h)」「推定削減率」を抽出します。

2. **実績コスト (JSON):** `ec2_ondemand_daily_filtered.json` (Cost Explorer出力)
    * **安全性判定:** `推奨コミットメント額($/h) × 24h``日次実績コスト(過去30日間の最小値)` を下回っているか確認してください。実績を下回っていれば「安全(使い切れる)」、上回っていれば「注意(使い切れないリスクあり)」と判定します。
(略)

出力ルールの例:

必ず以下の **【出力1】** 〜 **【出力3】** の形式で出力してください。

-----

### 【出力1】
<出力1の構造を指示する>
(略)

3. 複雑なファイルは「キャプチャ画像」で読ませる

複雑なレイアウトのExcelやPDFファイルは、
テキスト抽出時に構造が崩れ、正しく解析できない場合があります。
そのような場合、対象箇所のキャプチャ画像を撮って画像を読ませる方が、
精度が高くなるケースがありました。
テキストでの読み込みで精度が出ない場合は、「画像を読ませる」という選択肢を
頭の片隅に置いておくと良いでしょう。

管理・運用上の懸念点

個人のツールとしては優秀なGemsですが、これを「会社の資産」として管理しようとした際、
いくつか課題も見えてきました。

変更履歴が見えない

作り込んだカスタム指示は長文になりがちですが、現状のGemsには変更履歴(Diff)を見る機能がありません。
「誰が・いつ・なぜ変更したか」が追えないため、チーム開発には不向きです。
GCPのVertex AI AgentsであればTerraform等で管理可能ですが、
Gemini(Gems)単体では難しいため、現状は「プロンプトの内容をテキストファイルとしてGitで管理し、変更時はGitを通してから手動でGemsを更新する」という運用が現実解になりそうです。
スマートではありませんが、資産管理としては必要です。

作成者のアカウント削除でGemsも消える

Gemsの実体は、作成者の「マイドライブ/Gemini Gems/」配下に保存されるファイルとして扱われるようです。
そのため、作成者が退職等でアカウント削除されると、
マイドライブ内のデータと共にGemsも消失してしまいます。
これを回避するために共有ドライブへの集約を試みましたが、
共有ドライブ上のGemsファイルを開こうとするとエラーが発生しました(下図参照)。
現状では、誰か個人のマイドライブに配置されている必要がありそうです。

共有ドライブ上のGemsを開いた際のエラー

モデル更新による挙動の変化(AIドリフト)

これはLLMを利用する全般的なリスクですが、バックエンドのモデルが更新された際、
以前と同じプロンプトでも挙動が変わる可能性があります。
ChatGPTのCustom GPTsのようにモデルバージョンを固定する機能は、現状のGemsには見当たりません。
影響を最小限にするためには、前述の通り「入出力を厳密に定義」してAIの解釈の幅を狭めておくことが重要です。
また、モデル更新のアナウンスがあった際は、簡単な動作確認フローを設けるのが良いでしょう。

まとめ

スプレッドシートでオンデマンドコストとコミットコストを整理して購入計画を立てていたときは2,3日かかっていたところ、
業務特化型のGemsを作成することで、正味1時間あれば整理が完了するようになり大幅に効率化することができました。

一方で、チームや組織で永続的に管理・運用していくには、
バージョン管理やオーナー権限の面でまだ工夫が必要だと感じています。

今後、Google Workspaceの機能アップデートにより、
これらの管理機能が強化されることを期待しつつ、
まずはGit管理などの運用ルールでカバーしながら活用していきたいと思います。