SJ blog
devops
A

信頼度ランク

S 公式ソース確認済み
A 成功実績多数・失敗例少数
B 賛否両論
C 動作未確認・セキュリティリスク高
Z 個人所感

クラウドコスト最適化:AWS/GCPを無駄なく使う

クラウドコストが膨らむ原因と削減策を解説。EC2・RDS・S3の無駄遣いパターン、Reserved Instances・Spot Instance・Auto Scalingの活用、コスト監視の設定方法を紹介します。

一言結論

クラウドコスト削減の最大の一手は「使われていないリソースの削除」と「On-DemandからReserved/Spot Instanceへの移行」であり、この2つだけで多くの場合30〜60%の削減が実現できる。

コストが膨らむよくあるパターン

1. 使われていないリソースの放置(EC2・RDS・EBS ボリューム)
2. 常時 On-Demand で動かす(予約すれば30〜70%安い)
3. データ転送料金の見落とし(リージョン間・インターネット転送)
4. ストレージの無制限成長(S3・EBS のライフサイクル未設定)
5. 過剰スペックのインスタンス

即効性のある削減策

1. 使われていないリソースを削除

# 未アタッチの EBS ボリュームを一覧
aws ec2 describe-volumes \
  --filters Name=status,Values=available \
  --query "Volumes[*].[VolumeId,Size,CreateTime]" \
  --output table

# 1ヶ月以上古いスナップショットを一覧
aws ec2 describe-snapshots --owner-ids self \
  --query "Snapshots[?StartTime<='$(date -d '30 days ago' +%Y-%m-%d)'].[SnapshotId,StartTime,VolumeSize]" \
  --output table

# 停止中のEC2インスタンス
aws ec2 describe-instances \
  --filters Name=instance-state-name,Values=stopped \
  --query "Reservations[*].Instances[*].[InstanceId,InstanceType,LaunchTime]" \
  --output table

2. インスタンスのサイズダウン

# CloudWatch で過去2週間の CPU 使用率が低いインスタンスを調査
aws cloudwatch get-metric-statistics \
  --metric-name CPUUtilization \
  --start-time $(date -d '14 days ago' -u +%Y-%m-%dT%H:%M:%SZ) \
  --end-time $(date -u +%Y-%m-%dT%H:%M:%SZ) \
  --period 3600 \
  --statistics Average \
  --namespace AWS/EC2 \
  --dimensions Name=InstanceId,Value=i-xxxxx

CPU 使用率が常に 10% 以下なら、1〜2ランク下げを検討します。

Reserved Instances / Savings Plans

定期的に使うリソースは事前予約で大幅に安くなります。

プラン割引率条件
On-Demand0%なし
1年 RI(全前払い)〜40%1年コミット
3年 RI(全前払い)〜60%3年コミット
Compute Savings Plans〜66%柔軟(インスタンスタイプ変更可)
Spot Instance〜90%中断される可能性あり
Savings Plans → 本番の安定したワークロード
Spot Instance → バッチ処理・CI/CD・開発環境

Auto Scaling で過剰スペックをやめる

# AWS CDK の例
const scaling = new ApplicationAutoScaling.ScalableTarget(this, "Scaling", {
  serviceNamespace: ApplicationAutoScaling.ServiceNamespace.ECS,
  minCapacity: 1,
  maxCapacity: 10,
  resourceId: `service/${cluster.clusterName}/${service.serviceName}`,
  scalableDimension: "ecs:service:DesiredCount",
});

// CPU 使用率 60% を超えたらスケールアウト
scaling.scaleToTrackMetric("CpuScaling", {
  predefinedMetric: PredefinedMetric.ECS_SERVICE_AVERAGE_CPU_UTILIZATION,
  targetValue: 60,
  scaleInCooldown: Duration.minutes(5),
  scaleOutCooldown: Duration.minutes(2),
});

S3 ライフサイクルポリシー

古いデータを安いストレージクラスに自動移行します。

{
  "Rules": [{
    "Status": "Enabled",
    "Transitions": [
      { "Days": 30, "StorageClass": "STANDARD_IA" },
      { "Days": 90, "StorageClass": "GLACIER_IR" },
      { "Days": 365, "StorageClass": "DEEP_ARCHIVE" }
    ],
    "Expiration": { "Days": 2555 }
  }]
}

ストレージコスト比較(1GB あたり/月):

Standard:     $0.023
Standard-IA:  $0.0125(アクセス頻度が低い場合)
Glacier IR:   $0.004
Deep Archive: $0.00099

コスト監視

AWS Cost Anomaly Detection

# 異常なコスト増加をアラート
aws ce create-anomaly-monitor --anomaly-monitor '{
  "MonitorName": "MyMonitor",
  "MonitorType": "DIMENSIONAL",
  "MonitorDimension": "SERVICE"
}'

aws ce create-anomaly-subscription --anomaly-subscription '{
  "SubscriptionName": "AlertMe",
  "MonitorArnList": ["arn:aws:ce::123456789:anomalymonitor/xxx"],
  "Subscribers": [{"Address": "alert@example.com", "Type": "EMAIL"}],
  "Threshold": 100,
  "Frequency": "DAILY"
}'

タグ戦略でコストを可視化

# Terraform でリソースに必ずタグを付ける
locals {
  common_tags = {
    Environment = var.environment
    Team        = var.team
    Project     = var.project
    CostCenter  = var.cost_center
  }
}

AWS Cost Explorer でタグごとのコストを確認できます。

まとめ

優先度施策効果
即効未使用リソース削除-10〜30%
短期Savings Plans / RI 購入-30〜60%
中期Auto Scaling の最適化-20〜40%
長期S3 ライフサイクル + アーカイブ-20〜80%

月に一度、AWS Cost Explorer を確認する習慣をつけることが最大のコスト削減につながります。


参考: AWS コスト最適化 / Google Cloud コスト最適化