关于 aws-cost-optimization
aws-cost-optimization 是面向 AWS 成本管理和 FinOps 流程的技能,为团队提供基于 AWS CLI 的工作流,用于发现浪费、评估节省方案、实施调整并定期复核成本。
主要功能
- 01查找闲置资源和成本异常
- 02分析规格调整及承诺购买建议
- 03评估 Spot 和实例代际迁移
- 04复核成本并编制月度报告
- 05组织 FinOps 治理和团队评审
适用场景
- 01开展每月 AWS 成本复核
- 02评估预留实例或 Savings Plans
- 03规划迁移到较新实例代际
- 04评估容错工作负载使用 Spot
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ ahmedasmar/ devops-claude-skills --skill aws-cost-optimization安装后在 Claude Code 中输入/aws-cost-optimization确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
assets/templates/monthly_cost_report.mdreferences/best_practices.mdfinops_governance.mdservice_alternatives.md详细介绍
AWS 成本优化与 FinOps
用于 AWS 成本优化和财务运营管理的系统化工作流。
成本优化工作流
- 发现 — 使用
aws ec2和aws ceCLI 命令查找浪费,识别未使用的资源和成本异常 - 分析 — 使用
aws compute-optimizer、aws cloudwatch和aws ce,寻找调整实例规格、升级代际、Spot 和 RI 建议等优化机会 - 确定优先级 — 优先处理速赢事项(风险低、节省高),然后是容易实现的改进,最后是战略性改进
- 实施 — 删除未使用的资源、调整实例规格、购买承诺、迁移到新代际
- 监控 — 每月审查成本、检查标签合规性、跟踪预算偏差
核心工作流
工作流 1:每月成本优化审查
频率:每月运行一次(每月第一周)
步骤 1:查找未使用的资源
# Find unattached EBS volumes
aws ec2 describe-volumes --filters Name=status,Values=available \
--query 'Volumes[].{ID:VolumeId,Size:Size,Created:CreateTime}' --output table
# Find unused Elastic IPs
aws ec2 describe-addresses --filters Name=domain,Values=vpc \
--query 'Addresses[?AssociationId==null].{IP:PublicIp,AllocationId:AllocationId}' --output table
# Find idle EC2 instances (low CPU over 14 days)
aws cloudwatch get-metric-statistics --namespace AWS/EC2 \
--metric-name CPUUtilization --period 86400 --statistics Average \
--start-time $(date -u -v-14d +%Y-%m-%dT%H:%M:%S) --end-time $(date -u +%Y-%m-%dT%H:%M:%S) \
--dimensions Name=InstanceId,Value=INSTANCE_ID
# Find old snapshots (>90 days)
aws ec2 describe-snapshots --owner-ids self \
--query 'Snapshots[?StartTime<=`2025-01-01`].{ID:SnapshotId,Size:VolumeSize,Date:StartTime}' --output table
# Find unused load balancers (no healthy targets)
aws elbv2 describe-target-health --target-group-arn TARGET_GROUP_ARN
步骤 2:分析成本异常
# Get daily costs for the past 30 days
aws ce get-cost-and-usage \
--time-period Start=$(date -u -v-30d +%Y-%m-%d),End=$(date -u +%Y-%m-%d) \
--granularity DAILY --metrics BlendedCost \
--group-by Type=DIMENSION,Key=SERVICE
# Get cost forecast for the next 30 days
aws ce get-cost-forecast \
--time-period Start=$(date -u +%Y-%m-%d),End=$(date -u -v+30d +%Y-%m-%d) \
--granularity MONTHLY --metric BLENDED_COST
# Compare month-over-month costs
aws ce get-cost-and-usage \
--time-period Start=$(date -u -v-60d +%Y-%m-01),End=$(date -u +%Y-%m-%d) \
--granularity MONTHLY --metrics BlendedCost
步骤 3:识别调整实例规格的机会
# Get Compute Optimizer rightsizing recommendations
aws compute-optimizer get-ec2-instance-recommendations \
--query 'instanceRecommendations[].{Instance:instanceArn,Finding:finding,Current:currentInstanceType,Recommended:recommendationOptions[0].instanceType}'
# Check CPU utilization for a specific instance (past 30 days)
aws cloudwatch get-metric-statistics --namespace AWS/EC2 \
--metric-name CPUUtilization --period 3600 --statistics Average Maximum \
--start-time $(date -u -v-30d +%Y-%m-%dT%H:%M:%S) --end-time $(date -u +%Y-%m-%dT%H:%M:%S) \
--dimensions Name=InstanceId,Value=INSTANCE_ID
# Get RDS rightsizing recommendations
aws compute-optimizer get-ecs-service-recommendations 2>/dev/null || \
echo "Check RDS CPU/memory in CloudWatch manually"
步骤 4:生成月度报告
# Use the template to compile findings
cp assets/templates/monthly_cost_report.md reports/$(date +%Y-%m)-cost-report.md
# Fill in:
# - Findings from AWS CLI analysis
# - Action items
# - Team cost breakdowns
# - Optimization wins
步骤 5:团队审查会议
- 向工程团队展示发现
- 分配优化任务
- 跟踪待办事项直至完成
工作流 2:承诺购买分析(RI/Savings Plans)
时间:每季度一次,或在使用模式趋于稳定时
步骤 1:分析当前使用情况
# Get EC2 RI purchase recommendations
aws ce get-reservation-purchase-recommendation --service "Amazon Elastic Compute Cloud - Compute" \
--lookback-period-in-days SIXTY_DAYS --term-in-years ONE_YEAR --payment-option NO_UPFRONT
# Get RDS RI purchase recommendations
aws ce get-reservation-purchase-recommendation --service "Amazon Relational Database Service" \
--lookback-period-in-days SIXTY_DAYS --term-in-years ONE_YEAR --payment-option NO_UPFRONT
# Get Savings Plans recommendations
aws ce get-savings-plans-purchase-recommendation \
--savings-plans-type COMPUTE_SP --lookback-period-in-days SIXTY_DAYS \
--term-in-years ONE_YEAR --payment-option NO_UPFRONT
步骤 2:审查建议
评估每项建议:
✅ Good candidate if:
- Running 24/7 for 60+ days
- Workload is stable and predictable
- No plans to change architecture
- Savings > 30%
❌ Poor candidate if:
- Workload is variable or experimental
- Architecture changes planned
- Instance type may change
- Dev/test environment
步骤 3:选择承诺类型
预留实例:
- 标准 RI:折扣最高(63%),不具备灵活性
- 可转换 RI:折扣适中(54%),可更改实例类型
- 最适用于:特定实例类型、稳定的工作负载
Savings Plans:
- Compute SP:可灵活用于不同实例类型和区域(节省 66%)
- EC2 Instance SP:可灵活用于同一系列中的不同规格(节省 72%)
- 最适用于:在约束条件内变化的工作负载
决策矩阵:
Known instance type, won't change → Standard RI
May need to change types → Convertible RI or Compute SP
Variable workloads → Compute Savings Plan
Maximum flexibility → Compute Savings Plan
步骤 4:购买并跟踪
- 通过 AWS Console 或 CLI 购买
- 使用购买日期和负责人为承诺添加标签
- 每月监控使用率
- 目标使用率 >90%
参考:详细的承诺策略请参见 references/best_practices.md
工作流 3:实例代际迁移
时间:架构审查或优化冲刺期间
步骤 1:检测旧实例
# Find old-generation instances (t2, m4, c4, r4, etc.)
aws ec2 describe-instances --filters Name=instance-state-name,Values=running \
--query 'Reservations[].Instances[?starts_with(InstanceType, `t2.`) || starts_with(InstanceType, `m4.`) || starts_with(InstanceType, `c4.`) || starts_with(InstanceType, `r4.`)].{ID:InstanceId,Type:InstanceType,Name:Tags[?Key==`Name`]|[0].Value}' \
--output table
# Find all running instance types to review generations
aws ec2 describe-instances --filters Name=instance-state-name,Values=running \
--query 'Reservations[].Instances[].{ID:InstanceId,Type:InstanceType,Name:Tags[?Key==`Name`]|[0].Value}' \
--output table
# Look for: t2→t3, m4→m6i, c4→c6i, r4→r6i, Intel→Graviton (20% savings)
步骤 2:确定迁移优先级
速赢事项(风险低):
t2 → t3: Drop-in replacement, 10% savings
m4 → m5: Better performance, 5% savings
gp2 → gp3: No downtime, 20% savings
中等工作量(需要测试):
x86 → Graviton (ARM64): 20% savings
- Requires ARM64 compatibility testing
- Most modern frameworks support ARM64
- Test in staging first
步骤 3:执行迁移
EC2 迁移(x86 到 x86):
- 停止实例
- 更改实例类型
- 启动实例
- 验证应用程序
Graviton 迁移:
- 创建 ARM64 AMI 或 Docker 镜像
- 启动新的 Graviton 实例
- 彻底测试
- 切换流量
- 终止旧实例
步骤 4:验证节省效果
- 在 Cost Explorer 中监控新成本
- 确认性能可接受
- 记录迁移情况,供其他团队参考
参考:请参见 references/best_practices.md → 计算优化
工作流 4:评估 Spot 实例
适用场景:用于容错型工作负载或 Auto Scaling 组
步骤 1:识别候选项
# Check current Spot pricing vs On-Demand for target instance types
aws ec2 describe-spot-price-history --instance-types m5.large m5.xlarge m6i.large \
--product-descriptions "Linux/UNIX" --start-time $(date -u +%Y-%m-%dT%H:%M:%S) \
--query 'SpotPriceHistory[].{Type:InstanceType,AZ:AvailabilityZone,Price:SpotPrice}' --output table
# List Auto Scaling Groups (good Spot candidates)
aws autoscaling describe-auto-scaling-groups \
--query 'AutoScalingGroups[].{Name:AutoScalingGroupName,Min:MinSize,Max:MaxSize,Desired:DesiredCapacity}' --output table
# Check which ASGs already use mixed instances (Spot)
aws autoscaling describe-auto-scaling-groups \
--query 'AutoScalingGroups[?MixedInstancesPolicy!=null].AutoScalingGroupName'
Spot 候选项:Auto Scaling 组中的实例、开发/测试/预发布环境、批处理、CI/CD 服务器。
步骤 2:评估适用性
非常适合 Spot:
- 无状态应用程序
- 批处理作业
- CI/CD 流水线
- 数据处理
- Auto Scaling 组
不适合 Spot:
- 数据库(没有副本时)
- 有状态应用程序
- 实时服务
- 任务关键型工作负载
步骤 3:实施策略
选项 1:Fargate Spot -- 设置 capacityProviderStrategy,其中 FARGATE_SPOT 权重为 70,FARGATE 权重为 30。
选项 2:使用 Spot 的 EC2 Auto Scaling -- 使用 MixedInstancesPolicy,并设置 OnDemandBaseCapacity: 2、OnDemandPercentageAboveBaseCapacity: 30、SpotAllocationStrategy: capacity-optimized,以及多个实例类型覆盖项(m5.large、m5a.large、m5n.large)。
选项 3:EC2 Spot Fleet -- aws ec2 request-spot-fleet --spot-fleet-request-config file://spot-fleet.json
步骤 4:实现中断处理 -- 轮询 /latest/meta-data/spot/instance-action 处的实例元数据,以获取 2 分钟终止通知。收到通知后:正常关闭、保存状态、排空连接并退出。
参考:参阅 references/best_practices.md → 计算优化 → Spot 实例
快速参考
直接使用 AWS CLI 命令 -- Claude Code 可以运行 aws ce、aws ec2、aws cloudwatch 和 aws compute-optimizer 命令来执行成本分析。
月度审查命令:
aws ec2 describe-volumes --filters Name=status,Values=available(未使用的卷)aws ce get-cost-and-usage --granularity DAILY --metrics BlendedCost(成本趋势)aws compute-optimizer get-ec2-instance-recommendations(调整实例规格)
季度优化命令:
aws ce get-reservation-purchase-recommendation --service EC2(RI 分析)- 使用实例类型筛选条件运行
aws ec2 describe-instances(旧代实例) aws ec2 describe-spot-price-history(Spot 定价)
根据需要,为任何 AWS CLI 命令添加 --region REGION 和 --profile PROFILE。
特定服务优化
计算优化
关键操作:
- 迁移到 Graviton(节省 20%)
- 在容错型工作负载中使用 Spot(节省 70%)
- 为稳定的工作负载购买 RI(节省 40-65%)
- 为规格过高的实例调整规格
参考:references/best_practices.md → 计算优化
存储优化
关键操作:
- 将 gp2 转换为 gp3(节省 20%)
- 实施 S3 生命周期策略(节省 50-95%)
- 删除旧快照
- 使用 S3 Intelligent-Tiering
参考:references/best_practices.md → 存储优化
网络优化
关键操作:
- 用 VPC 端点替换 NAT 网关(每个每月节省 $25-30)
- 使用 CloudFront 降低数据传输成本
- 尽可能将资源放在同一可用区
参考:references/best_practices.md → 网络优化
数据库优化
关键操作:
- 为 RDS 实例调整规格
- 使用 gp3 存储(比 gp2 便宜 20%)
- 对工作负载变化较大的场景评估 Aurora Serverless
- 购买 RDS 预留实例
参考:references/best_practices.md → 数据库优化
服务替代方案决策指南
需要帮助选择服务?
问题:“我应该使用 EC2、Lambda 还是 Fargate?”
答案:参阅 references/service_alternatives.md → 计算替代方案
问题:“我应该使用哪种 S3 存储类别?”
答案:参阅 references/service_alternatives.md → 存储替代方案
问题:“我应该使用 RDS 还是 Aurora?”
答案:参阅 references/service_alternatives.md → 数据库替代方案
问题:“NAT 网关、VPC 端点还是 NAT 实例?”
答案:参阅 references/service_alternatives.md → 网络替代方案
FinOps 治理与流程
分三个阶段逐步推行:(1)基础建设——启用 Cost Explorer,设置 Budgets,制定标签策略。(2)可见性——强制执行标签,运行 AWS CLI 成本分析命令,设置月度评审。(3)文化建设——将成本指标纳入工程 KPI、架构评审和优化冲刺。
完整指南:references/finops_governance.md
月度评审流程
第 1 周:数据收集
- 运行 AWS CLI 成本分析命令(参见工作流 1)
- 导出 Cost & Usage Reports
- 汇总调查结果
第 2 周:分析
- 识别趋势
- 寻找机会
- 确定行动优先级
第 3 周:团队评审
- 向工程团队汇报
- 讨论优化方案
- 分配行动事项
第 4 周:高管汇报
- 创建高管摘要
- 预测下一季度情况
- 汇报优化成果
模板:参见 assets/templates/monthly_cost_report.md
详细流程:参见 references/finops_governance.md → 月度评审流程
成本优化清单
快速见效项(优先处理)
- 删除未挂载的 EBS 卷
- 删除旧的 EBS 快照(超过 90 天)
- 释放未使用的 Elastic IP
- 将 gp2 卷转换为 gp3
- 停止/终止闲置的 EC2 实例
- 启用 S3 Intelligent-Tiering
- 设置 AWS Budgets 和提醒
中等工作量(本季度完成)
- 调整过度配置的实例规格
- 迁移到更新一代的实例
- 为稳定的工作负载购买 Reserved Instances
- 实施 S3 生命周期策略
- 在适用情况下,用 VPC Endpoints 替换 NAT Gateways
- 启用自动资源调度(开发/测试环境)
- 实施标签策略并强制执行
战略举措(持续进行)
- 迁移到 Graviton 实例
- 为可容错的工作负载使用 Spot
- 建立月度成本评审流程
- 设置按团队进行成本分摊
- 实施分摊计费/成本回报模式
- 建立 FinOps 文化与实践
成本问题故障排查
“我的账单突然增加了”
-
按服务查看每日成本明细:
aws ce get-cost-and-usage \ --time-period Start=$(date -u -v-30d +%Y-%m-%d),End=$(date -u +%Y-%m-%d) \ --granularity DAILY --metrics BlendedCost \ --group-by Type=DIMENSION,Key=SERVICE -
在 AWS Console 中查看 Cost Explorer,了解可视化明细
-
查看 CloudTrail 中的资源创建事件
-
检查是否发生 AutoScaling 事件
-
确认 Reserved Instances 均未到期
“我需要降低 X% 的成本”
按优化工作流执行:
- 运行上方工作流 1 中的发现命令(未使用资源、成本异常、规格调整)
- 计算潜在节省总额
- 按以下方式确定优先级:节省金额 ×(1 / 工作量)
- 优先处理快速见效项
- 实施战略性变更,以实现长期优化
“如何判断 Reserved Instances 是否合适?”
运行 RI 分析:
aws ce get-reservation-purchase-recommendation \
--service "Amazon Elastic Compute Cloud - Compute" \
--lookback-period-in-days SIXTY_DAYS --term-in-years ONE_YEAR --payment-option NO_UPFRONT
关注以下情况:
- 实例持续运行 60 天以上
- 不会发生变化的工作负载
- 节省超过 30%
“哪些资源可以安全删除?”
查找未使用的资源:
aws ec2 describe-volumes --filters Name=status,Values=available --output table
aws ec2 describe-addresses --query 'Addresses[?AssociationId==null]' --output table
aws ec2 describe-snapshots --owner-ids self \
--query 'Snapshots[?StartTime<=`2025-01-01`]' --output table
通常可以安全删除:
- 未挂载的 EBS 卷(核实后)
- 超过 90 天的快照(前提是在其他位置存在备份)
- 未使用的 Elastic IP(核实其未用于 DNS 后)
- 停止超过 30 天的 EC2 实例(确认已废弃后)
删除前务必向资源所有者确认!
更多资源
参考资料:references/best_practices.md | references/service_alternatives.md | references/finops_governance.md
模板:assets/templates/monthly_cost_report.md
CLI 工具:直接使用 AWS CLI 命令——Claude Code 可运行 aws ce、aws ec2、aws cloudwatch 和 aws compute-optimizer 命令执行成本分析。无需其他依赖。