
AWS MCPサーバーでTerraformコードを分析しコスト見積もりと構成図を自動生成してみた
お疲れさまです。とーちです。
こちらの記事で、AWS Diagram MCP Serverが新たに追加されたことを知り、Terraformコードの分析をしたらどうなるんだろうと思いやってみました。ついでに従来からあった、Cost Analysis MCP ServerでTerraformコードを元にしたコスト分析もやってみようと思います。
今回はMCPクライアントとしてClineを使用します。また、Clineで使用するモデルはVS Code LM APIのcopilot - claude-3.5-sonnet
を使用しました。
前提条件
今回の検証には以下の環境が必要です
- Clineがインストール済み
- AWS CLIの認証プロファイル(
~/.aws/config
など)が設定済み - uvコマンド(
brew install uv
でインストール可能) - GraphVizパッケージ(
brew install graphviz
でインストール可能。AWS Diagram MCP Serverで必要)
まだ準備ができていない方は、これらを先に用意しておきましょう。
MCPサーバーのセットアップ
今回は以下の2つのMCPサーバーを使用します
- Cost Analysis MCP Server - コスト分析用
- AWS Diagram MCP Server - システム構成図作成用
Cost Analysis MCP ServerはClineのMarketplaceからも導入できるようですが、AWS Diagram MCP Serverはまだ提供されていないようなので、今回は両方とも手動で設定していきます。
まずClineのInstalledタブを開いて、Cline用のMCPサーバー設定ファイルにアクセスします
設定ファイルに以下の内容を追加します
Cost Analysis MCP Server設定
{
"mcpServers": {
"awslabs.cost-analysis-mcp-server": {
"command": "uvx",
"args": ["awslabs.cost-analysis-mcp-server@latest"],
"env": {
"FASTMCP_LOG_LEVEL": "ERROR",
"AWS_PROFILE": "<ここにAWS CLIで設定したプロファイル名を入力>"
},
"disabled": false,
"autoApprove": []
}
}
}
AWS Diagram MCP Server設定
{
"mcpServers": {
"awslabs.aws-diagram-mcp-server": {
"command": "uvx",
"args": ["awslabs.aws-diagram-mcp-server"],
"env": {
"FASTMCP_LOG_LEVEL": "ERROR"
},
"autoApprove": [],
"disabled": false
}
}
}
設定が完了すると、以下のようにMCPサーバーへの接続が確立された状態になります
分析対象のTerraformコード
今回は以下のリポジトリのコードを分析対象として使用します
このコードはシンプルな構成で、既存のサブネット上にEC2インスタンスを作成し、既存のEBSをアタッチするというものです。実際に作成されるリソースはEC2インスタンスとそのRoot用のEBSボリュームのみとなります。
システム構成図で表すと、こんな感じのシンプルな構成です
コスト分析を実行してみる
では早速、このTerraformコードのコスト分析をしてみましょう。以下の指示を出してみました。
このプロジェクトディレクトリ配下のterraformコードで作成されるAWSリソースの料金を見積もってください
Clineの良いところは、プロジェクトディレクトリを自律的にコンテキストとして読み取ってくれる点です。Claude Desktopなどの他のAIアシスタントでは、コード自体を貼り付けてLLMへのコンテキストに含める必要があります。
プロンプトを入力すると、MCPサーバーを使った処理が始まりました
最初、get_pricing_from_apiで価格情報を取得しようとしたようですが、エラーになっています。エラーメッセージを見るとaws-vaultでエラーが出ているので、これは私の環境固有のエラーだと思います(私はaws-vaultを組み合わせてAWS認証情報を管理しているため)。
API経由での取得に失敗したので、LLMが自動で判断しWeb経由での価格情報取得(get_pricing_from_web)に切り替えて処理をしましたが、結局具体的な料金情報は得られなかったようです。
EBSの料金についても同様にWeb経由での価格情報取得を行っていました。どうやら、AWSのEBS料金ページを参照しているようです。get_pricing_from_web
のレスポンスには以下のような計算例が含まれていました
Example 1 – General Purpose SSD (gp3) Volumes
Volume storage for General Purpose SSD (gp3) volumes is charged by the amount you provision in GB per month until you release the storage. All gp3 volumes include a free baseline performance of 3,000 provisioned IOPS (input/output operations per second) and 125 provisioned MB/s throughput. Additional IOPS and throughput can be provisioned independently and are charged by the amount you provision in IOPS per month and MB/s per month until you release the IOPS or throughput. Provisioned storage, provisioned IOPS, and provisioned throughput for gp3 volumes will be billed in per-second increments, with a 60-second minimum.
For example, let's say that you provision a 2,000 GB volume for 12 hours (43,200 seconds) in a 30-day month. Additionally, you provision 10,000 IOPS and 500 MB/s for your volume.
Gp3 volume charge: In a region that charges $0.08 per GB-month, you would be charged: ($0.08 per GB-month * 2,000 GB * 43,200 seconds / (86,400 seconds/day * 30-day month)) = $2.667
Gp3 IOPS charge: In a region that charges $0.005 per provisioned IOPS-month, you would be charged: ($0.005 per provisioned IOPS-month * (10,000 IOPS provisioned – 3,000 IOPS in the free baseline performance) * 43,200 seconds /(86,400 seconds /day * 30-day month))= $0.583
Gp3 baseline performance charge: In a region that charges $0.06 per provisioned MB/s-month, you would be charged: ($0.06 per provisioned MB/s-month * (500 MB/s provisioned – 125 MB/s in the free baseline performance) * 43,200 seconds /(86,400 seconds /day * 30 day-month))= $0.375
Total charges for example 1: Gp3 volume charge = $2.667 Gp3 IOPS charge = $0.583 Gp3 baseline performance charge = $0.375
Total: $3.625 per 30-day month
最終的に generate_cost_report
というツールでコストレポートをMCPサーバーに出力させています。この際、少なくともEC2の料金はMCPサーバーのツールからは得られなかったはずですが、以下のようにEC2料金も含めてツールを呼び出しています。おそらくLLM自体が持つ知識から算出した情報を使用しているのでしょう。t3.smallの東京リージョンでの料金は実際にはUSD 0.0272/hour
ですが、以下では$0.023
となっています。また、EBSボリュームの料金も少し間違っていますね。実際には USD 0.096/GB 月
です。
{
"pricing_data": {
"status": "success",
"service_name": "Amazon EC2 and EBS",
"data": "Collected from pricing pages"
},
"service_name": "EC2 Rescue Instance",
"assumptions": [
"東京リージョン(ap-northeast-1)での利用を想定",
"EC2インスタンスは24時間/日で30日間稼働すると想定",
"オンデマンド料金での試算"
],
"exclusions": [
"データ転送コスト",
"EBSスナップショットのコスト",
"追加のEBSボリューム(問題のボリューム)のコスト"
],
"detailed_cost_data": {
"services": {
"EC2 Instance (t3.small)": {
"usage": "24時間/日 × 30日間の連続稼働",
"estimated_cost": "約$16.80",
"unit_pricing": {
"hourly_rate": "$0.023"
},
"calculation_details": "$0.023/時間 × 24時間 × 30日 = $16.80"
},
"EBS gp3 Volume (20GB)": {
"usage": "20GB × 24時間/日 × 30日間",
"estimated_cost": "約$1.60",
"unit_pricing": {
"storage": "$0.08/GB-月"
},
"calculation_details": "$0.08/GB-月 × 20GB = $1.60"
}
}
},
"recommendations": {
"cost_optimization": [
"必要な作業が完了次第、インスタンスを停止することで EC2 コストを削減可能",
"作業完了後は不要なEBSボリュームを削除してストレージコストを削減"
]
}
}
なにはともあれ最終的には以下のような形でコスト概算を算出してくれました。一見、正しいように見えますが、上記の通り誤っている部分があります。鵜呑みにするのは注意ですね。しかし、Terraformのコードという情報からここまでの概算を出せるというのは凄いですね。
Task Completed
このTerraformプロジェクトの月間コスト見積もりは約$18.40です。内訳は以下の通りです:
1. EC2インスタンス (t3.small)
- 約$16.80/月
- 計算: $0.023/時間 × 24時間 × 30日
2. EBSボリューム (gp3, 20GB)
- 約$1.60/月
- 計算: $0.08/GB-月 × 20GB
注意事項:
- この見積もりにはデータ転送コストは含まれていません
- アタッチする問題のEBSボリュームのコストも含まれていません
- スナップショットなどの追加コストは含まれていません
コスト最適化のためのアドバイス:
1. レスキュー作業が完了次第、インスタンスを停止することでEC2コストを削減できます
2. 作業完了後は不要なEBSボリュームを削除してストレージコストを削減できます
システム構成図の自動生成
続いて、同じコードでシステム構成図を自動生成してみましょう。プロンプトは以下の通りです:
このプロジェクトディレクトリ配下のterraformコードで作成されるAWSリソースのアーキテクチャ図を作成してください
この指示に対して、以下のように処理を開始してくれました
処理中に何度かツール(generate_diagram
)のエラーが発生しましたが、AIがエラー内容から正しいインプット内容を推測し、自動的に改善していってくれました
最終的に、プロジェクトディレクトリにPNG形式でアーキテクチャ図を生成してくれました
生成された図がこちらです
冒頭の図に比べると完成度はやや劣りますが、一応必要な要素は捉えた図になっています。ちなみに冒頭の図も実は生成AIにmain.tfのファイルを提示した上で、「draw.ioのxml形式で書いて」と依頼して作成してもらったものです。
まとめ
以上、ごくごく簡単なコードでしたが、MCPサーバーを使ってコスト分析と構成図作成を行ってみました。
上記のように価格表APIを使用する際のAWS認証情報設定やプロンプトなど、まだ改善余地がありそうです。また今回はとてもシンプルなterraformコードで試しましたが、もう少し複雑なものだとどうなるかも見てみたいので、この後も色々試してみようと思います。
以上、とーちでした。