AI使ってAWSインフラコスト改善案をレコメンドしてみた!

に公開

AI使ってAWSインフラコスト改善案をレコメンドしてみた!

はじめに

AWSの請求書を見て「なんでこんなに高いの...?」と思ったことはありませんか?
そんな悩みを解決するために、AI(Amazon Bedrock)を活用してインフラコストの改善案を自動生成するシステムを作ってみました!

システム概要

  • BigQueryからAWSコストデータを取得
  • Amazon BedrockでAI分析を実行
  • Slackに改善案を自動通知

請求代行を使用してるアカウントが対象なので、明細はBigQueryに入れてそこから取ってくる前提になります。
こんな感じで動きます。

実際の出力例

AIが生成する改善案はこんな感じ:

{
  "recommendations": [
    {
      "category": "compute",
      "description": "EC2インスタンスt3.largeをt3.mediumにリサイズすることで月額コストを40%削減できます",
      "estimatedSavings": 150.50,
      "priority": "high",
      "actionItems": [
        "リサイズ前にアプリケーションの負荷テストを実施",
        "メンテナンス時間を設定してインスタンスタイプを変更"
      ],
      "affectedResources": [
        "i-1234567890abcdef0"
      ]
    }
  ]
}

実装のポイント

1. 高コストサービスの特定と優先分析

各サービス(EC2、CloudWatch、RDS、VPC)のコストを個別に算出し、具体的な数値で優先順位を決める:

private analyzeTargetServices(costData: CostData[]): string {
  // サービスごとにデータをフィルタリング
  const ec2Data = costData.filter(item => 
    item.product_ProductName?.includes('Elastic Compute Cloud')
  );
  const cloudwatchData = costData.filter(item => 
    item.product_ProductName?.includes('CloudWatch')
  );
  const rdsData = costData.filter(item => 
    item.product_ProductName?.includes('Relational Database')
  );
  const vpcData = costData.filter(item => 
    item.product_ProductName?.includes('Virtual Private Cloud')
  );

  // 各サービスの総コストを算出
  const ec2Cost = ec2Data.reduce((sum, item) => sum + item.lineItem_UnblendedCost, 0);
  const cloudwatchCost = cloudwatchData.reduce((sum, item) => sum + item.lineItem_UnblendedCost, 0);
  const rdsCost = rdsData.reduce((sum, item) => sum + item.lineItem_UnblendedCost, 0);
  const vpcCost = vpcData.reduce((sum, item) => sum + item.lineItem_UnblendedCost, 0);

  // AIに送信する詳細分析レポートを生成
  let analysis = '';
  
  if (ec2Cost > 0) {
    const ec2Instances = ec2Data.filter(item => item.product_InstanceType);
    const topInstances = ec2Instances
      .sort((a, b) => b.lineItem_UnblendedCost - a.lineItem_UnblendedCost)
      .slice(0, 20);
    
    analysis += `EC2 Analysis ($${ec2Cost.toFixed(2)}):\n`;
    analysis += `- Total EC2 cost represents ${((ec2Cost / totalCost) * 100).toFixed(1)}% of total costs\n`;
    analysis += `- Top costly instances: ${topInstances.map(item => 
      `${item.product_InstanceType} ($${item.lineItem_UnblendedCost.toFixed(2)})`
    ).join(', ')}\n`;
  }

  if (cloudwatchCost > 0) {
    analysis += `\nCloudWatch Analysis ($${cloudwatchCost.toFixed(2)}):\n`;
    analysis += `- CloudWatch costs: ${((cloudwatchCost / totalCost) * 100).toFixed(1)}% of total\n`;
    const logData = cloudwatchData.filter(item => item.lineItem_UsageType?.includes('Log'));
    if (logData.length > 0) {
      const logCost = logData.reduce((sum, item) => sum + item.lineItem_UnblendedCost, 0);
      analysis += `- Log storage/ingestion costs: $${logCost.toFixed(2)}\n`;
    }
  }

  return analysis;
}

AIに送信される実際の分析結果例

EC2 Analysis ($1,250.50):
- Total EC2 cost represents 45.3% of total costs
- Top costly instances: m5.large ($890.20), t3.xlarge ($360.30), t3.large ($180.15)

CloudWatch Analysis ($340.20):
- CloudWatch costs: 12.3% of total
- Log storage/ingestion costs: $280.15

RDS Analysis ($680.75):
- RDS costs: 24.6% of total
- Top RDS instances: db.r5.large ($420.30), db.t3.medium ($260.45)

VPC/Network Analysis ($195.40):
- Network costs: 7.1% of total
- NAT Gateway costs: $120.50
- Data Transfer costs: $74.90

ポイント: 金額とパーセンテージを見て、どのサービスを最優先で改善すべきか判断させています

2. プロンプト

具体的な削減効果と実行可能な改善策を提示:

private generateAnalysisPrompt(costData: CostData[], accountId: string): string {
  return `
## COST OPTIMIZATION STRATEGY (Based on your actual cost data):

Primary Focus (Generate 3-4 recommendations):
1. EC2 (examples, not limited to: Right-sizing, Reserved Instances, Spot Instances, Instance scheduling)

2. RDS (examples, not limited to: Right-sizing, Storage optimization such as gp2→gp3 migration, Backup retention policy, Multi-AZ necessity review)

3. CloudWatch (examples, not limited to: Log retention period, Custom metrics reduction, Unused log groups/alarms cleanup, Log aggregation & filtering)

4. VPC/Network (examples, not limited to: NAT Gateway optimization, Data transfer reduction with CloudFront/VPC Endpoints, Unused EIPs/load balancers cleanup, Cross-AZ data transfer minimization)

Secondary Focus (1-2 recommendations if relevant):
- S3 (lifecycle, storage class, unused buckets)  
- Lambda (memory, timeout, cold start)  
- ELB/ALB (consolidation, unused cleanup)  
- ElastiCache (instance sizing, cluster configuration)  

Recommendation Strategy:
- Prioritize highest cost services
- Include both quick wins and long-term opportunities
- Provide resource IDs where possible
- Maximum 5 recommendations

Output Format (all descriptions and action items must be in Japanese):

{
  "recommendations": [
    {
      "category": "compute|storage|network|database|monitoring|loadbalancer|cache|other",
      "description": "Optimization description in Japanese",
      "estimatedSavings": number,
      "priority": "high|medium|low",
      "actionItems": [
        "Step 1 in Japanese",
        "Step 2 in Japanese"
      ],
      "affectedResources": [
        "resource-id-1",
        "resource-id-2"
      ]
    }
  ]
}
  `;
}

コスト試算

データ圧縮によるトークン数最適化

分析結果

  • レコード数(1万〜20万件)に関わらず、AI処理に必要なトークン数は一定
  • 入力トークン: 約7,000 tokens
  • 出力トークン: 約2,500 tokens

月次運用コスト(概算)

月額総コスト: 約$0.30

  • 月5回実行する前提
  • Amazon Bedrock: 約$0.25/月
  • AWS Lambda: 約$0.03/月(実行時間90秒、メモリ1GB)
  • BigQuery: 約$0.02/月

投資対効果: 月額$0.30の投資によりコスト削減案を自動生成することができた

データ圧縮戦略

20万件のレコードを約7000トークンに収めた

// 1. 生データから必要な情報のみを抽出
const topCostItems = costData
  .sort((a, b) => b.lineItem_UnblendedCost - a.lineItem_UnblendedCost)
  .slice(0, 100);

// 2. サービス別にコストを集約
const costByService = costData.reduce((acc, item) => {
  const service = item.product_ProductName || 'Unknown';
  acc[service] = (acc[service] || 0) + item.lineItem_UnblendedCost;
  return acc;
}, {});

// 3. インスタンスタイプ別にコストを集約
const costByInstanceType = costData.reduce((acc, item) => {
  if (item.product_InstanceType) {
    acc[item.product_InstanceType] = (acc[item.product_InstanceType] || 0) + item.lineItem_UnblendedCost;
  }
  return acc;
}, {});

// 4. 特化サービスの詳細分析(EC2, CloudWatch, RDS, VPC)
const targetServiceAnalysis = this.analyzeTargetServices(costData);

圧縮の具体例

生データ(200,000レコード):

lineItem_UsageAccountId: 123456789012
product_ProductName: Amazon Elastic Compute Cloud - Compute  
lineItem_UsageType: m5.large-Instance:0002
lineItem_UnblendedCost: 45.67
product_InstanceType: m5.large
lineItem_ResourceId: i-1234567890abcdef0
... (40以上のフィールド)

AIに送信する圧縮データ:

## Top Cost Items (by cost)
1. Amazon Elastic Compute Cloud - Compute - m5.large-Instance:0002 - $45.67 (i-1234567890abcdef0)
2. Amazon RDS Service - db.t3.large-InstanceUsage - $32.15 (mydb-prod-01)
...(上位100件のみ)

## Cost by Service  
- Amazon Elastic Compute Cloud - Compute: $1,250.50
- Amazon Relational Database Service: $890.30
...

## EC2 Analysis ($1,250.50):
- Total EC2 cost represents 45.3% of total costs
- Top costly instances: m5.large ($890.20), t3.xlarge ($360.30)

効果

これにより20万レコード分のtokenを7000tokenに圧縮できました

システム導入による効果

現在得られている効果

  • 稼働中の過剰スペックリソースの可視化: サイズ調整を検討していないインスタンスを正確に特定
  • 定期的なコスト見直し習慣の確立: 自動実行により継続的なモニタリング体制を構築

今後の期待効果

  • 段階的なコスト最適化の実施: 特定された改善案に基づく計画的な削減施策の実行。提案されたSP,RIの導入
  • チーム全体のコスト意識向上: 定期的なレポート配信による意識改革
  • リソース作成時の事前検討習慣: 新規リソース作成時のコスト最適化検討の定着

まとめ

本システムにより、従来手動で実施していたAWSコスト分析を自動化することができました。特にEC2・CloudWatch・RDS・VPCに特化した分析により、以下の機能を実現しています:

主要機能

  • 高コストサービスの特定: 全体コストにおける各サービスの割合を自動算出
  • 具体的なリソース特定: 高額になってるインスタンスタイプおよびリソースの特定
  • 優先度付きの改善案: コスト影響度に基づく優先順位付け分析
  • 実行可能なアクション: 具体的なリソース変更による削減効果の提示

月額$0.30の費用で、定期的な見直し体制の構築を実現しています。今後は特定された改善案をもとにコスト削減に取り組んでいきたいと思います。

株式会社ソニックムーブ

Discussion