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-Demand | 0% | なし |
| 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 を確認する習慣をつけることが最大のコスト削減につながります。